鍍金池/ 教程/ PHP/ 二進制供應庫和 <code>vendor/bin</code> 目錄
簡介 中文文檔
腳本
命令行
資源庫
庫(資源包)
Composer PHP依賴管理的新時代
插件
別名
自定義安裝程序
二進制供應庫和 <code>vendor/bin</code> 目錄
如何為我的框架自定義一個資源包安裝目錄?
composer.json 架構
我應該提交 vendor 目錄中的依賴包嗎?
為什么 Composer 不遞歸加載儲存庫?
基本用法
為什么說“比較符”和“通配符”相結合的版本約束是壞主意?

二進制供應庫和 <code>vendor/bin</code> 目錄

什么是二進制供應庫?

一個 Composer 資源包,想要傳遞給安裝它的用戶的任何命令行腳本, 都應該被列入 二進制供應庫。

如果一個資源包,含有不被用戶所需要的其他腳本(比如構建或編譯腳本) 那么這些代碼不應該被列入二進制供應庫。

如何定義?

它是通過在項目的 composer.json 里添加一個 bin 鍵定義的。 它是以一種文件的數(shù)組的形式定義的,這樣任何給定的項目 都可以添加多個二進制文件。

{
    "bin": ["bin/my-script", "bin/my-other-script"]
}

在 composer.json 里定義二進制供應庫的作用是?

對于任何 依賴于 該資源包的項目, 它將引導 Composer 安裝資源包里的二進制文件到 vendor/bin 目錄。

這是一個便捷的途徑來暴露有用的腳本, 否則它們將會被隱藏在 vendor/ 目錄的深處。

當 Composer 運行到定義了二進制供應庫的 composer.json 文件時發(fā)生了什么?

對于被某個資源包直接定義的二進制供應庫,什么也不會發(fā)生。

當 Composer 運行到,列出了二進制供應庫依賴關系的 composer.json 文件時發(fā)生了什么?

Composer 會檢查所有依賴包里定義的二進制文件。 并為每一個依賴的二進制庫設立一個指向 vendor/bin 的軟連接。

比如 my-vendor/project-a 資源包的二進制庫就是這樣安裝的:

{
    "name": "my-vendor/project-a",
    "bin": ["bin/project-a-bin"]
}

在該 composer.json 上執(zhí)行 composer install 命令, 不會對 bin/project-a-bin 造成任何影響。

再比如項目 my-vendor/project-b 有這樣的 require 定義:

{
    "name": "my-vendor/project-b",
    "require": {
        "my-vendor/project-a": "*"
    }
}

在該 composer.json 上執(zhí)行 composer install 命令時, 將會檢查 project-b 的所有依賴包,并安裝它們的二進制庫到 vendor/bin 目錄。

這種情況下,Composer 將使 vendor/bin/project-a-bin 可以作為 vendor/my-vendor/project-a/bin/project-a-bin 的訪問路徑。在類 Unix 平臺上, 這是通過創(chuàng)建軟鏈接實現(xiàn)的。

對于 Windows 環(huán)境和 .bat 文件呢?

完全由 Composer 管理的包并不 需要 包含任何用以兼容 Windows 的 .bat 文件。在 Windows 環(huán)境下運行時,Composer 會用一種特殊的方式處理 二進制文件的安裝:

  • 一個用以引用此二進制文件的 .bat 文件會自動生成
  • 一個與該二進制文件同名的 Unix 風格的代理文件也會自動生成 (方便 Cygwin 或 Git Bash 使用)

有時資源包需要維護自定義的 .bat 文件來支持工作流,它可以不包含在 Composer 中。 這種情況下,該資源包 應該把它們作為二進制文件列出,因為 Composer 不需要知道它們。

二進制供應庫可以安裝在 vendor/bin 以外的其它地方么?

當然,這里有兩種指定二進制供應庫的其他可選位置的方法:

  1. composer.json 文件中的 bin-dir 配置屬性處設置
  2. 設置環(huán)境變量 COMPOSER_BIN_DIR

前者的實例如下:

{
    "config": {
        "bin-dir": "scripts"
    }
}

在這個 composer.json 上運行 composer install 會把所有的二進制供應庫 都安裝在 scripts/ 目錄,而不是缺省的 vendor/bin/ 目錄。

上一篇:composer.json 架構下一篇:腳本