- 何謂廠商二進制檔案?
- 如何定義?
- 在 composer.json 中定義廠商二進制檔案有何用途?
- 在定義廠商二進制檔案的 composer.json 上執行 Composer 時會發生什麼事?
- 在列有廠商二進制檔案的 composer.json 上執行 Composer 時會發生什麼事?
- 從二進制檔案中尋找 Composer 自動載入程式
- 從二進制檔案中尋找 Composer bin-dir
- Windows 和 .bat 檔案呢?
- 廠商二進制檔案可以安裝在 vendor/bin 以外的位置嗎?
廠商二進制檔案和 vendor/bin
目錄#
何謂廠商二進制檔案?#
Composer 套件想要傳遞給安裝套件的使用者之任何命令列腳本都應該列為廠商二進制檔案。
如果套件包含其他不需要套件使用者(例如建置或編譯腳本)的腳本,則該程式碼不應該列為廠商二進制檔案。
如何定義?#
透過將 bin
鍵新增到專案的 composer.json
來定義。它指定為檔案陣列,因此可以針對任何特定專案新增多個二進制檔案。
{
"bin": ["bin/my-script", "bin/my-other-script"]
}
在 composer.json 中定義廠商二進制檔案有何用途?#
它指示 Composer 將套件的二進制檔案安裝到 相依 於該專案的任何專案的 vendor/bin
。
這是公開實用腳本(否則會深藏在 vendor/
目錄中)的便捷方式。
在定義廠商二進制檔案的 composer.json 上執行 Composer 時會發生什麼事?#
對於套件直接定義的二進制檔案,不會發生任何事。
在列有廠商二進制檔案的 composer.json 上執行 Composer 時會發生什麼事?#
Composer 會尋找在所有相依關係中定義的二進制檔案。會從每個相依關係的二進制檔案建立一個代理檔(在 Windows/WSL 上為兩個代理檔)到 vendor/bin
。
假設套件 my-vendor/project-a
的二進制檔案設定如下:
{
"name": "my-vendor/project-a",
"bin": ["bin/project-a-bin"]
}
執行 `composer install` 對此 `composer.json` 檔不會對 `bin/project-a-bin` 做任何處理。
假設專案 `my-vendor/project-b` 有以下 requirement 設定
{
"name": "my-vendor/project-b",
"require": {
"my-vendor/project-a": "*"
}
}
執行 `composer install` 對此 `composer.json` 檔會查看所有 project-a 的二進位檔並將其安裝至 `vendor/bin`。
在此情況下,Composer 會將 `vendor/my-vendor/project-a/bin/project-a-bin` 設定為 `vendor/bin/project-a-bin`。
從二進位檔尋找 Composer 自動載入程式#
從 Composer 2.2 版開始,bin proxy 檔案會定義新的 `$_composer_autoload_path` 全域變數,如此一來,當二進位檔執行時,便能輕鬆找到專案的自動載入程式。
但在執行根套件本身所定義的二進位檔時不會有這個全域變數,因此需要提供後援機制。
舉例來說,可採取以下做法
<?php
include $_composer_autoload_path ?? __DIR__ . '/../vendor/autoload.php';
如果你想套件中仰賴這個機制,應一併需求 `"composer-runtime-api": "^2.2",以確保套件會安裝支援這項功能的 Composer 版本。
從二進位檔尋找 Composer bin 目錄#
從 Composer 2.2.2 版開始,bin proxy 檔案會定義新的 `$_composer_bin_dir` 全域變數,如此一來,當二進位檔執行時,便能輕鬆找到專案的 Composer bin 目錄。
對非 PHP 二進位檔案,從 Composer 2.2.6 版開始,bin proxy 會設定 `COMPOSER_RUNTIME_BIN_DIR` 環境變數。
但在執行根套件本身所定義的二進位檔時不會有這個全域變數,因此需要提供後援機制。
舉例來說,可採取以下做法
<?php
$binDir = $_composer_bin_dir ?? __DIR__ . '/../vendor/bin';
#!/bin/bash
if [[ -z "$COMPOSER_RUNTIME_BIN_DIR" ]]; then
BIN_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
else
BIN_DIR="$COMPOSER_RUNTIME_BIN_DIR"
fi
如果你想套件中仰賴這個機制,應一併需求 `"composer-runtime-api": "^2.2.2",以確保套件會安裝支援這項功能的 Composer 版本。
Windows 和 .bat 檔案怎麼處理?#
完全透過 Composer 管理的套件不必含有任何 .bat 檔案,以符合 Windows 相容性。Composer 在 Windows 環境中執行時,是以特別的方式處理二進位檔的安裝
- 系統會自動產生一個 .bat 檔案來參考二進位檔
- 也會產生一個與二進位檔同名的 Unix 風格 proxy 檔案,這個檔案對於 WSL、Linux VM 等環境很有用。
對於必須支援可能不包含 Composer 的工作流程的套件,是可以維護自訂的 .bat 檔案。在此情況下,套件不應將 .bat 檔案列為二進位檔,因為不需要。
供應商二進位檔是否可以安裝在 vendor/bin 以外的位置?#
可以,有兩種方式可以指定替代的供應商二進位檔位置
- 在 `composer.json` 檔案中設定 `bin-dir` 組態設定
- 設定環境變數 `COMPOSER_BIN_DIR`
以下是一個前者的範例
{
"config": {
"bin-dir": "scripts"
}
}
為此 composer.json
執行 composer install
將導致所有供應商二進位檔安裝在 scripts/
中,而不是 vendor/bin/
中。
你可以將 bin-dir
設為 ./
,將二進位檔放在你的專案根目錄中。
發現錯字了嗎?這個文件有問題嗎?分岔並編輯它!