当前位置:   article > 正文

如何創建一個自己的 Composer/Packagist 包 (PHP)

在packagist上找到包侯如何加到自己的项目

如何創建一個自己的 Composer/Packagist 包

首先讓我們踏着歡快的腳步去Github創建一個新庫,這裏取名 composer-car,又歡快的將它克隆到本地:

  1. git clone http://go.rritw.com/github.com/GeHou/composer-car.git
  2. cd composer-car

這個composer-car文件夾就是你的包的root目錄了,你只需要記住composer.json在包的哪個目錄下面,一般那就是包的root目錄了。什麼?做包子的工作台?這麼理解呢也是可以的,不過同學能先收收你的口水麼。

現在我們還沒有composer.json文件,你可以根據composer文檔生成並編輯它,當然composer貼心的为我們准備了命令行,look:

  1. -> composer init
  2. Welcome to the Composer config generator
  3. This command will guide you through creating your composer.json config.
  4. Package name (<vendor>/<name>) [hou/composer-car]: 這裏填寫<包提供者>/<包名>的信息
  5. Description []: 包的描述
  6. Author [GeHou <***@gmail.com>]: 作者信息
  7. Minimum Stability []: 最低穩定版本
  8. License []: 授權協議
  9. Define your dependencies.
  10. Would you like to define your dependencies (require) interactively [yes]? no
  11. Would you like to define your dev dependencies (require-dev) interactively [yes]? no
  12. {
  13. "name": "hou/composer-car",
  14. "description": "In order to study composer",
  15. "license": "MIT",
  16. "authors": [
  17. {
  18. "name": "GeHou",
  19. "email": "***@gmail.com"
  20. }
  21. ],
  22. "minimum-stability": "dev",
  23. "require": {
  24. }
  25. }
  26. Do you confirm generation [yes]? yes
  27. Would you like the vendor directory added to your .gitignore [yes]? yes

雖然經過以上的一番掙紮生成了composer.json文件,不過我們還得往裏面加點東西。使用你熟悉的編輯器打開composer.json文件修改至如下:

  1. {
  2. "name": "hou/composer-car",
  3. "description": "In order to study composer",
  4. "license": "MIT",
  5. "authors": [
  6. {
  7. "name": "GeHou",
  8. "email": "***@gmail.com"
  9. }
  10. ],
  11. "minimum-stability": "dev”,
  12. "require": {
  13. "php": ">=5.3.0"
  14. },
  15. "autoload": {
  16. "Ford\\Escape\\": "src/Ford/Escape",
  17. "Ford\\Fusion\\": "src/Ford/Fusion",
  18. "Ford\\Focus\\": "src/Ford/Focus",
  19. "Ford\\Fiesta\\": "src/Ford/Fiesta"
  20. }
  21. }
  22. }

細心的小夥伴可能已經認出了福特的商標(Ford),這說明我們都是同道中人,你一定也很喜歡汽車,對吧對吧? :-)

我們登陆一下福特的網站看看都有哪些熱銷車型,嗯嗯分別有ESCAPE、FUSION、FOCUS、FIESTA,中文名稱分別是翼虎、蒙迪歐、福克斯、嘉年華,嘉年華ST我的夢想啊~~~ 好了好了,那位看官放下你手裏的板磚,我承認一說到汽車就會滔滔不絕,下面我們把水分擠出去繼續講解。

根據上面的命名空間和目錄的映射關系,包的結構現在應該是下面這個样子:

  1. composer-car
  2. - src
  3. - - Ford
  4. - - - Escape
  5. - - - - Escape2013.php
  6. - - - Fiesta
  7. - - - - Fiesta2013.php
  8. - - - Focus
  9. - - - - Focus2013.php
  10. - - - Fusion
  11. - - - - Fusion2013.php
  12. - .gitignore
  13. - composer.json
  14. - README.md

Escape2013.php:

  1. <?php
  2. namespace Ford\Escape;
  3. class Escape2013
  4. {
  5. public static function info()
  6. {
  7. echo "This is Ford Escape2013!<br />";
  8. }
  9. }

Fiesta2013.php:

  1. <?php
  2. namespace Ford\Fiesta;
  3. class Fiesta2013
  4. {
  5. public static function info()
  6. {
  7. echo "This is Ford Fiesta2013!<br />";
  8. }
  9. }

Focus2013.php:

  1. <?php
  2. namespace Ford\Focus;
  3. class Focus2013
  4. {
  5. public static function info()
  6. {
  7. echo "This is Ford Focus2013!<br />";
  8. }
  9. }

Fusion2013.php:

  1. <?php
  2. namespace Ford\Fusion;
  3. class Fusion2013
  4. {
  5. public static function info()
  6. {
  7. echo "This is Ford Fusion2013!<br />";
  8. }
  9. }

以上都梳理完畢後,需要安裝composer來測試我們的包是否可以正常工作,安裝它很簡單在包的root目錄下install即可:

composer install

閃過幾行神秘的提示之後即安裝完畢,此時會在vendor/composer/autoload_psr4.php中生成命名空間和目錄的映射關系,被包在一個數組中:

  1. <?php
  2. // autoload_psr4.php @generated by Composer
  3. $vendorDir = dirname(dirname(__FILE__));
  4. $baseDir = dirname($vendorDir);
  5. return array(
  6. 'Ford\\Fusion\\' => array($baseDir . '/src/Ford/Fusion'),
  7. 'Ford\\Focus\\' => array($baseDir . '/src/Ford/Focus'),
  8. 'Ford\\Fiesta\\' => array($baseDir . '/src/Ford/Fiesta'),
  9. 'Ford\\Escape\\' => array($baseDir . '/src/Ford/Escape'),
  10. );

如果發布成packagist包然後進行安裝的話,到時候這裏就不是$baseDir了而是$vendorDir。

然後我們新建一個測試文件show.php,用以下內容填充它:

  1. <?php
  2. require 'vendor/autoload.php';
  3. use Ford\Escape as Escape;
  4. use Ford\Fiesta as Fiesta;
  5. use Ford\Focus as Focus;
  6. use Ford\Fusion as Fusion;
  7. echo Escape\Escape2013::info();
  8. echo Fiesta\Fiesta2013::info();
  9. echo Focus\Focus2013::info();
  10. echo Fusion\Fusion2013::info();

打開瀏覽器敲入 http://foo.com/composer-car/show.php (foo.com是我的本地測試域名,請替換成小夥伴自己的)。

瀏覽器上依次輸出了:

  1. This is Ford Escape2013!
  2. This is Ford Fiesta2013!
  3. This is Ford Focus2013!
  4. This is Ford Fusion2013!

是不是有點小激動呢?別急,別一副作鳥獸散的样子,還有發布的流程呢?不過你要是真的急着wc或者覺得教程too simple,侯哥是不會讓你捡肥皂的。

首先作为調試代碼的部分我們是不需要push到github上的,所以將show.php打入冷宮,編輯.gitignore文件,在末尾加入show.php。這個時候有些小夥伴可能會疑惑了,为什麼上面還有個/vendor/,記得我們init包的時候回答過一個問題麼?

Would you like the vendor directory added to your .gitignore [yes]? yes

嗯嗯,你懂了吧?

廢話少說,經過職業玩家的一番噼裏啪啦的敲擊之後,代碼被push到github上了,噼裏啪啦的內容如下:

  1. $ git status
  2. # On branch master
  3. # Untracked files:
  4. # (use "git add <file>..." to include in what will be committed)
  5. #
  6. # .gitignore
  7. # composer.json
  8. # src/
  9. nothing added to commit but untracked files present (use "git add" to track)
  10. $ git add .
  11. $ git commit -m "gogogo"
  12. $ git push

接下來需要將github上的代碼同步到http://go.rritw.com/packagist.org/上,去[Packagist的網站](http://go.rritw.com/packagist.org/](http://go.rritw.com/packagist.org/)注冊一個账號(Login with github是個不錯的選擇)。登錄,然後點擊的大大的綠色背景按鈕 Submit a Package,在 Repository URL (Git/Svn/Hg) 處輸入包在github上的地址,這裏就是:

http://go.rritw.com/github.com/GeHou/composer-car

now,點擊 Check,如果一切順利,會返回項目的名稱,確認後點擊 Submit 完成抓取操作。

默認情況下Packagist是不會自動更新你在github上commit的代碼的,在剛才導入的項目頁面中點擊 Force Update ,Packagist會抓取github上對應庫的內容進行更新,但這還不是自動化的,幸運的是我們可以在Github庫的設置中進行配置來消除手動更新的麻煩。

進入Github庫的 Settings 頁面,找到 Webhooks & Services 選項,點擊 Configure services 按鈕,在出現的列表中找到 Packagist,猛擊它!這裏需要填寫一些信息,在Packagist網站的profile頁面可以找到它們:

  • User : Packagist上的用戶名
  • Token : Packagist的授權令牌
  • Domain : http://packagist.org

補全後點擊 Update settings,如果列表中顯示綠剪頭就表示OK了。

真的OK了嗎?還是有點擔心?大不了我們再測試下嘛!

先跳出root目錄,在測試環境下新建一個文件夾:

  1. mkdir test-auto-update
  2. cd test-auto-update
  3. vim composer.json

這次我們不使用init命令,只往composer.json裏填充一些簡單內容:

  1. {
  2. "require": {
  3. "php": ">=5.3.0",
  4. "hou/composer-car": "dev-master"
  5. },
  6. "minimum-stability": "dev"
  7. }

然後:

composer install

安裝完後掃一眼test-auto-update/src/Ford/Fiesta目錄看下是否只有2013款的Fiesta,然後暫時就不需要理會此目錄下的內容了,讓我們回到composer-car目錄。

注:這時test-auto-update/vendor下面的hou/composer-car對應建立項目時的( / ) [hou/composer-car]。

聽說2014款的嘉年華出了,趕緊追加新的車款吧:

在 composer-car/src/Ford/Fiesta 目錄下新建文件Fiesta2014.php,填充它:

  1. <?php
  2. namespace Ford\Fiesta;
  3. class Fiesta2014
  4. {
  5. public static function info()
  6. {
  7. echo "This is Ford Fiesta2014!<br />";
  8. }
  9. }

修改show.php,在最後追加:

echo Fiesta\Fiesta2014::info();

訪問測試頁,看看是否出現了:

This is Ford Fiesta2014!

ok,再次提交代碼:

  1. git add .
  2. git commit -m "test auto update"
  3. git push

接着回到 test-auto-update 目錄,這次要換一個命令耍耍,因为install命令之後root目錄下會生成一個composer.lock文件,已經安裝過的依賴是不能通過install命令進行更新的,所以這次需要使用composer update命令,試試這個命令,看看會發生什麼:

  1. $ composer update
  2. Loading composer repositories with package information
  3. Updating dependencies (including require-dev)
  4. - Updating hou/composer-car dev-master (91bceb0 => 01550b4)
  5. Checking out 01550b4eeaa85513573ce7406ca7d46ee30c6978
  6. Writing lock file
  7. Generating autoload files

類似這样的神秘信息又在屏幕上一閃而過,實際上因为網络的緣故,有時候得閃好久~

不管怎麼閃,更新成功後你就應該在 test-auto-update/vendor/hou/composer-car/src/Ford/Fiesta/ 文件夾下中找到新的 Fiesta2014.php 文件了。不過這裏需要注意一點,有時候Packagist與Github之間的同步可能會出現延遲,這時不妨喝杯咖啡、找妹子聊會、扣扣鼻孔之類的噼裏啪啦一會再回來試試更新操作。

好吧我們在 test-auto-update 根目錄下新建一個 index.php 文件看看是否能跑起來,文件內容其實跟前面的show.php差不了多少:

  1. <?php
  2. require 'vendor/autoload.php';
  3. use Ford\Fiesta as Fiesta;
  4. echo Fiesta\Fiesta2014::info();

不錯的話,運行index.php文件後瀏覽器會輸出:

This is Ford Fiesta2014!

至此更新操作也被證實是OK了,同志趕緊自己動手試試吧。

参考資料

中文文檔 http://go.rritw.com/composer.golaravel.com/

PSR-4規範 http://go.rritw.com/github.com/php-fig/fig-standards/blob/master/proposed/psr-4-autoloader/psr-4-autoloader.md

本文示例

http://go.rritw.com/github.com/GeHou/composer-car

http://go.rritw.com/packagist.org/packages/hou/composer-car

转载于:https://www.cnblogs.com/zhepama/p/3932980.html

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号