php - 如何通过 composer 为 PHP CLI 提供脚本(独立和依赖)

标签 php composer-php command-line-interface

我正在尝试编写一个我想从命令行运行的 PHP 脚本。我想使用 composer 来管理它的依赖项,并使其可以作为其他项目的依赖项进行安装。我还想保持单独使用它的能力(及其依赖项)。

目前,main.php 是我的“入口点”(我将从命令行执行的内容)。当我构建和测试它时,我是在“独立”的心态下这样做的。这样,main.php 需要像这样自动加载:

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

继续独立思考,我这样设置:

  1. git clone 打包到位
  2. cd包
  3. composer 安装

这会产生以下目录设置"

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 提供这样的东西?我搜索了很多,但没有看到有人问或回答同样的问题。我注意到 composer.jsonbin 属性并开始研究这个想法,但我仍然没有找到很多关于如何正确设置我的脚本的信息在不同的环境中找到它需要的东西。

我考虑过尝试在 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 为 PHP CLI 提供脚本(独立和依赖),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35271282/

相关文章:

php - 如何在 PHP 中为 ob_start 传递带参数的回调函数?

php - 使用PHP从MySQL服务器拉取数据以JSON格式显示

json - 将 Symfony 从 2.8 升级到 3.1 : "Your requirements could not be resolved to an installable set of packages."

php - ubuntu litespeed php7.0 有一个奇怪的 php.ini 路径

php - 致命的 : reference is not a tree on composer install

linux - 我如何制作自己的包裹?

TUI 模式下的 GDB : how to deal with stderr's interaction with the ui

php - Laravel 分页上不存在追加方法

php - 理解 PHP/mysql 中的递归

node.js - 编译 NodeJS 命令行应用程序