9

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

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

{
    "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. 我们希望该设置仅适用于项目,但 shell var(和导出)将适用于从该 shell 会话访问的所有项目。似乎对我的小依赖很冒昧myvendor/mylib- 将其强加于导入项目。

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

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

4

1 回答 1

3

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

于 2012-09-04T03:24:43.273 回答