如何通过 Composer 为 PHP CLI 提供脚本(作为独立的和作为依赖项)

2024-02-12

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

现在,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

我明白出了什么问题,但我不知道如何解决它。如何使用作曲家提供这样的东西?我已经搜索了很多,但没有看到有人提出或回答同样的问题。我注意到bin的财产composer.json并开始研究这个想法,但我仍然没有找到很多关于如何正确设置脚本以找到不同上下文中所需内容的信息。

我考虑尝试使用include in an if,并运行第二个include失败时转向另一条路径,但这似乎不是正确的方法。


常见的做法是在这两个位置查找自动加载文件。例如,请参阅以下代码片段Behat https://github.com/Behat/Behat/blob/718159921b1d844b8805b5ab2e7d1be34ca323cb/bin/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);
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何通过 Composer 为 PHP CLI 提供脚本(作为独立的和作为依赖项) 的相关文章

  • 使 pdo::query 静态

    当我运行下面的代码时出现此错误 我通常使用 msql 函数 但我尝试使用 PDO 代替 怎么了 致命错误 第 14 行无法静态调用非静态方法 PDO query
  • 如何在 Python 中包含 PHP 脚本?

    我有一个 PHP 脚本 news generator php 当我包含它时 它会抓取一堆新闻项并打印它们 现在 我在我的网站 CGI 中使用 Python 当我使用 PHP 时 我在 新闻 页面上使用了这样的内容 为了简单起见 我删掉了这个
  • 自定义 WP 主题时,我应该将导航栏放在“”标签之前还是之后?

    我正在通过制作子主题来自定义 WP 主题 我将 Bootstrap 中的导航栏放入子主题目录中的 header php 文件中 但是 我不确定在哪里放置导航栏代码 我可以把它都放在前面and之后标记成功 例如 无论我选择哪一个 导航栏都显示
  • 为什么我不能在 TCPDF 表中使用 č,ć,đ 图表?

    我正在为我的网站构建一个 tcpdf 文件 该 tcpdf 文件中有一个包含一些数据的表格 但我无法使该章程正常工作 对于编码 我使用 windows 1250 宪章女巫不起作用 我已经尝试过 utf 8 但仍然没有得到这个章程 tcpdf
  • facebook php - 如何获取专辑封面照片

    我需要使用 PHP SDK Facebook 获取专辑封面照片 我尝试 https graph facebook com ALBUM ID picture type album 但我得到默认图像 例如 获取用户 https graph fa
  • Yii2 异常:ApcCache 需要加载 PHP apc 扩展

    在高级模板前端的主配置中配置缓存组件时 我收到异常 在我的 php ini 上启用了扩展 rsults 如何解决此问题 前端 config main php cache gt class gt yii caching ApcCache ke
  • .htaccess 异常导致主目录出现问题

    这是我的目录结构 localhost or livehost app bootstrap public vendor code demo 这是我的 htaccess
  • 如何使用 Facebook SDK API 为页面/网址“点赞”?

    我正在使用这段代码 facebook gt api me likes post array url gt http www google com 我收到以下错误 Fatal error Uncaught OAuthException 200
  • 在字符串中间添加一个字符

    可能有一个简单的解决方案可以解决这个问题 但会引起面部表情 我将时间存储为 4 个字符长的字符串 即 1300 我试图将该字符串显示为 13 00 我觉得必须有一个比我现在正在做的更优雅的解决方案 我目前有 startTime get fi
  • 为什么验证不起作用并跳转到另一个页面?

    我写了一个customer display php来验证数据 到目前为止只有名字 但无论名字字段是否为空 网页都会跳转到customer search php并且没有更改数据库中的信息 为什么
  • 使用先前的反向引用作为命名捕获组的名称

    有没有办法使用对先前捕获组的反向引用作为捕获组的名称命名捕获组 这可能不可能 如果不可能 那么这就是一个有效的答案 下列 data description some description preg match data matches p
  • Magento - 检查 cms 页面

    我想通过 php 检查页面是否是 Magento 中的 cms page 我需要不同的 cms 页面面包屑 所以我尝试在一个条件下做到这一点 但我不知道如何或在哪里查看 到目前为止 这是我的 breadcrumbs phtml p some
  • MySQL PHP邮政编码比较具体距离

    我试图找出比较一个邮政编码 用户提供的 和一大堆其他邮政编码 现在大约有 200 个邮政编码 之间的距离的最有效方法 相对于加载时间 但它会随着时间的推移而增加 我不需要任何精确的东西 只是在球场上 我下载了整个美国的邮政编码 csv 文件
  • Sonata DateTimePickerType 类默认日期显示错误的日期时间格式

    我陷入困境 我不知道如何使用 sonata DateTimePickerType 类正确设置默认日期和时间 我尝试了不同的方法 但到目前为止 没有一种方法没有帮助 在下面的截图中 help 键显示正确的日期和时间 但是当我使用 dp 默认日
  • MVC 模式中的验证层

    验证模型将使用的数据的最佳位置在哪里 例如 考虑登记表 我们有一些来自注册表的数据 那么验证这些数据的最佳位置在哪里 我们应该通过 if 语句或特殊的验证器类来检查每个数据 这意味着大量的编码 所以我想了解在哪里可以做到这一点 在控制器中
  • WordPress 插件中的类自动加载器

    我想编写一个类自动加载器以在 WordPress 插件中使用 该插件将安装在多个站点上 我想尽量减少与其他插件发生冲突的机会 自动加载器将是这样的 function autoload name some code here 我的主要问题是
  • PHP 数组通过 JSON 转为 jquery 数组

    我有点困惑为什么以下不起作用 get php
  • 从 PHP 数组生成 HTML 表

    我不明白这一点 我需要解决看似简单的问题 但这超出了我的逻辑 我需要编写一个函数 table columns input cols 它将输出一个表 示例 input array apple orange monkey potato chee
  • 使用 php-ews(Exchange Web 服务)在特定日期后获取电子邮件

    在我的 PHP 脚本中 我需要弄清楚如何检索指定消息 ID 之后或特定日期之后的所有电子邮件 两者都可以 我只需要检索自上次抓取收件箱以来的新电子邮件 这个收件箱每天收到数千封电子邮件 而且我在 30 天内无法删除任何电子邮件 对于初始导入
  • 为什么我的会话仍然存在?

    我一定很愚蠢 因为似乎一件相当明显的事情现在让我完全困惑 我有一个会议 ie SESSION handbag id 在某个时刻 我需要彻底终止这个会话 ie at the start of the page session start el

随机推荐