如何通过 composer 为 PHP CLI 提供脚本(独立和依赖)
How can I provide a script for PHP CLI via composer (as standalone, and as dependency)
我正在尝试编写一个 PHP 脚本,我想从命令行 运行。我想使用 composer 来管理它的依赖项,并使其可以作为其他项目的依赖项进行安装。我还想保持单独使用它的能力(及其依赖项)。
目前,main.php
是我的 "entry point"(我将从命令行执行)。当我构建和测试它时,我是在 "stand alone" 的心态下这样做的。这样,main.php
需要像这样自动加载:
<?php
require_once __DIR__.'/../vendor/autoload.php';
继续保持独立思维,我这样设置:
git clone
打包到位
cd package
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.json
的 bin
属性 并开始研究这个想法,但我仍然没有找到很多关于如何正确设置我的脚本以找到它需要的信息在不同的上下文中。
我考虑过尝试在 if
中使用 include
,然后 运行 将第二个 include
连接到另一条路径失败,但这似乎不是喜欢正确的方法。
通常的做法是在两个位置查找自动加载文件。例如,参见 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);
}
我正在尝试编写一个 PHP 脚本,我想从命令行 运行。我想使用 composer 来管理它的依赖项,并使其可以作为其他项目的依赖项进行安装。我还想保持单独使用它的能力(及其依赖项)。
目前,main.php
是我的 "entry point"(我将从命令行执行)。当我构建和测试它时,我是在 "stand alone" 的心态下这样做的。这样,main.php
需要像这样自动加载:
<?php
require_once __DIR__.'/../vendor/autoload.php';
继续保持独立思维,我这样设置:
git clone
打包到位cd package
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.json
的 bin
属性 并开始研究这个想法,但我仍然没有找到很多关于如何正确设置我的脚本以找到它需要的信息在不同的上下文中。
我考虑过尝试在 if
中使用 include
,然后 运行 将第二个 include
连接到另一条路径失败,但这似乎不是喜欢正确的方法。
通常的做法是在两个位置查找自动加载文件。例如,参见 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);
}