2012-09-03 34 views
9

我正在開發一個包 - myvendor/mylib - 我打算使用Composer分發,可能是通過Packagist。這個軟件包包含了一個命令行PHP腳本bin/console.php,我希望它可以提供給項目 - 比如myvendor/mymain - 導入mylib軟件包。依賴項中的腳本需要創作者自動加載器的路徑

我知道我可以在mylib包指定用箱陣列的config設置在composer.json導入:

{ 
    "name": "myvendor/mylib", 
    "config" : { 
     "bin" : ["bin/console.php"] 
    } 
} 

mymain項目確實作曲家安裝/更新,那麼這個mylib/bin/console.php是作爲符號鏈接進一步mymain/bin/console.php,我知道,mymain項目可以指定 - 在自己composer.json - 在要依賴箱必須被鏈接:

{ 
    "name": "myvendor/mymain", 
    "config": { 
     "bin-dir": "scripts" 
    } 
} 

在這種情況下,控制檯腳本隨後被標記爲scripts/console.php

這工作正常 - 而且很酷,因爲順便說一句,所有人都跑出去了。 ;-)

但是,腳本bin/console.php本身需要包含Composer生成的vendor/autoloader.php。當單獨開發mylib時,腳本bin/console.php知道他自己的位置,相對於vendor/autoloader.php,所以他可以很容易地包含它。但是,一旦它作爲依賴項導入到另一個項目中 - myvendor/mymain,在這種情況下 - 那麼只有mymain/vendor/autoloader.php腳本。原則上,控制檯腳本無法知道他相對於該自動裝入器腳本所在的位置。

作曲家是否提供了一些環境變量 - 可通過控制檯腳本訪問 - 允許腳本找到正確的vendor/autoloader.php腳本?

BTW:我知道Composer CLI environment variable,所以我想我可以要求導入項目 - mymain - 定義(並導出)var COMPOSER_VENDOR_DIR。然後我的控制檯腳本可以使用它來查找項目的自動加載器。但是,這似乎是潛在的問題:

  1. 我們要設定只適用於這個項目,而是一個殼VAR(和出口)將適用於從shell會話訪問的所有項目。似乎放肆我的小依賴 - myvendor/mylib - 強加在一個導入項目。

  2. 原則上,依賴本身 - myvendor/mylib - 應該能夠找到他需要的東西。似乎不應該對進口商承擔責任。

WDYT?提前致謝。想法歡迎。

回答

3

一種方法(即一出來就IRC freenode的#composer,我意譯,並在其上我有點擴大與@igorw討論)是讓斌腳本console.php遍歷了文件系統,從__DIR__出發,尋找存在autoload.php

+2

你不需要真的迭代,你可以看看兩個dir,因爲它匹配// – Seldaek

+0

@Seldaek:對,我終於理解了你的來自[jsonlint]的示例(https:// github.com/Seldaek/jsonlint/blob/master/bin/jsonlint)並以此方式實施。謝謝mucho! –

+0

似乎人們仍然有這個問題(我!) 在這裏找到了答案:http://stackoverflow.com/questions/35271282/how-can-i-provide-a-script-for-php-cli-via -composer-AS-獨立和-AS-依賴新生 – VladFr