思考
當你有一個好的idea,寫了一個自我感覺還不錯的工具或者組件,並迫不及待的想讓別人去試試的時候,你會怎麼做?
把代碼貼在博客 |
需要花時間複製粘貼,閱讀代碼 |
把代碼發佈在github |
還是需要花時間down\clone,不能直接組件化加載 |
把代碼發佈在composer ✔️ |
只需要知道是幹嘛的,組件化引入直接使用 |
或者你看到一個好的composer的類庫,爲什麼可以直接加載進來,它是怎樣被髮布出來供大家使用的呢?
介紹
Composer 是一個用於 PHP 依賴管理的工具。它實現了讓你聲明項目所依賴的庫,並幫你完成安裝 / 更新過程。
composer.json
最熟悉的文件,可以手寫也可以命令行生成,其中定義了我們當前項目的依賴項。json裏有很多配置項,下面我們用一個熟悉的包guzzlehttp來舉例說一下每個字段代表的意義。
{
"name": "guzzlehttp/guzzle",//composer 包名
"type": "library",//這是默認類型,它會簡單的將文件複製到vendor目錄
"description": "Guzzle is a PHP HTTP client library",//一個包的簡短描述。通常這個最長只有一行。
"keywords": ["framework", "http", "rest", "web service", "curl", "client", "HTTP client"],//在composer搜索用到
"homepage": "http://guzzlephp.org/",//項目主頁
"license": "MIT",//包的許可協議
"authors": [//作者
{
"name": "Michael Dowling",
"email": "[email protected]",
"homepage": "https://github.com/mtdowling"
}
],
"require": {//必要的依賴
"php": ">=5.5",
"guzzlehttp/psr7": "^1.4",
"guzzlehttp/promises": "^1.0"
},
"require-dev": {//開發版的依賴,一般幫助開發階段使用
"ext-curl": "*",//可以幫你指定需要的 PHP 擴展(包括核心擴展)例如在編輯器的自動提示功能
"phpunit/phpunit": "^4.8.35 || ^5.7 || ^6.4 || ^7.0",
"psr/log": "^1.0"
},
"autoload": {//自動加載映射
"files": ["src/functions_include.php"],//自動加載的函數庫文件 相當於直接require該文件,直接使用其中function 數組可配置多個
"psr-4": {
"GuzzleHttp\\": "src/"
}
},
"autoload-dev": {//一般將單元測試的路徑放在這裏
"psr-4": {
"GuzzleHttp\\Tests\\": "tests/"
}
},
"suggest": {//建議安裝的包
"psr/log": "Required for using the Log middleware"
},
"extra": {//可選項
"branch-alias": {
"dev-master": "6.3-dev"
}
},
"bin": [//composer安裝時會將script腳本文件複製到vendor/bin中 比如 php vendor/bin/script 執行一些組件的腳本功能
"bin/script"
]
}
Coding
下面我寫了一個最簡單的工具類,目錄如下
├── README.md
├── composer.json
└── src
├── Db.php
├── DbInterface.php
├── Test.php
└── function.php
代碼都在src目錄下,composer.json內容如下
{
"name": "ty_coder/composertest",
"description": "a test composer library ",
"authors": [
{
"name": "tyCoder"
}
],
"license": "MIT",
"require": {
"php": ">=5.4"
},
"autoload": {
"psr-4": {
"ty\\": "src/"
},
"files": [
"src/function.php"
]
}
}
然後發佈在github上,下一步我們將項目發佈在composer。
發佈
登陸composer倉庫,訪問https://packagist.org/packages/submit
composer倉庫會幫我們驗證項目是否滿足發佈條件,在我們完成發佈後,就可以通過composer require 在任何項目中加載我們編寫的工具類庫了。不過還有一個問題,我們想要更新我們的工具類庫,並保留之前的版本,我們該怎樣做?這些composer其實都爲我們準備了超級方便的鉤子設置方案了,請看下圖。
通過個人資料我們拿到自己的API token,然後去我們的github的倉庫頁,在設置裏找到Webhooks選項,設置一下鉤子即可,我們每次git事件都會同步給composer,每次的tag會在composer發佈一個版本,注意composer會忽略前綴,所以v這個字母被忽略了奧。
require
執行composer require ty_coder/composertest 後,我們的工具類庫被加載到vendor目錄下,讓我們簡單測試一下。
好的,我們發現編輯器已經提示我們,我們的類庫文件被找到啦,那麼本文在這裏對composer的一些常用知識的簡單介紹也告一段落了。
other
在閱讀源碼的過程中我們會發現,優良的composer類庫或者項目中還會有單元測試模塊tests目錄,二進制腳本目錄bin目錄,自動化部署文件.travis.yml文件,還有Dokerfile等等。所以composer中是可以有其他類型文件存在的,特定的文件還會觸發特定的功能事件,詳細的我們可以去官方文檔進一步學習奧。
reference
https://learnku.com/docs/composer/2018 Composer 中文文檔
https://packagist.org/ Composer官方庫
https://travis-ci.org/ Travis CI 持續集成服務
https://github.com/ziadoz/awesome-php#php-websites 收錄很多優秀Composer組件的好地方