2016-02-08 58 views
0

我正在嘗試編寫一個我想從命令行運行的PHP腳本。我想用composer來管理它的依賴關係,並使它可以作爲依賴項安裝到其他項目中。我也想保持自己使用它的能力(以及它的依賴)。我如何通過作曲家爲PHP CLI提供腳本(作爲獨立作爲依賴項)

目前,main.php是我的「入口點」(我將從命令行執行)。當我建立並測試它時,我是以「獨立」的心態做的。一個這樣的,main.php得到負載自動加載,像這樣:

<?php 
require_once __DIR__.'/../vendor/autoload.php'; 

在單機心態繼續,我把它就像這樣:

  1. git clone包到位
  2. cd package
  3. composer install

這產生了以下翼目錄設置」

package 
    |-composer.json 
    | 
    |-src 
    | |-ClassOne.php 
    | | 
    | |-ClassTwo.php 
    | | 
    | |-main.php 
    | 
    |-vendor 
     |-autoload.php 
     | 
     |-composer 
     | 
     |-3rdpaty_1 
     | 
     |-3rdpaty_2 

這種運作良好 - 我可以運行php src/main.php這是能夠找到它需要因爲它加載__DIR__.'../vendor/autoload.php'的類。

我遇到麻煩的地方在於當我想將軟件包作爲依賴項安裝到另一個項目時(爲了讓腳本可以在那裏運行)。我將我的軟件包添加到composer.json,並將其安裝。然而,試圖運行php vendor/compnay/package/src/main.php失敗,因爲必要的autoload.php是在不同的地方:

dependent_project 
    |-composer.json 
    | 
    |-some_code 
    | 
    |-vendor 
     |-autoload.php 
     | 
     |-composer 
     | 
     |-company 
     | |-package 
     |  |-composer.json 
     |  | 
     |  |-src 
     |   |-ClassOne.php 
     |   | 
     |   |-ClassTwo.php 
     |   | 
     |   |-main.php 
     | 
     |-other_vendor_1 
     | 
     |-other_vendor_2 

我明白了什麼是錯的,但我不知道如何解決它。如何使用作曲家來提供這樣的作品?我搜遍了很多,但我沒有看到有人提出或回答同樣的問題。我注意到composer.jsonbin屬性,並開始研究這個想法,但是我仍然沒有找到關於如何正確設置我的腳本以在不同的上下文中找到所需的信息的很多信息。

我考慮嘗試在if中使用include,並在失敗時對另一個路徑運行第二個include,但這似乎不是正確的解決方法。

回答

2

通常的做法是查看兩個位置的自動加載文件。例如,請參閱Behat使用的片段:

function includeIfExists($file) 
{ 
    if (file_exists($file)) { 
     return include $file; 
    } 
} 
if ((!$loader = includeIfExists(__DIR__.'/../vendor/autoload.php')) && (!$loader = includeIfExists(__DIR__.'/../../../autoload.php'))) { 
    fwrite(STDERR, 
     'You must set up the project dependencies, run the following commands:'.PHP_EOL. 
     'curl -s http://getcomposer.org/installer | php'.PHP_EOL. 
     'php composer.phar install'.PHP_EOL 
    ); 
    exit(1); 
} 
+0

好的,所以我的意願並非完全瘋狂。它只是感覺錯誤...就像我錯過了一些神奇的環境事物。謝謝,我會給這個旋轉。 – JAAulde

+0

該方法運作良好。再次感謝。 – JAAulde