[转]PHP 依赖包管理 Composer 介绍

如果你使用 PHP,難免會聽到使用 RoR 開發的速度有多麼快。但一方面頭都洗下去了,你沒辦法說要換掉 PHP 就換掉;另一方面可能你也還蠻喜歡 PHP 的某些特質。那有沒有辦法提升 PHP 的開發速度呢?當然 RoR 開發速度快有很多原因,但我覺得其中一個主要的原因是 RoR 避免重造輪子。

在 PHP 裡面,一直缺乏比較好的 package manager,這代表 PHP develoepr 要嘛就是使用整套的 framework ,要嘛就是自己用自己定義的一套 library 。但最近 PHP 社群開始有一些變化,包括 PSR-0, PSR-1, PRS-2 等 coding standard 的制定、Symfony 2, Zend Framework 等 framework,也一直朝向將自己的 component 拆分出來獨立的 package (see Symfony Components), 讓你可以只使用你想要的 component,站在前人的肩膀進行更快速的開發。當你開始用 “組合現有的東西再加以變化” 的角度去開發,難免會遇到 A depends on B, B depends on C 的 dependency 問題。面對這樣的問題,Composer 絕對是一個值得你試試看的工具。

What is Composer

Composer 是一個 commend-line 的工具,可以幫你管理你的 php packages. 如果你用過 linux 上的 package management tool (e.g. apt-get, yum) , composer 做的差不多是一樣的事情,包括 dependency resolving, autoloading, etc. 如果你需要使用某一個 library, 你只要把需要的套件名稱寫在 composer.json (composer 預設會讀的設定檔),
composer install
就可以完成安裝。因為 dependencies 都被寫在 composer.json, 其他共同開發的 developers 也可以很容易地 setup 好一模一樣的開發環境。

Why not just use PEAR?

「PHP 原本不是就有一個叫做 PEAR 的 Packaage management system ?」,你說。但 PEAR 安裝預設是 for 整個 system, 也就是你在 project A 裝完之後,同一台機器上的其他 project 都可以使用。這聽起來很方便,但若你想把這個 package 跟其他人一起開發,或是把它 release 出去當做一個 share library, 明確地定義這個 library 所 depends 的 library 通常是比較好的方式,而這也是 composer 當初被設計出來的原因。

Composer 用法

Composer 的主要 idea 是要 developers 把這個 project 需要用到的 dependencies 通通宣告在同一個檔案 (composer.json)。用 Ruby 來比喻的話,Composer 就像是 Ruby 的 bundler, composer.json 就像是 Bundler 所使用的 Gemfile

下面是一個簡單的重點整理,詳細的使用方法可以再參考 Composer Documentaion

composer.json

你需要宣告一個 composer.json,用來告訴 Composer 這個 project 的 dependencies

composer.lock

每次你執行 composer install, composer update 的時候,composer 會產生一個 “composer.lock” 的檔案,將目前的使用的 package 版本資訊存在裡面。你可以把這個檔案加到你的版本控制,以確保每個共同開發的 developers 拿到的是相同版本的 packages

Packagist

Composer 預設是使用 Packagist 來取得 package, 但你也可以在公司內部架設 private composer repository (請參考 Host your own repositories)

using github or other version control system

composer.json 裡面除了設定 depending packages,也可以宣告 repository 的來源,例如使用 svn, git, hg, 等 version control system 來當做 package 來源, 如果要使用的 lib 尚未 support composer install,你甚至可以直接指定一個檔案當做 repository 的來源

{
    "repositories": [
        {
            "type": "package",
            "package": {
                "name": "vrana/notorm",
                "version": "20111010",
                "dist": {
                    "url": "http://www.notorm.com/static/NotORM.zip",
                    "type": "zip"
                },
                "autoload": {
                    "psr-0": {
                        "NotORM_": "NotORM"
                    },
                    "files": ["NotORM.php"]
                }
            }
        }
    ],
    "require": {
        "slim/slim": "2.*",
        "vrana/notorm": "20111010"
    }
}

Autoload

Composer 預設 support PHP PSR-0 standard,install package 完你只需要
require 'vendor/autoload.php';
就可以開始使用該 package
若要使用的 package 沒有 follow PSR-0 standard,你也可以再自己設定 autoload 的規則(請參考 Composer autoload setting)

Publish your own Package

how to publish 自己的 package

你只要在你開發的 package 加上 composer.json ,例如:

{
    "name": "your-vendor-name/package-name",
    "require": {
        "php": ">=5.3.0",
        "another-vendor/package": "1.*"
    }
}

把這個 packcage 放到 github 或其他 code repository, 再到 packagist 上 submit 就可以了.
詳細的說明可參考 Packagist – How to submit packages

how to use create-project for creating my own template

Composer 有一個 create-project 的指令,可以讓你把一個 package 以及其 dependency 一起 checkout 下來。你可以用這個功能來打包你平常開發的 packages 製作成一個 template, 當要開始新的 project 的時候,就可以從這個 template 開始開發的工作。

例如如果我常常用到 symfony/console, symfony/routing 這兩個 components,我可以把它們加到 composer.json

{
    "name": "brooky/my-sample-php-project",
    "description": "My sample php project",
    "autoload": {
        "psr-0": { "": "src/" }
    },
    "require": {
        "php": ">=5.3.3",
        "symfony/console": ">=2.1.0",
        "symfony/routing": ">=2.1.0"
    },
    "config": {
        "bin-dir": "bin",
        "vendor-dir": "lib/vendor"
    },
    "minimum-stability": "dev"
}

放到 github 上submit 到 packagist
之後我以後就可以使用
composer create-project brooky/my-sample-php-project
開始我的新 project 囉~

Summary

這篇文章介紹了如何使用 Compsoer 來做 PHP package mangement, 包括宣告 dependency, install, update 等等。文中同時說明如何 publish 自己的 package 跟其他人分享,以及如何使用 compsoer create-project 來初始化你自己定義的 project template,以加快開發的速度。

經過幾天的試用,我覺得唯一的缺點是 packagist 上面目前沒有比較好的方法找到比較 popular 的 packages. 如果能像 Github 有一個 “trending repos” 或是 “featured repos” 我覺得會更加方便。不過整體而言,Composer + Packagist 仍然是一個值得一試的好用工具。

文章分类 经验分享

发表评论


Warning: Use of undefined constant XML - assumed 'XML' (this will throw an Error in a future version of PHP) in /var/www/wp/code/wp-content/plugins/wp-syntaxhighlighter/wp-syntaxhighlighter.php on line 1048