【问题标题】:Script in dependency needs path to Composer autoloader依赖中的脚本需要 Composer 自动加载器的路径
【发布时间】:2012-08-27 20:08:33
【问题描述】:

我正在开发一个包 - myvendor/mylib - 我计划使用 Composer 分发它,可能通过 Packagist。这个包包含 - 除其他外 - 一个命令行 PHP 脚本 bin/console.php,我想将它提供给项目 - 比如 myvendor/mymain - 导入 mylib 包。

我知道我可以在mylib 包中指定composer.json 中的config 设置以及要导入的bin 数组:

{
    "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 脚本。原则上,控制台脚本无法知道他相对于自动加载器脚本的位置。

Composer 是否提供一些环境变量 - 控制台脚本可以访问 - 允许脚本找到正确的 vendor/autoloader.php 脚本?

顺便说一句:我知道Composer CLI environment variable,所以我想我可以要求导入项目 - mymain - 定义(和导出!)var COMPOSER_VENDOR_DIR。然后我的控制台脚本可以使用它来查找项目的自动加载器。但这似乎存在潜在问题:

  1. 我们希望该设置仅应用于 this 项目,但 shell var(和导出)将应用于从该 shell 会话访问的 所有 项目.似乎冒昧地依赖我的小依赖 - myvendor/mylib - 将其强加于导入项目。

  2. 原则上,依赖本身——myvendor/mylib——应该能够找到他需要的东西。将责任推给进口商似乎是不对的。

WDYT?提前致谢。欢迎提出想法。

【问题讨论】:

    标签: php autoload composer-php


    【解决方案1】:

    一种方法(在 IRC freenode #composer 上与 @igorw 讨论后得出,我正在解释并且我正在对其进行一些扩展)是让 bin 脚本 console.php 迭代文件系统,从 __DIR__ 开始,寻找autoload.php的存在。

    【讨论】:

    • 您实际上不需要迭代,您只需查找两个目录,因为这将匹配 //
    • @Seldaek:是的,我终于从jsonlint 中理解了您的示例并以这种方式实现了。非常感谢!
    • 似乎人们仍然对此有问题(我!)在这里找到了答案:stackoverflow.com/questions/35271282/…
    猜你喜欢
    • 2017-05-06
    • 2021-09-26
    • 2022-11-09
    • 2022-10-19
    • 1970-01-01
    • 2018-01-31
    • 1970-01-01
    • 1970-01-01
    • 2019-12-31
    相关资源
    最近更新 更多