教你用Composer管理相依性

下面由composer教程欄目給大家介紹用composer管理相依性,希望對(duì)需要的朋友有所幫助!

教你用Composer管理相依性

composer原本是Symfony這個(gè)PHP Framework中,設(shè)計(jì)來(lái)管理套件相依性的工具,因?yàn)楹?jiǎn)單又好用,現(xiàn)在已經(jīng)成為一個(gè)獨(dú)立的開(kāi)放原始碼計(jì)畫(huà)。許多Framework以及程式庫(kù),現(xiàn)在都可以使用composer來(lái)安裝管理。

其實(shí)在PHP上,很早就有這類的套件相依性管理工具,也就是PEAR。不過(guò)PEAR的設(shè)定過(guò)于繁復(fù),也很難針對(duì)個(gè)別專案設(shè)定各自的相依性,所以現(xiàn)在Composer受到大眾的喜愛(ài)。

這個(gè)簡(jiǎn)介只針對(duì)使用者,所以不會(huì)對(duì)于套件開(kāi)發(fā)者需要知道的部份著墨。

* 安裝

如果是Windows的使用者,只需要下載安裝檔并且執(zhí)行安裝:

https://getcomposer.org/Composer-Setup.exe

如果要手動(dòng)安裝,可以參考官網(wǎng)的指引:

http://getcomposer.org/doc/00-intro.md#installation-windows

如果是UNIX Like系統(tǒng)的使用者,可以透過(guò)這樣的指令來(lái)安裝:(需要先安裝curl)

curl?-sS?https://getcomposer.org/installer?|?php

安裝程式會(huì)檢查PHP的設(shè)定,然后下載composer.phar到當(dāng)前的目錄。要執(zhí)行composer的話,可以執(zhí)行

php?composer.phar

或是干脆把它改成執(zhí)行檔

>mv?composer.phar?composer >chmod?+x?composer

然后執(zhí)行./composer。

不過(guò)如果再不同的工作目錄中都需要的話,而且執(zhí)行權(quán)限也沒(méi)問(wèn)題,也可以直接把檔案復(fù)制到/usr/local/bin。

* 設(shè)定相依性

在專案中使用composer時(shí),首先要產(chǎn)生一個(gè)composer.json檔,里面指定要使用的套件與版本。例如需要用phpmailer來(lái)寄信時(shí),可以這樣指定:

{ "require":?{ "phpmailer/phpmailer":?"~5.2.7" } }

然后執(zhí)行安裝:

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

根據(jù)目錄中的檔案可以發(fā)現(xiàn),本來(lái)只有composer.json檔案,安裝之后多了一個(gè)composer.lock檔案以及vendor目錄。先看一下composer.lock的內(nèi)容:

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":?[ ....下略

看起來(lái)是剛剛安裝套件的資訊。

再看一下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 ...下略

看起來(lái)除了phpmailer目錄安裝了phpmailer在里面之外,主要還有autoload.php檔案以及composer目錄。

原來(lái)要載入透過(guò)composer安裝的套件,需要先引用vendor/autoload.php檔案,然后就可以使用phpmailer。寫(xiě)一個(gè)簡(jiǎn)單的程式測(cè)試一下:

<?php require &#39;vendor/autoload.php&#39;; $phpmailer = new PHPMailer;

執(zhí)行以后沒(méi)有出錯(cuò),表示phpmailer可以正常載入…接下來(lái)就看一下這幾個(gè)檔案的用途。

* composer.json

對(duì)使用者來(lái)說(shuō),這個(gè)檔案主要是用來(lái)維護(hù)相依性。只要在檔案中的”require”屬性中加入一個(gè)物件,屬性名稱是套件名稱,值就是版本。套件名稱分成兩個(gè)部分,第一個(gè)部分是vendor,第二個(gè)部分才是實(shí)際套件名稱,使用””隔開(kāi)。版本有幾種規(guī)則:

  • 直接指定版號(hào),例如2.7.3

  • 指定主版號(hào)之后,使用”*”指定次版號(hào),例如2.7.*表示版號(hào)大于等于2.7.0,小于2.8.0的版本

  • 使用>、>=、!=、

  • 使用”~”在版號(hào)前,表示下一個(gè)版號(hào)變動(dòng)之前的版本。例如~2.7,表示版本大于等于2.7,小于3.0

  • 在版號(hào)之后,還可以加上不同的stability flag,例如2.7.*@beta。可以使用的flag有:dev、alpha、beta、RC、stable

指定好版本后,執(zhí)行composer install,就會(huì)根據(jù)指定的版本規(guī)則,安裝最新版本的套件。

實(shí)際上每個(gè)有composer.json檔案的目錄,也是一個(gè)套件的根目錄。不過(guò)如果是要做成給別人使用的套件,還需要加上許多設(shè)定,這些就不在討論范圍內(nèi)了。

* composer.lock

在首次安裝套件完畢后,會(huì)產(chǎn)生這個(gè)檔案,里面記錄了所安裝套件的資訊。這個(gè)檔案的真正作用是:如果目錄中有這個(gè)檔案,執(zhí)行安裝時(shí),就不會(huì)去搜尋更新的版本,而是依照這個(gè)檔案中記錄的版本來(lái)安裝。這個(gè)設(shè)計(jì)很重要,因?yàn)樾掳娴奶准苡锌赡芘c目前使用的版本不相容,如果不是使用同樣版本,很難保證系統(tǒng)的穩(wěn)定。過(guò)去在使用pear來(lái)管理套件時(shí),如果不注意,就有可能發(fā)生升級(jí)導(dǎo)致的慘劇。

除此之外,只要把這個(gè)檔案加入版本管理,所有開(kāi)發(fā)者目錄中也都會(huì)有這個(gè)檔案,所以大家使用的套件版本也都會(huì)是一致的,這樣可以減少開(kāi)發(fā)時(shí),使用套件版本不一導(dǎo)致的程式相容問(wèn)題。

* vendor目錄

所有套件都會(huì)放置在這個(gè)目錄,并且依照/的目錄結(jié)構(gòu)來(lái)組織。

*?vendor/autoload.php

只要引用這個(gè)檔案,就可以載入套件中所有對(duì)外公開(kāi)的類別。基本上每個(gè)套件都會(huì)定義自己的autoload規(guī)則,在安裝時(shí),composer會(huì)把這些規(guī)則加入,這樣透過(guò)autoload.php就可以直接使用所有已安裝的類別。

=====

從這些地方可以看到,Composer這個(gè)套件管理工具,在設(shè)計(jì)上已經(jīng)做了很周密的考量,只需要簡(jiǎn)單指定要使用的套件及版本,一個(gè)指令就可以安裝完畢,引用一個(gè)膽案之后就能使用,這樣真的非常方便。所以目前幾乎所有的程式庫(kù)以及Framework,應(yīng)該都逐漸在套用這個(gè)工具了。未來(lái)在開(kāi)發(fā)PHP程式,恐怕最基本的工具也就是composer。

? 版權(quán)聲明
THE END
喜歡就支持一下吧
點(diǎn)贊9 分享