學習開發自己的 Composer 包,並使用 GitHub 實時更新到 Packagist
composer是什麼
Composer 不是一個包管理器。是的,它涉及 "packages" 和 "libraries",但它在每個專案的基礎上進行管理,在你專案的某個目錄中(例如 vendor)進行安裝。預設情況下它不會在全域性安裝任何東西。因此,這僅僅是一個依賴管理。
Composer 受到了 node's npm 和 ruby's bundler 的強烈啟發。而當時 PHP 下並沒有類似的工具。
composer可以做什麼
Composer 將這樣為你解決問題:
- 你有一個專案依賴於若干個庫。
- 其中一些庫依賴於其他庫。
- 你宣告你所依賴的東西。
- Composer 會找出哪個版本的包需要安裝,並安裝它們(將它們下載到你的專案中)。
系統學習composer的使用請移步 composer中文學習
開發自己的composer元件
要點:理解composer如何實現自動載入第三方元件; 理解
psr-0
和psr-4
的規範; 理解基於psr-0
,psr-4
,classmap
,files如何實現自動載入。 理解Composer和Packagist
關於安裝和使用composer
請參考composer中文學習
建立目錄名稱
mkdir try-make-package
cd try-make-package
這個try-make-package
資料夾就是你的包的根目錄了,你只需要記住composer.json在包的哪個目錄下面,一般那就是包的根目錄了。
現在我們還沒有composer.json檔案,下面我們來初始化
初始化擴充套件包
☁ composer init
Welcome to the Composer config generator
This command will guide you through creating your composer.json config.
Package name (<vendor>/<name>) [lingan/try-make-package]:
Description []: try make a package
Author [saboran <[email protected]>, n to skip]:
Minimum Stability []: dev
Package Type (e.g. library, project, metapackage, composer-plugin) []: library
License []: MIT
Define your dependencies.
Would you like to define your dependencies (require) interactively [yes]? n
Would you like to define your dev dependencies (require-dev) interactively [yes]? n
{
"name": "lingan/try-make-package",
"description": "try make a package",
"type": "library",
"license": "MIT",
"authors": [
{
"name": "saboran",
"email": " [email protected]"
}
],
"minimum-stability": "dev",
"require": {}
}
Do you confirm generation [yes]? yes
經過一番上面的掙扎在當前目錄就生成了composer.json
檔案,下面我們對這個檔案進行一些修改
修改composer.json
增加自動載入規範(名稱空間和目錄對映關係)和環境要求
{
"name": "lingan/try-make-package",
"description": "try make a package",
"type": "library",
"license": "MIT",
"authors": [
{
"name": "saboran",
"email": "[email protected]"
}
],
"minimum-stability": "dev",
"require": {
"php": ">=7.0"
},
"autoload": {
"psr-4": {
"Flower\\Rose\\": "src/Flower/Rose",
"Flower\\Lily\\": "src/Flower/Lily"
}
}
}
建立類檔案
根據上面的名稱空間和目錄的對映關係,建立對應目錄和檔案,如下圖
對應檔案內容
<?php
/**
* Created by PhpStorm.
* User: Lingan
* Date: 2017/11/6
* Time: 21:39
*/
namespace Flower\Rose;
class Rose
{
public function desc()
{
echo "this is rose flower";
}
}
<?php
/**
* Created by PhpStorm.
* User: Lingan
* Date: 2017/11/6
* Time: 21:38
*/
namespace Flower\Lily;
class Lily
{
public function desc()
{
echo "this is lily flower";
}
}
測試安裝
以上程式碼都梳理完畢後,需要
composer install
來測試我們的包是否可以正常工作此時會在vendor/composer/autoload_psr4.php
中生成名稱空間和目錄的對映關係,被包在一個數組中:
<?php
// autoload_psr4.php @generated by Composer
$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);
return array(
'Flower\\Rose\\' => array($baseDir . '/src/Flower/Rose'),
'Flower\\Lily\\' => array($baseDir . '/src/Flower/Lily'),
);
增加.gitignore
為git忽略一些檔案,增加readme.md為專案增加描述
.idea
vendor/
composer.lock
提交程式碼到github
現在自己的Github主頁上建立一個新的倉庫然後將專案提交到對應倉庫,參考如下
git init
git add -A
git commit -am "init && dev package"
git remote add origin [email protected]:linganmin/try-make-package.git
git push -u origin master
將自己的專案地址貼上
點選check,然後點選submit,至此,自己的composer包就提交成功了,
測試使用自己開發的包擴充套件[2017.11.07更新]
- 建立測試目錄
mkdir test-my-package cd test-my-package
- 安裝自己的擴充套件
composer require lingan/try-make-package dev-master ./composer.json has been updated Loading composer repositories with package information Updating dependencies (including require-dev) Package operations: 1 install, 0 updates, 0 removals - Installing lingan/try-make-package (dev-master d7b9f94): Cloning d7b9f941b0 from cache Writing lock file Generating autoload files
-
安裝完成的目錄如下圖
- 檢視
autoload_psr4.php
<?php
// autoload_psr4.php @generated by Composer
$vendorDir = dirname(dirname(__FILE__));
$baseDir = dirname($vendorDir);
return array(
'Flower\\Rose\\' => array($vendorDir . '/lingan/try-make-package/src/Flower/Rose'),
'Flower\\Lily\\' => array($vendorDir . '/lingan/try-make-package/src/Flower/Lily'),
);
- 新建首頁入口檔案
index.php
,開始測試自己寫的包
<?php
/**
* Created by PhpStorm.
* User: Lingan
* Date: 2017/11/7
* Time: 11:04
*/
require_once './vendor/autoload.php'; // 載入自動載入檔案
use Flower\Rose\Rose;
use Flower\Lily\Lily;
$rose = new Rose();
$lily = new Lily();
echo $rose->desc();
echo "\n";
echo $lily->desc();
- 執行
php index.php
this is rose flower
this is lily flower%
*** 至此說明我們自己開發的擴充套件包可以正常使用
設定Packagist上自動更新擴充套件包,即當我們更新擴充套件包提交到GitHub時,Packagist自動更新
在沒有設定自動更新時,Packagist上包詳情頁會有這樣一個提示
This package is not auto-updated. Please set up the GitHub Service Hook for Packagist so that it gets updated whenever you push!(這個軟體包不是自動更新的。請為Packagist 設定GitHub服務鉤,以便在您推送時更新!)
詳細設定自動更新軟體包的文件地址
簡化步驟如下:
- 去個人中心頁面拿到自己的api令牌
- 去當前包在GitHub的地址,點選
設定
,點選整合和服務
,點選新增Packagist
服務並配置你的API令牌,以及你的Packagist使用者名稱和賬號對應域名 - 選擇
active
,點選add service
- 設定自動更新結束,之後你更改了自己包擴充套件的程式碼提交到GitHub後,很短的時間差就會同步到Packagist
結束語
作為一枚渣渣,發現自己的不足,嘗試接觸更多新技術和工具,以上文字若有錯誤歡迎指正
Happy Coding
參考文獻: