composer會成爲主流麼?

注意到composer是在最近學習一些github裏面的項目時,發現不少都有composer.json,原來這貨是爲了composer包依賴管理工做而活的。其實它在前幾年就出現了,只是那個時候PHP版本5.3之後的版本都慢慢興起來,也就是命名空間才被引用。那,這貨到底能幹嗎呢?簡單來講就是爲你引入一個別人寫好的功能包,而且爲你作好自動加載,你只須要用php標準命名空間來初始化實例就行。能夠看下中文的翻譯介紹php

要理解好composer須要瞭解其它一些輔助工具,逐一來介紹下。預裝好php環境,composer工具,這些得必須弄好的吧?java

1. composer 安裝

curl -sS http://getcomposer.org/installer| php -- --install-dir=/usr/local/php/bin
 cp /usr/local/php/bin/composer.phar /usr/bin/
 composer about # 驗證

2. composer.json

composer.json聲明瞭包依賴以及聲明元素標籤,關鍵的就是requirepython

{
     "require": {
         "php": ">=5.3",
         "huamanshu/xorm": "dev-master"
     }
 }

如你所見,require的對象將會映射包的名稱(huamanshu/xorm)和包的版本是dev-master。那,composer會拿huamanshu/xorm去哪獲得相應的包呢?laravel

3. packagist

依賴包名huamanshu/xorm會到https://packagist.org去獲取包。若是你是包的開發者,那你須要先註冊一個帳號,github亦如此,再提交你的包名到列表裏去。git

而packagist不是實際源碼存儲的地方,它只是自動同步github的項目https://github.com/meolu/xorm.gitgithub

4. github

開發者建立本身的項目,而後在setting裏面配置hooks,填寫packagist提供的name、token就能夠在提交的時候,自動同步到packagist。json

其中項目中composer.json跟上面用來引入包的composer.json不太同樣,主要在autoload,我範例使用的是PSR-4。composer

{
     "name": "huamanshu/xorm",
     "type": "library",
     "require": {
         "php": ">=5.3.0"
     },
     "autoload": {
         "psr-4": {
             "xorm\\":"src/xorm"
         }
     }
 }

5. PHP規範標準

最新的規範是有5個,簡稱PSRcurl

  • PSR-0 自動加載
  • PSR-1 基本代碼規範
  • PSR-2 代碼樣式
  • PSR-3 日誌接口
  • PSR-4 自動加載加強版

如今composer裏通常在使用PSR-0、PSR-4,後者是在13年末發佈的,但相對前者簡潔了不少,看個例子。工具

Composer使用PSR-0風格

vendor/
     vendor_name/
         package_name/
             src/
                 Vendor_Name/
                     Package_Name/
                         ClassName.php       # Vendor_Name\Package_Name\ClassName
             tests/
                 Vendor_Name/
                     Package_Name/
                         ClassNameTest.php   # Vendor_Name\Package_Name\ClassName

Composer使用PSR-4風格

vendor/
     vendor_name/
         package_name/
             src/
                 ClassName.php       # Vendor_Name\Package_Name\ClassName
             tests/
                 ClassNameTest.php   # Vendor_Name\Package_Name\ClassNameTest

6. 引入包

在開始新建的composer.json初始化下composer install就會生成如下目錄。

├── composer.json  
 ├── composer.lock  
 ├── test.php 
 └── vendor  
     ├── autoload.php  
     ├── composer  
     │   ├── autoload_classmap.php  
     │   ├── autoload_namespaces.php  
     │   ├── autoload_psr4.php  
     │   ├── autoload_real.php  
     │   ├── ClassLoader.php  
     │   └── installed.json  
     └── huamanshu  
         └── xorm  
             ├── composer.json  
             ├── README.md  
             └── src  
                 └── xorm  
                     └── Go.php

github項目xorm會加載到vendor下,而且生成自動加載文件autoload.php。這過程有點相似thrift,根據一個.thrift文件gen各類語言的接口。

7. 使用包

<?php
 require __DIR__ . '/vendor/autoload.php';
 $go = new xorm\Go();
 $go->where(); # class Go's function where

8. 工程意義

除了packagist包,composer 也有平臺的包,這些包是並非由 comoposer 安裝,它們是安裝在操做系統上的東西,composer 將它們做爲虛擬的包,以方便管理。它們包括:PHP 自己,PHP 的擴展,還有一些系統中的庫。composer show --platform便可看到。

composer提供這樣一個包依賴管理方式對於PHP這樣一個社區興盛的語言,會相似python、java同樣,有大量開發者提供了功能包,須要一個方便的機制來調用,版本更新切換、層級嵌套神馬的。文件拷貝、代碼複製粘貼的時代早已落伍,或許composer很快能一統江湖。不管是想作統計、日誌、ORM等等,composer倉庫裏找找,幾分鐘後,輪子都已經裝備完畢,就等點火啓動,爽不?

相關文章
相關標籤/搜索