如何建立自己的Composer軟體包

如何建立自己的Composer軟體包

程式碼重用帶來了依賴性管理問題,而依賴性管理歷來是一個相當人工且容易出錯的過程。幸運的是,近年來大多數程式語言都通過引入各種依賴性管理工具來解決這一問題。在 PHP 生態系統中,Composer 因其易用性、靈活性和廣泛採用而成為標準工具。

儘管 Composer 是為依賴關係管理而設計的,但您也可以用它來完成以下任務:

  • 自動載入:自動載入外部庫中的類和函式,使您的程式碼可以隨時訪問這些類和函式,並簡化將外部程式碼整合到專案中的過程。
  • 程式碼生成:為專案生成模板程式碼,如配置檔案或其他常用程式碼片段,以加快開發過程並確保一致性。
  • 指令碼:內建指令碼系統可自動執行常見任務,如執行測試或從程式碼庫中生成文件。這有助於簡化開發工作流程,減少手工操作。

本教學將逐步指導您建立自己的 Composer 軟體包,並將其釋出到 Packagist,這是一個供全球開發人員在自己的專案中使用的 PHP 軟體包儲存庫。

Composer 如何工作?

首先,讓我們瞭解一下 Composer。簡單來說,Composer 的工作原理是使用一個 composer.json 檔案,其中包含 PHP 專案中依賴項的定義。它從一個集中的軟體倉庫中查詢這些軟體包,然後使用軟體包倉庫自動下載並安裝這些依賴項。

假設你已經在 PHP 工作環境中安裝了 Composer,下面是它的依賴關係下載和安裝過程:

  1. 在專案根目錄下的 composer.json 檔案中定義專案所需的依賴項。該檔案包括所需的庫及其版本資訊,以及這些庫的其他配置設定或依賴項。
  2. 在 Composer 中使用 install 等命令解決依賴關係,安裝所需的依賴關係;update 更新現有的依賴關係;requirecomposer.json 檔案中新增新的依賴關係。執行命令時,Composer 會讀取 composer.json 檔案以確定所需的依賴項,檢查軟體包倉庫中適合 PHP 環境的每個依賴項的最新版本,然後檢查是否存在衝突或版本限制。
  3. Composer 會將所需的依賴項(包括庫)下載並安裝到專案的 vendor 目錄中。Composer 會建立一個 composer.lock 檔案,記錄所安裝依賴項的確切版本。
  4. Composer 會設定一個自動載入器,從已安裝的依賴項中自動載入類和函式。這樣就能在專案中輕鬆使用已安裝的庫,而無需手動包含每個檔案。

簡而言之,Composer 簡化了 PHP 專案中的依賴關係管理,使安裝、更新和使用外部庫和框架變得更加容易。

建立併發布 Composer 軟體包

本教學將向您展示如何建立一個名為 tempconv 的簡單 PHP 庫,用於將攝氏溫度轉換為華氏溫度,反之亦然。

準備工作

在開始之前,您需要準備好以下幾樣東西:

  • 系統中已正確安裝 PHP 和 Composer 在撰寫本文時,Composer 的最新版本是 v2.6.6,但這些說明應適用於任何 v2 版本。
  • GitHub 賬戶,用於建立程式碼託管倉庫。
  • 一個 Packagist 賬戶,用於釋出您的庫。

建立專案倉庫

為本教學建立自己的 GitHub 倉庫,在此推送完成的庫程式碼和檔案。

在 GitHub 上建立專案庫

在 GitHub 上建立專案庫。

本教學使用的專案名稱為 tempconv。 在 “描述 “欄位中,提供有關應用程式的簡要細節。選中新增 README 檔案的覈取方塊,為 Add .gitignore 選項選擇 Composer 模板,並選擇許可證 – 本教學使用 MIT License。最後,點選 Create repository

克隆版本庫

將剛剛建立的版本庫克隆到本地計算機上。別忘了用你自己的 URL 替換這裡和本教學中的 URL:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ git clone https://github.com/rexfordnyrk/tempconv.git
$ git clone https://github.com/rexfordnyrk/tempconv.git
$ git clone https://github.com/rexfordnyrk/tempconv.git

這會在當前工作目錄下建立一個名為 tempconv 的目錄。此時,該目錄只包含 README.md、LICENSE.gitignore 檔案,但您還將在此建立軟體包檔案。

建立 PHP 庫

在專案目錄中,新增一個名為 TemperatureConverter.php 的檔案,其中包含以下程式碼:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<?php
namespace Rexfordnyrk\Tempconv;
class TemperatureConverter
{
//Caller must provide the temperature value and the unit either C Celsius or F Fahrenheit
public function convert($temperature, $unit)
{
//Checking whether the unit we're working with is Celsius or Fahrenheit
if ($unit === 'C') {
$fahrenheit = ($temperature * 9 / 5) + 32;
return $fahrenheit;
} elseif ($unit === 'F') {
$celsius = ($temperature - 32) * 5 / 9;
return $celsius;
} else {
//Throwing error if the unit provided is neither C nor F
throw new \InvalidArgumentException('Invalid unit, only C (Celsius) or F (Fahrenheit) are allowed');
}
}
}
<?php namespace Rexfordnyrk\Tempconv; class TemperatureConverter { //Caller must provide the temperature value and the unit either C Celsius or F Fahrenheit public function convert($temperature, $unit) { //Checking whether the unit we're working with is Celsius or Fahrenheit if ($unit === 'C') { $fahrenheit = ($temperature * 9 / 5) + 32; return $fahrenheit; } elseif ($unit === 'F') { $celsius = ($temperature - 32) * 5 / 9; return $celsius; } else { //Throwing error if the unit provided is neither C nor F throw new \InvalidArgumentException('Invalid unit, only C (Celsius) or F (Fahrenheit) are allowed'); } } }
<?php
namespace Rexfordnyrk\Tempconv;
class TemperatureConverter
{
//Caller must provide the temperature value and the unit either C Celsius or F Fahrenheit
public function convert($temperature, $unit)
{
//Checking whether the unit we're working with is Celsius or Fahrenheit
if ($unit === 'C') {
$fahrenheit = ($temperature * 9 / 5) + 32;
return $fahrenheit;
} elseif ($unit === 'F') {
$celsius = ($temperature - 32) * 5 / 9;
return $celsius;
} else {
//Throwing error if the unit provided is neither C nor F
throw new \InvalidArgumentException('Invalid unit, only C (Celsius) or F (Fahrenheit) are allowed');
}
}
}

該類有一個名為 convert 的方法,它將溫度和單位作為引數,並返回轉換後的溫度。如果單位無效,則會丟擲異常。

現在就到此為止。在現實世界中,你可能會編寫單元測試,以確保程式碼在修改或更新後能按預期執行。

建立 composer 包

有了庫程式碼,就該把它製作成一個 Composer 包了。你將使用嚮導一步步為你的軟體包生成 composer.json 檔案,我們還將介紹在將程式碼推送到版本庫之前將其組織成軟體包的一些最佳實踐。

生成 composer.json 軟體包檔案

雖然你可以在專案目錄根目錄下手動寫入 composer.json 檔案的內容,但最好還是使用下面的 Composer 命令來生成它:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ composer init
$ composer init
$ composer init

這條命令會讓你一步步完成一個小嚮導。你對軟體包名稱、描述、作者資訊和許可證型別等提示的回答將生成軟體包的 composer.json 檔案。

Composer 的文件概述了預期值,以及你可以用來定義專案的 composer.json 的其他選項。

使用 composer init 生成配置

使用 composer init 生成配置。

請注意,嚮導會在適當的地方為問題提供預定義的答案,例如從 git 匯出你的姓名和電子郵件。如果你喜歡,可以隨意更改。

該庫的功能不依賴於任何其他軟體包,因此可以對指定依賴關係的問題回答 “No“。

嚮導會顯示生成檔案內容的預覽,並要求您確認以完成嚮導。

整理軟體包檔案

完成嚮導後,除了 composer.json 檔案外,還會建立兩個目錄:

  • 存放原始碼的 src 目錄
  • 用於存放下載的依賴項的 vendor 目錄

TemperatureConverter.php 檔案移到 src 目錄。如果你的庫有依賴庫,執行 composer install 生成自動載入器並安裝依賴包。

將程式碼上傳到 GitHub

將你的修改和新檔案新增到 Git:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ git add -A
$ git add -A
$ git add -A

提交對本地版本庫所做的更改,並將其推送到 GitHub 上的遠端版本庫,以便在下一節中輕鬆釋出專案:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ git commit -am "Initial Release" && git push
$ git commit -am "Initial Release" && git push
$ git commit -am "Initial Release" && git push

為你的程式庫建立釋出版本

有了您的程式碼,您就可以在您的 repo 中建立一個帶有版本號的庫釋出版本,這樣其他開發者就可以跟蹤您的穩定版和重要更新。

導航到 GitHub 上的版本庫,點選 “About” 部分下方的 “Releases“。在 “Releases” 頁面,你現在應該什麼都沒有,點選 “Create a new release“。

GitHub 的釋出頁面

GitHub 的釋出頁面。

填寫有關釋出的一些細節,如標籤版本和釋出標題。標籤版本應是該釋出的唯一識別符號(例如:v1.0.0),釋出標題應描述釋出中包含的更改(例如:Initial release)。

您還可以選擇新增版本說明。如果要上傳檔案,如編譯後的二進位制檔案或原始碼存檔,可將檔案拖放到 Attach binaries by dropping them here or selecting them 區域,但本教學不需要這樣做。

在 GitHub 上輸入初始版本的詳細資訊

在 GitHub 上輸入初始版本的詳細資訊。

點選 “Publish release” 建立釋出版本。

現在你的專案應該可以在版本庫的 “Releases” 頁面上找到。使用者可以下載任何附加檔案並檢視釋出說明。此外,如果你為釋出新增了標籤,其他開發者就可以使用該標籤檢視釋出中包含的確切程式碼。

您的程式庫已經準備好與全世界分享。讓我們在 Packagist 上以軟體包的形式釋出它。

開始使用 Packagist

Packagist 是 PHP 的主要軟體包倉庫。它為開發人員提供了一個釋出和共享 PHP 軟體包的中心位置,其他開發人員也可以在自己的專案中發現和使用這些軟體包。讓我們釋出您的軟體包!

導航到 Packagist 網站,點選 Login,然後選擇 GitHub 作為登入方法,使用您的 GitHub 賬戶進行身份驗證。

使用 GitHub 在 Packagist 上註冊

使用 GitHub 在 Packagist 上註冊。

單擊 Authorize,允許 Packagist 訪問您的帳戶。

使用 GitHub 成功登入 Packagist

使用 GitHub 成功登入 Packagist。

在 Packagist 上提交您的 Composer 軟體包

要在 Packagist 上釋出軟體包,請提交包含描述軟體包及其依賴關係的 composer.json 檔案的 GitHub 倉庫。單擊 Packagist 網站上的 Submit,在出現的頁面上提供您的 repo 的 URL,然後單擊 Check 進行驗證。

如果版本庫有效,Packagist 就會檢測到軟體包的名稱,”Check” 按鈕就會變成 “Submit“。

Composer 軟體包 rexfordnyrk/tempconv 已驗證並準備提交

Composer 軟體包 rexfordnyrk/tempconv 已驗證並準備提交。

單擊 “Submit“,Packagist 會花一點時間設定併發布您的專案。

編譯器軟體包成功釋出

編譯器軟體包成功釋出。

就是這樣!您的軟體包現在可以在 Packagist 上釋出,供其他開發人員在自己的專案中作為依賴項使用。

在其他專案中使用您的 Composer 軟體包

您可以在其他專案中使用您釋出的軟體包,方法是在 composer.json 檔案中將其新增為依賴關係。您可以手動建立並編輯該檔案,但最好使用 Composer 命令,如下所示:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ composer require rexfordnyrk/tempconv
$ composer require rexfordnyrk/tempconv
$ composer require rexfordnyrk/tempconv

如果沒有,Composer 會自動建立 composer.json 檔案,然後從 Packagist 查詢、下載並自動載入軟體包。輸出結果應該是這樣的:

Composer 會自動建立 composer.json 檔案

建立一個包含演示程式程式碼的 demo.php 檔案,以便與程式庫配合使用。然後,您可以在程式程式碼中使用 TemperatureConverter 類,如下所示:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
<?php
use Rexfordnyrk\Tempconv\TemperatureConverter;
require_once './vendor/autoload.php';
$converter = new TemperatureConverter();
$fahrenheit = $converter->convert(20, 'C');
echo "20°C is equivalent to $fahrenheit °F\n";
$celsius = $converter->convert(68, 'F');
echo "68°F is equivalent to $celsius °C\n";
<?php use Rexfordnyrk\Tempconv\TemperatureConverter; require_once './vendor/autoload.php'; $converter = new TemperatureConverter(); $fahrenheit = $converter->convert(20, 'C'); echo "20°C is equivalent to $fahrenheit °F\n"; $celsius = $converter->convert(68, 'F'); echo "68°F is equivalent to $celsius °C\n";
<?php
use Rexfordnyrk\Tempconv\TemperatureConverter;
require_once './vendor/autoload.php';
$converter =  new TemperatureConverter();
$fahrenheit = $converter->convert(20, 'C');
echo "20°C is equivalent to $fahrenheit °F\n";
$celsius = $converter->convert(68, 'F');
echo "68°F is equivalent to $celsius °C\n";

這段程式碼使用 TemperatureConverter 類轉換 20 攝氏度和 68 華氏度的溫度,並輸出結果。Composer 建立了匯入的 autoloader.php 檔案,用於載入所需的所有依賴項。它會在必要時自動載入類。

最後,在終端執行這段程式碼:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ php demo.php
$ php demo.php
$ php demo.php

輸出結果應該與此類似:

Plain text
Copy to clipboard
Open code in new window
EnlighterJS 3 Syntax Highlighter
$ php demo.php
20°C is equivalent to 68 °F
68°F is equivalent to 20 °C
$ php demo.php 20°C is equivalent to 68 °F 68°F is equivalent to 20 °C
$ php demo.php
20°C is equivalent to 68 °F
68°F is equivalent to 20 °C

小結

您剛剛在一個物件導向的類中建立了一個簡單的 PHP 庫,用於將攝氏溫度轉換為華氏溫度,反之亦然,該庫可以在其他應用程式中重複使用。您看到了如何使用 Composer Init 命令從類中建立包,還學到了一些庫的基本程式碼組織最佳實踐。您在 Packagist 上釋出了庫,這樣您和其他開發人員就可以將其作為其他專案的依賴項。

評論留言