本文首發於 Travis CI 持續整合服務構建 Composer 類庫簡明教程,轉載請註明出處!
在專案開發過程中,編碼工作只是軟體開發整個過程中的一小部分環節,更多的我們需要去構建和測試我們的專案,以確保專案的健壯和穩定性。
這篇文章將帶領大家學習如何使用 Travis CI 持續整合服務和 Composer 中國 包管理工具,來構建一個持續整合的 PHP 類庫。
前期準備
進入正題之前,需要大家對以下幾個工具已經有了初步的瞭解和使用經驗:
- Git: Git 是分散式版本控制系統;
- Composer:Composer 是 PHP 專案的依賴管理工具,用於管理專案中的 packagies 和 libraries;
- GitHub:是一個用於使用 Git 版本控制系統專案的共享虛擬主機服務,可以免費託管公開的原始碼倉庫。
- Packagist:主要提供 Composer 包釋出和索引,預設 Composer 從 Packagist 獲取資源。
如果沒有的話,最好還是先了解一下如何使用它們,下面讓我們簡單介紹一下建立相關服務賬號的方法。
建立 Github 帳號
GitHub 是一個用於使用 Git 版本控制系統專案的共享虛擬主機服務,可以免費託管公開的原始碼倉庫。
本教程的基礎就是基於 Git 和 GitHub 服務,所以需要我們建立 GitHub 帳號,並且 GitHub 官方提供 Packagist、Travis CI 的鉤子服務。
當我們將本地的專案推送(push)到 Github 時,Packagist 和 TravisCI 服務會觸發相關的鉤子服務,去獲取最新的程式碼。
如果沒有賬號的話趕緊去 註冊 GitHub 帳號 吧!
建立 Packagist 帳號
Packagist 是 Composer 預設的包管理服務倉庫,我們使用 Composer 安裝(install)或引入(require)一個依賴包時,預設是從這裡拉取依賴包的程式碼。
所以,開發 Composer 類庫,需要使用我們的 Github 帳號 授權 並登入 Packagist 網站。
建立 TravisCI 帳號
Travis CI 提供的是持續整合服務(Continuous Integration,簡稱 CI)。它繫結 Github 上面的專案,只要有新的程式碼,就會自動抓取,然後提供一個執行環境,執行測試,完成自動化構建,它還能將專案部署到我們的應用伺服器。這個教程主要講解使用這個服務的測試和自動化構建功能。
在開始前讓我們先完成以下準備工作:
首先,訪問官方網站 Travis CI 使用 Github 授權登入。
然後,當授權登入成功後,點選右上角使用者頭像,這樣 Travis CI 會獲取到 Github 上你所有的版本庫資訊。
最後,選擇你需要使用 TravisCI 服務幫你執行測試和構建的倉庫,點選開啟按鈕。開啟成功後,任何 GitHub 提交程式碼操作,都會觸發 TravisCI 的鉤子服務,然後執行測試和構建處理。
在完成以上帳號註冊流程後,我們就可以進入到今天的正題,使用「使用 Travis CI 持續整合服務構建 Composer 類庫」。
建立新的 Composer 類庫
完成帳號建立及授權相關準備工作後,現在讓我們就可以開始建立自己的 Composer 類庫了。
在 GitHub 建立專案倉庫
第一步需要到 GitHub 網站點選站點右上角加號(➕)建立一個新的專案倉庫,這裡我建立了一個名為 travis-composer-tutorial。
預設的 GitHub 會給我們建立一個空的專案目錄,當然如果在建立時你選擇了需要建立 .gitignore、 開源協議和 readme 檔案時,Github 還會給我們同時建立這些說明及配置檔案。
將 GitHub 倉庫克隆到本地
緊接著,進入到我們的本地的工作目錄下,執行 git clone 命令將 GitHub 中的專案克隆到本地:
cd your_workspace_directory
git clone https://github.com/huliuqing/travis-composer-tutorial.git
請講自己的工作目錄及版本庫的 URL 地址替換掉。
初始化 Composer 專案
初始化的目的是為我們新建的 travis-composer-tutorial 專案建立一個 composer.json 後設資料檔案。建立這個 JSON 配置檔案有兩種方式:
- 手動建立這個 composer.json 檔案,檔案格式可以參考 庫 文件;
- 通過 composer init 命令列工具,採用互動式命令建立。
// 在 travis-composer-tutorial 專案根目錄執行下面的命令
cd travis-composer-tutorial
composer init
引導初始化時需要我們建立以下幾個初始配置選項:
- Package name: 包的名稱,我的是 phpzendo/travis-composer-tutorial;
- Description []: 包的描述;
- Author: 包的作者;
- Package Type (e.g. library, project, metapackage, composer-plugin) []: 你開發的類庫型別;
- Minimum Stability: minimum-stability 欄位的值;
- License: 採用的 開源協議;
- require: 需要依賴的其它包,必須要有一個版本約束。並且應該遵循 foo/bar:1.0.0 這樣的格式。
下面是我初始化 Composer 專案的互動截圖,有一點需要說明由於當時網路原因並沒有在初始化時新增依賴的其它包,後續我們可以使用 composer require 引入 PHPUnit 依賴:
通過 composer require 命令引入 PHPUnit 單元測試測試工具建立依賴。
composer require phpunit/phpunit
在這裡引入 PHPUnit 的原因是我們的專案需要使用 Travis CI 服務進行持續整合和測試,當然你也可以替換成別的單元測試工具。
到這裡,基本上我們就完成了一個建立初始 Composer 類庫的功能。接下來,我們將進入到專案的編碼階段。
建立源目錄
完成基本的註冊和初始化工作後,才是進行專案編碼階段,在專案根目錄下建立 src 資料夾。
專案的所有原始碼都會放置到 src 目錄下,並採用 PSR4 自動載入規範來定義檔案結構。
PSR 標準規範
PSR 是 PHP Standard Recommendations 的簡寫,由 PHP FIG 組織制定的 PHP 規範,是 PHP 開發的實踐標準。
這裡我們需要使用 PSR4 規範是最新的「自動載入」規範,它的功能是讓 Composer 能夠正確查詢並載入我們專案的原始檔。
使用 PSR4 規範定義檔案的目錄結構遵循以下原則:
\<NamespaceName>(\<SubNamespaceNames>)*\<ClassName>
更多有關 PSR4 規範說明及使用可以檢視 說明。
編寫模組程式碼
現在讓我們來編寫專案的首個模組吧。
作為教程,這裡我們假設需要建立一個 Dumper 類用於替代 php 內建的 var_dump 輸出功能。
到 src 目錄下建立子目錄 Dumper,同時建立 Dumper/Dumper.php 類檔案。
<?php
namespace PhpZendo\Dumper;
/**
* 列印變數的相關資訊
*
* @author huliuqing <huliuqing1989@gmail.com>
* @method mixed dump($expression, $title = null)
* @license MIT
*/
class Dumper
{
/**
* 列印變數的相關資訊
*
* @param mixed $expression
* @param string|null $title
* @return void
*/
public function dump($expression, $title = null)
{
echo ($title ?: '除錯:') . '<pre>';
var_dump($expression);
echo '</pre>';
}
}
配置 Composer 自動載入後設資料
編寫完成我們的模組後,需要將專案目錄配置到 composer.json 檔案的 autoload 後設資料中。
autoload 配置功能是定義 composer 自動載入與專案模組的對映關係,定義後 composer 才能正確查詢專案模組自動引入類檔案。
有關 autoload 使用說明可直接檢視文件。
- 確認專案的名稱空間。
我們模組的名稱空間為 PhpZendo\Dumper\Dumper。
當前名稱空間字首為 PhpZendo 指向的是 src 目錄,意味著 composer 自動載入會查詢 src/Dumper/Dumper.php 檔案並引入(require)。
- 將名稱空間及檔案引入關係新增到 autoload 配置
開啟 *composer.json 檔案並新增如下配置:
"autoload": {
"psr-4": {
"PhpZendo\\": "src/"
}
}
- 更新 composer 依賴。
執行如下命令更新自動載入依賴關係:
composer dump-autoload
將專案推送到 GtiHub 並建立 Packagist 鉤子服務
到這裡我們基本上已經完成了開發一個簡單的 composer 類庫,現在我們可以將專案推送到 GitHub。
但是在推送之前,我們需要到 Packagist 官網配置 travis-composer-tutorial 專案的鉤子服務。
- 將專案提交到 GitHub 遠端倉庫。
首先,確定是否有 .gitignore 檔案,並確保 vendor 等目錄不會新增到版本控制中。
我的 .gitignore 檔案實在建立 GitHub 時自動建立的:
composer.phar
/vendor/
# Commit your application's lock file https://getcomposer.org/doc/01-basic-usage.md#commit-your-composer-lock-file-to-version-control
# You may choose to ignore a library lock file http://getcomposer.org/doc/02-libraries.md#lock-file
# composer.lock
- 推送專案到 GitHub。
git add *
git commit -m "Create travis and composer tutorial."
git push origin master
- 進入 Packagist 官網,點選網頁右上角 Submit 按鈕新增 GitHub 程式碼倉庫地址。
進入頁面後將 https://github.com/huliuqing/travis-compos... 配置到 Submit package 表單,提交即可。
新增完成後我們的 GitHub 專案即新增到了 Packagist。
不過此時,我們的專案推送還不會自動在 Packagist 中完成任何程式碼推送的更新操作,而需要我們手動的去執行 update 操作才行,原因是當前還沒有配置 GitHub 的鉤子服務。
如何配置鉤子服務,可以到 說明文件 去深入瞭解一下。
小結
在這一小節我們深入瞭解瞭如何建立 Github 版本庫,使用 Composer 命令列工具初始化本地類庫後設資料資訊;並且學習瞭如何定義專案自動載入配置和將 GitHub 版本庫關聯到 Packagist 站點。
下一節我們將講解本文另外一個主題,使用 Travis CI 服務構建持續構建和測試專案。
支援 Travis CI 服務,建立可持續構建專案
Travis CI 提供一個執行環境,然後執行測試,完成構建,甚至還能將我們的專案部署到應用伺服器。
要知道我們在編寫軟體時,編碼僅僅是軟體開發過程中一小部分工作內容;一個可靠的專案還需要對其進行測試,使用 Travis CI 這類持續構建服務,可以簡化測試工作並保證專案的質量。
這一節將學習持續構建相關知識。
建立 PHPUnit 單元測試用例
PHPUnit 是 xUnit 單元測試類庫家族中的一員,使用 PHPUnit 的一個主要目的是為我們的模組建立單元測試用例。
在專案中,究竟何時才需要使用單元測試技術呢?
一個很簡單的判斷標準就是,當你想在專案中使用類似 var_dump 函式列印輸出內容時,一個更好的方式就是將輸出替換成單元測試。
建立 tests 目錄
讓我們在專案的根目錄下建立 tests 資料夾,之後我們所有的測試用例都會放置到這個目錄中。
編寫 PHPUnit 測試
接下來需要編寫 PHPUnit 測試用例,如何編寫一個簡單的測試用裡遵循以下規則:
- 針對類 Class 的測試寫在類 ClassTest中;
- ClassTest(通常)繼承自 PHPUnit\Framework\TestCase;
- 測試都是命名為 test* 的公用方法。
更詳細內容可以檢視 PHPUnit 中文網 文件說明。
所以這裡我們建立一個 DumperTest.php 單元測試用例,並將這個測試用例建立在 tests/unit/DumperTest.php 路徑下:
<?php
namespace PhpZendo\Unit;
use PhpZendo\Dumper\Dumper;
use PHPUnit\Framework\TestCase;
/**
* DumperTest
*
* @author huliuqing <huliuqing1989@gmail.com>
*/
class DumperTest extends TestCase
{
/**
* 測試 Dumper 類例項化
*
* @return void
*/
public function testDumper()
{
$dumper = new \PhpZendo\Dumper\Dumper();
$this->assertInstanceOf(\PhpZendo\Dumper\Dumper::class, $dumper);
}
}
這個測試用例主要用於檢測是否成功建立 Dumper 類。
執行單個測試用例
完成測試用例編碼工作後,我們需要驗證測試是否通過。之前,我們的專案已經引入了 phpunit 依賴,所以這裡我們可以通過下面的命令去執行測試指令碼:
./vendor/bin/phpunit UnitTest ./tests/Unit/DumperTest.php
以下是執行結果:
有關 PHPUnit 命令列工具可以檢視 命令列測試執行器 相關文件。
雖然,我們現在能夠成功執行測試指令碼,但是如果我們的測試用例有多個的話,這樣一個一個寫出每個測試檔案似乎有點傻乎乎。
有沒有好的解決方案可以將所有 tests/unit 目錄下的測試檔案都執行測試呢?
接下來會交大家如何編寫 PHPUnit 測試 XML 配置檔案。
編寫 PHPUnit 測試 XML 配置檔案
很多時候我們的測試指令碼並非只有一個測試檔案,而是會有許多的測試用例,這種情況下需要使用 XML 配置檔案 來幫助我們的 PHPunit 找到所有這些測試檔案路徑。
下面是我編寫的 phpunit.xml 配置檔案資訊:
<phpunit bootstrap="vendor/autoload.php" backupGlobals="false" backupStaticAttributes="false" cacheTokens="true" convertErrorsToExceptions="true" convertNoticesToExceptions="true" convertWarningsToExceptions="true" processIsolation="false" stopOnFailure="false" verbose="false">
<testsuites>
<testsuite name="unit">
<directory suffix="Test.php">tests/Unit</directory>
</testsuite>
</testsuites>
</phpunit>
其中我們需要重點關注以下幾個屬性功能:
- 配置檔案包含一個 屬性,作用是用於配置 PHPUnit 的核心功能,其中 bootstrap 屬性用於設定自動載入檔案路徑;
- phpunit 包含一個或多個 ,作用是用於將測試套件及測試用例組合出新的測試套件;
- 用於配置測試用例目錄。
隨後,我們可以通過下面的 phpunit 命令列工具從 XML 檔案中讀取配置並執行測試:
./vendor/bin/phpunit -c phpunit.xml
配置 Travis CI 服務
到這裡說明我們的專案進行的非常順利,接下來就是需要到 Travis CI 配置 GitHub 專案的鉤子服務,並執行自動化測試。
Travis CI 官網開啟專案的鉤子服務
如果測試一切順利的話我們就可以進行下一步,到 Travis CI 官網去開啟 travis-composer-tutorial (這裡請開啟自己的專案)專案的鉤子服務,如何開啟可以到「建立 TravisCI 帳號」以及檢視。
配置完成後可以看到看到 Travis CI 網站會獲取到我們的專案
編寫 YAML Travis CI 測試配置
Travis 服務提供多種程式語言的自動化測試支援,所有這裡我們需要編寫 PHP 語言的測試配置。
Travis CI 配置檔案使用 YAML 語言編寫,配置檔名為 .travis.yml。有關配置的具體細節可以到 Building a PHP project 去了解。
下面介紹我們的教程需要完成的一些配置資訊:
language: php
php:
- 7.1
- 7.2
before_script:
- composer install
script: ./vendor/bin/phpunit -c phpunit.xml
- language 和 php: language 用於配置專案採用的程式語言; php 用於指出當專案使用 PHP 開發時選擇使用的 PHP 版本,這裡我們使用 7.1 和 7.2 版本;
- before_script: 用於在執行 script 指令碼前,需要執行相關操作,我們這裡去執行 composer install 操作安裝相關依賴;
- script:用於配置我們需要執行的指令碼,Travis CI 預設會使用 PHPUnit 作為單元測試工具,並執行 ./vendor/bin/phpunit -c phpunit.xml 進行單元測試。
在我們的配置中,可以將 script 配置簡寫成:./vendor/bin/phpunit。
提交程式碼到 GitHub
git add *
git commit -m "Support travis ci and phpunit test."
git push origin master
推送到 GitHub 會觸發 Travis CI 的鉤子服務,並在 Travis CI 執行自動化測試和構建服務。
下面是 Travis CI 自動構建結果:
總結
以上就是今天的主要內容,希望對大家有所幫助。
參考資料
- 持續整合服務 Travis CI 教程
- Composer 入門
- 使用 GitHub、Composer、Packagist 管理公開的 PHP 包(Step By Step)
- Git 教程
- TravisCI 文件
- 如何簡單入門使用 Travis-CI 持續整合
- 學習開發自己的 Composer 包,並使用 GitHub 實時更新到 Packagist
- YAML 語言教程
本作品採用《CC 協議》,轉載必須註明作者和本文連結