手把手教你寫一個composer包
- 2019 年 12 月 19 日
- 筆記
什麼是composer
Composer 是一個命令行工具,它的作用就是幫我們的項目管理所依賴的開發包,屬於依賴包管理工具。
什麼是依賴包管理工具
由於程式屆的《開源運動》,我們可以在社區找到很多別人提供的工具,也可以向社區貢獻我們的程式碼。
在github還沒有興起的年代,我們是需要到工具的官網下載程式碼,比如jquery。然後放到我們自己的項目目錄里,再在我們的頁面中使用。
但是…當一個網站依賴的包越來越多,我們會發現這是一件非常麻煩的事情:
- 安裝新包,程式碼目錄管理等問題
- 升級依賴包,只能手動替換文件
- 安裝過程發現某個包需要依賴於另一個包,那我們又要開始安裝前面的包…
- …
哪怕是每個開源包都有自己的官網,也還是需要用戶去下載安裝。
即使是有一個類似github的大倉庫,可以存放所有的項目,實現一站下載。
但不同依賴包之間的關係也還是需要手動維持,包與包之間的關係有可能是相互依賴,也可能是衝突的。
比如A包需要的PHP版本是小於7的,而B包需要的PHP版本是大於等於7的,那麼你安裝下來就是有衝突的,可能你在使用之前都沒有注意環境的要求,直到遇到各種坑….
於是就有依賴包管理工具的誕生了,如前端使用的npm,java使用的maven,Android的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.phar /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 [宣言 <[email protected]>, 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": "[email protected]" } ], "minimum-stability": "dev" } Do you confirm generation [yes]?確認資訊,yes 回車 初始化完成
Do you confirm generation [yes]? yes Would you like to install dependencies now [yes]? yes
安裝完成,可以看到我們的目錄生成了如下結構。


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 SiamTest(); $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的自動載入文件然後再測試哦
我們開發的包,只是項目所有包的其中之一,還有很多其他包,所以目錄結構不一樣
