下面由composer教程欄目給大家介紹用composer管理相依性,希望對需要的朋友有所幫助!
composer原本是Symfony這個PHP Framework中,設計來管理套件相依性的工具,因為簡單又好用,現在已經成為一個獨立的開放原始碼計畫。許多Framework以及程式庫,現在都可以使用composer來安裝管理。
其實在PHP上,很早就有這類的套件相依性管理工具,也就是PEAR。不過PEAR的設定過于繁復,也很難針對個別專案設定各自的相依性,所以現在Composer受到大眾的喜愛。
這個簡介只針對使用者,所以不會對于套件開發者需要知道的部份著墨。
* 安裝
如果是Windows的使用者,只需要下載安裝檔并且執行安裝:
https://getcomposer.org/Composer-Setup.exe
如果要手動安裝,可以參考官網的指引:
http://getcomposer.org/doc/00-intro.md#installation-windows
如果是UNIX Like系統的使用者,可以透過這樣的指令來安裝:(需要先安裝curl)
curl?-sS?https://getcomposer.org/installer?|?php
安裝程式會檢查PHP的設定,然后下載composer.phar到當前的目錄。要執行composer的話,可以執行
php?composer.phar
或是干脆把它改成執行檔
>mv?composer.phar?composer >chmod?+x?composer
然后執行./composer。
不過如果再不同的工作目錄中都需要的話,而且執行權限也沒問題,也可以直接把檔案復制到/usr/local/bin。
* 設定相依性
在專案中使用composer時,首先要產生一個composer.json檔,里面指定要使用的套件與版本。例如需要用phpmailer來寄信時,可以這樣指定:
{ "require":?{ "phpmailer/phpmailer":?"~5.2.7" } }
然后執行安裝:
eng-Hsu-Pingteki-MacBook-Air:2-1a?fillano$?composer?install Loading?composer?repositories?with?package?information Installing?dependencies?(including?require-dev) ??-?Installing?phpmailer/phpmailer?(v5.2.7) ????Downloading:?100%????????? Writing?lock?file Generating?autoload?files Feng-Hsu-Pingteki-MacBook-Air:2-1a?fillano$
這樣就安裝好了。看一看到底裝了什么:
Feng-Hsu-Pingteki-MacBook-Air:2-1a?fillano$?ls?-l total?16 -rw-r--r--??1?fillano??staff????66?10?11?18:15?composer.json -rw-r--r--??1?fillano??staff??2330?10?11?18:16?composer.lock drwxr-xr-x??5?fillano??staff???170?10?11?18:16?vendor
根據目錄中的檔案可以發現,本來只有composer.json檔案,安裝之后多了一個composer.lock檔案以及vendor目錄。先看一下composer.lock的內容:
Feng-Hsu-Pingteki-MacBook-Air:2-1a?fillano$?cat?composer.lock { ????"_readme":?[ ????????"This?file?locks?the?dependencies?of?your?project?to?a?known?state", ????????"Read?more?about?it?at?http://getcomposer.org/doc/01-basic-usage.md#composer-lock-the-lock-file" ????], ????"hash":?"065c23f92d5ae579cb91beff67f41196", ????"packages":?[ ????????{ ????????????"name":?"phpmailer/phpmailer", ????????????"version":?"v5.2.7", ????????????"source":?{ ????????????????"type":?"git", ????????????????"url":?"https://github.com/PHPMailer/PHPMailer.git", ????????????????"reference":?"8717a79565b2c0ed67f851d70e1949febdf3b226" ????????????}, ????????????"dist":?{ ????????????????"type":?"zip", ????????????????"url":?"https://api.github.com/repos/PHPMailer/PHPMailer/zipball/8717a79565b2c0ed67f851d70e1949febdf3b226", ????????????????"reference":?"8717a79565b2c0ed67f851d70e1949febdf3b226", ????????????????"shasum":?"" ????????????}, ????????????"require":?{ ????????????????"php":?">=5.0.0" ????????????}, ????????????"require-dev":?{ ????????????????"phpdocumentor/phpdocumentor":?"*", ????????????????"phpunit/phpunit":?"*" ????????????}, ????????????"type":?"library", ????????????"autoload":?{ ????????????????"classmap":?[ ????????????????????"class.phpmailer.php", ????????????????????"class.pop3.php", ????????????????????"class.smtp.php" ????????????????] ????????????}, ????????????"notification-url":?"https://packagist.org/downloads/", ????????????"license":?[ ????????????????"LGPL-2.1" ????????????], ????????????"authors":?[ ....下略
看起來是剛剛安裝套件的資訊。
再看一下vendor目錄有什么東西:
Feng-Hsu-Pingteki-MacBook-Air:2-1a?fillano$?tree?vendor vendor ├──?autoload.php ├──?composer │???├──?ClassLoader.php │???├──?autoload_classmap.php │???├──?autoload_namespaces.php │???├──?autoload_real.php │???└──?installed.json └──?phpmailer ????└──?phpmailer ????????├──?LICENSE ????????├──?PHPMailerAutoload.php ????????├──?README.md ????????├──?changelog.md ????????├──?class.phpmailer.php ????????├──?class.pop3.php ????????├──?class.smtp.php ????????├──?composer.json ????????├──?docs ????????│???├──?Callback_function_notes.txt ????????│???├──?DomainKeys_notes.txt ????????│???├──?Note_for_SMTP_debugging.txt ????????│???├──?extending.html ????????│???├──?faq.html ????????│???├──?generatedocs.sh ????????│???└──?pop3_article.txt ...下略
看起來除了phpmailer目錄安裝了phpmailer在里面之外,主要還有autoload.php檔案以及composer目錄。
原來要載入透過composer安裝的套件,需要先引用vendor/autoload.php檔案,然后就可以使用phpmailer。寫一個簡單的程式測試一下:
<?php require 'vendor/autoload.php'; $phpmailer = new PHPMailer;
執行以后沒有出錯,表示phpmailer可以正常載入…接下來就看一下這幾個檔案的用途。
* composer.json
對使用者來說,這個檔案主要是用來維護相依性。只要在檔案中的”require”屬性中加入一個物件,屬性名稱是套件名稱,值就是版本。套件名稱分成兩個部分,第一個部分是vendor,第二個部分才是實際套件名稱,使用””隔開。版本有幾種規則:
-
直接指定版號,例如2.7.3
-
指定主版號之后,使用”*”指定次版號,例如2.7.*表示版號大于等于2.7.0,小于2.8.0的版本
-
使用>、>=、!=、
-
使用”~”在版號前,表示下一個版號變動之前的版本。例如~2.7,表示版本大于等于2.7,小于3.0
-
在版號之后,還可以加上不同的stability flag,例如2.7.*@beta。可以使用的flag有:dev、alpha、beta、RC、stable
指定好版本后,執行composer install,就會根據指定的版本規則,安裝最新版本的套件。
實際上每個有composer.json檔案的目錄,也是一個套件的根目錄。不過如果是要做成給別人使用的套件,還需要加上許多設定,這些就不在討論范圍內了。
* composer.lock
在首次安裝套件完畢后,會產生這個檔案,里面記錄了所安裝套件的資訊。這個檔案的真正作用是:如果目錄中有這個檔案,執行安裝時,就不會去搜尋更新的版本,而是依照這個檔案中記錄的版本來安裝。這個設計很重要,因為新版的套件很有可能與目前使用的版本不相容,如果不是使用同樣版本,很難保證系統的穩定。過去在使用pear來管理套件時,如果不注意,就有可能發生升級導致的慘劇。
除此之外,只要把這個檔案加入版本管理,所有開發者目錄中也都會有這個檔案,所以大家使用的套件版本也都會是一致的,這樣可以減少開發時,使用套件版本不一導致的程式相容問題。
* vendor目錄
所有套件都會放置在這個目錄,并且依照
*?vendor/autoload.php
只要引用這個檔案,就可以載入套件中所有對外公開的類別。基本上每個套件都會定義自己的autoload規則,在安裝時,composer會把這些規則加入,這樣透過autoload.php就可以直接使用所有已安裝的類別。
=====
從這些地方可以看到,Composer這個套件管理工具,在設計上已經做了很周密的考量,只需要簡單指定要使用的套件及版本,一個指令就可以安裝完畢,引用一個膽案之后就能使用,這樣真的非常方便。所以目前幾乎所有的程式庫以及Framework,應該都逐漸在套用這個工具了。未來在開發PHP程式,恐怕最基本的工具也就是composer。