# composer包制作教程
## 什么是composer
`Composer`?是一個命令行工具,它的作用就是幫我們的項目`管理所依賴的開發包`,屬于`依賴包管理工具`。
## 什么是依賴包管理工具
由于程序屆的《開源運動》,我們可以在社區找到很多別人提供的工具,也可以向社區貢獻我們的代碼。
在github還沒有興起的年代,我們是需要到工具的官網下載代碼,比如jquery。然后放到我們自己的項目目錄里,再在我們的頁面中使用。
但是…當一個網站依賴的包越來越多,我們會發現這是一件非常麻煩的事情:
* 安裝新包,代碼目錄管理等問題
* 升級依賴包,只能手動替換文件
* 安裝過程發現某個包需要依賴于另一個包,那我們又要開始安裝前面的包…
* …
哪怕是每個開源包都有自己的官網,也還是需要用戶去下載安裝。
即使是有一個類似`github`的大倉庫,可以存放所有的項目,實現一站下載。
但不同依賴包之間的關系也還是需要手動維持,包與包之間的關系有可能是相互依賴,也可能是沖突的。
```
> 比如A包需要的PHP版本是小于7的,而B包需要的PHP版本是大于等于7的,那么你安裝下來就是有沖突的,可能你在使用之前都沒有注意環境的要求,直到遇到各種坑….
```
于是就有`依賴包管理工具`的誕生了,如前端使用的`npm`,java使用的`maven`,安卓的`Gradle`等等。在PHP中我們使用的工具叫`Composer`。
當我們需要加載一個新包的時候,我們只需要一條命令,工具就會自動構建安裝,并且在安裝之前如果檢測到環境或者需要依賴其他包,管理工具也會做出相應的處理,比如提示終止、自動安裝依賴包。
當我們需要更新包的時候,我們也只需要一條命令,就可以實現工具包的升級,在這過程也依然會檢測新版本包需要的環境和依賴等。
所以說,`依賴包管理工具`?為我們在管理依賴包的工作上帶來了極大的便利。
## 安裝Composer
首先我們需要把composer下載到本地,并且執行安裝。在這過程中會檢測php的的參數設置,如果某些參數未正確設置則會給出警告。
分別運行以下三條命令
```
php -r "copy('https://install.phpcomposer.com/installer', 'composer-setup.php');"
php composer-setup.php
php -r "unlink('composer-setup.php');"
```
局部使用
如果是局部使用,我們到這里就可以了,只需要把下載安裝下來的`composer.phar`復制到你的項目根目錄,并且執行`php composer.phar`就可以看到提示的內容啦~
全局安裝
如果想要在任意的項目目錄都可以執行使用的話,我們需要把composer包設置一個系統環境變量。
Mac或者linux
把安裝包移動到`/usr/local/bin/`目錄
```
sudo mv composer.pha /usr/local/bin/composer
```
windows
* 首先確保你的php已經在環境變量中(也就是在任意目錄打開cmd都可以執行php命令)
* 把composer.phar復制到以上說的php目錄中,跟`php.exe`同個級別
* 新建一個`composer.bat`文件,寫以下內容并保存,該文件提供composer命令入口。
```
php "%~dp0composer.phar" %*
```
然后就可以在項目目錄里打開cmd 并執行`composer --version`檢測看看安裝是否成功了!
## 寫一個屬于自己的composer包
前面我們已經介紹了依賴包管理工具的便利,許許多多的先輩在開源工具的時候往往都會上傳到`github`或者制作成`composer包`。
```
> 如果傳到github,可以解決下載問題,但是與其他包的依賴關系卻得不到自動處理,一般用于開源整個項目。
```
```
> composer包則適合在需要與其他依賴包配合的情況下使用。
```
那么我們下面就來寫一個自己的composer包吧,
首先我們創建一個空的目錄,并且運行以下命令初始化一個空白的composer包
```
composer init
```
可以在命令窗口看到有返回提示;
需要輸入包名
```
`This?command?will?guide?you?through?creating?your?composer.json?config.``
`Package?name?(<vendor>/<name>)?:`
```
我這里寫的是`yancoo.cn/test`,回車
需要輸入描述
```
Description?\[\]:
```
包的描述內容
需要輸入作者
```
Author?[宣言?,?n?to?skip]:
```
該選項如果有默認值 可以直接回車
需要輸入最低穩定版本
```
Minimum?Stability?[]:
```
該選項有可選值:stable, RC, beta, alpha, dev 一般填dev
需要輸入包類型
```
Package?Type?(e.g.?library,?project,?metapackage,?composer-plugin)?\[\]:
```
可選項在提示中已經有了,我們一般選`library`填`l`即可
需要輸入開源協議
```
License?[]:
```
根據自己情況填寫,我們填`Apache`
設置包需要依賴的其他環境或者包
```
Define?your?dependencies.
Would?you?like?to?define?your?dependencies?(require)?interactively?[yes]?
```
如果需要設置依賴環境或者其他包 則輸入yes回車,會讓你搜索,我們這里給包設置php版本必須大于5.6,所以搜索php。
```
Enter?the?version?constraint?to?require(or leave?blank?to?use the?latest?version):
```
輸入最低要求版本號 >=5.6.0

如果需要設置多個環境要求,則重復搜索填寫即可,如果不需要了,則在`Search for a package:`不填寫內容,直接`回車`即可
接下來設置依賴包
```
Would?you?like?to?define?your?dev?dependencies?(require-dev)?interactively?[yes]?
```
我們不需要 直接回車回車。
```
{
"name": "yancoo.cn/test",
"description": "This is a test package,form yancoo.cn,author is siam.",
"type": "l",
"require": {
"php": ">=5.6.0"
},
"license": "Apache",
"authors": [
{
"name": "宣言",
"email": "59419979@qq.com"
}
],
"minimum-stability": "dev"
}
Do you confirm generation [yes]?
```
確認信息,yes 回車 初始化完成
```
Do you confirm generation [yes]? yes
Would you like to install dependencies now [yes]? yes
```
安裝完成,可以看到我們的目錄生成了如下結構。
[](http://www.yancoo.cn/index/article/show/id/65.html#)
> `vendor`是composer存放包的地址,所有的包都存放在該路徑中統一管理,并且composer提供了命名空間自動加載的功能,我們在使用過程中只需要引入composer的統一入口文件即可
```
require "vendor/autoload.php";
```
但是我們也需要在包的配置文件中寫上需要自動加載哪個目錄才有效哈!
編輯composer.json文件

這里的路徑需要根據你自己的來定,也可以參考以上寫法即可。
寫完之后需要運行一下命令行`composer dump-autoload`更新composer的命名空間與文件夾映射關系。
```
> 上一步驟非常重要 漏了就不正常執行了。
```
然后我們創建`src`文件夾,再創建`siam`文件夾,在里面創建`Test.php`文件
寫上命名空間 Siam; 根據psr-4規范,類名要與文件名相同。
```
<?php
//Test.php文件
namespace Siam;
class Test
{
function test()
{
echo "Form Test -> test()";
}
}
```
再在最外層寫下index.php測試文件,正確做法是創建demo文件夾 然后再寫測試文件。
```
<?php
require "vendor/autoload.php";
$Test = new Siam\Test();
$Test->test();
```
于是我們現在的文件目錄結構如下,運行index.php正確得到內容`Form Test -> test()`

可以根據你自己的想法來寫類,只需要注意命名空間的層級與文件夾層級相同,類名與文件名相同即可自動加載。
## 上傳composer包
我們需要把包上傳到倉庫中,別人才可以通過composer命令安裝
我們需要先把包上傳到github中,再把github倉庫地址復制到composer官方倉庫提交,composer就會自動拉取你的包并且提供給別人下載安裝了!
?
### 首先在github上創建倉庫


?
### 在你本地電腦上運行命令,將我們剛剛創建的示例包文件與github倉庫關聯起來,并推送上去。
### 推送成功之后,復制倉庫的地址到composer官方提交。

### composer的官方倉庫是`https://packagist.org/`
我們打開,并且注冊一個賬號。然后點擊右上角的submit。把地址填寫進去即可。

到這里,我們的github倉庫與packagist已經建立了關聯,但是這個使用還是用不了的,因為我們還沒有發布正式版本!
需要在git上打標簽,才認為我們發布了一個新的版本,packagist才會去拉取并且提供給別人安裝。
git打標簽需要運行以下命令
```
git tag -a v1.0.1 -m "第一個版本"
git push origin v1.0.1
```
然后就在線上倉庫打標簽成功了,此時運行composer安裝也正常了
在新的一個空白目錄中運行
```
composer require yancoo.cn/test 是我們初始化填寫的包名!
```
因為我們在開發composer包的目錄,跟在實際項目中安裝后的有一些不一樣。 所以記得自己新建測試文件,載入composer的自動加載文件然后再測試哦
```
> 我們開發的包,只是項目所有包的其中之一,還有很多其他包,所以目錄結構不一樣
```
**本文原文鏈接 Siam博客?**[**http://www.yancoo.cn/index/article/show/id/65.html#**](http://www.yancoo.cn/index/article/show/id/65.html#)
- composer教程文檔
- Composer 的常用命令
- 鏡像操作
- 教程收集
- composer命令
- 全局選項
- init命令
- 安裝命令
- update命令
- require命令
- remove命令
- check-platform-reqs
- globa命令
- search命令
- show命令
- outdated命令
- Options命令
- browse / home命令
- suggests命令
- depends (why)命令
- prohibits (why-not)命令
- validate驗證命令
- status狀態命令
- self-update (selfupdate)
- config命令
- create-project命令
- dump-autoload (dumpautoload)
- clear-cache (clearcache)
- licenses命令
- run-script命令
- exec命令
- diagnose命令
- archive命令
- help命令
- 環境變量
- composer.json說明
- composer.json示例1
- 自制composer包
- 制作步驟1、生成composer包
- 制作步驟2:生成目錄結構
- 制作步驟3:完善程序
- 制作步驟4:上傳程序包
- 示例:手把手教你發布自己的 Composer 包
- 示例:一步一步創建自己的composer包
- 實例2
- 鏡像與常用包
- 中國鏡像
- 常用包收集
- composer包的使用
- 包的使用
- 本地自定義文件的使用