我正在开发一个包 - myvendor/mylib
- 我计划使用Composer进行分发,可能是通过Packagist进行分发。这个软件包包含一个命令行PHP脚本bin/console.php
,我希望它可以提供给项目 - 比如myvendor/mymain
- 导入mylib
包。
我知道我可以在mylib
包中指定config
中的composer.json
设置,其中包含要导入的二进制数组:
{
"name": "myvendor/mylib",
"config" : {
"bin" : ["bin/console.php"]
}
}
当mymain
项目执行作曲家安装/更新时,此mylib/bin/console.php
符号链接为mymain/bin/console.php
此外,我知道mymain
项目可以指定 - in他自己的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
脚本?
BTW:我知道Composer CLI environment variable,所以我想我可以要求导入项目 - mymain
- 定义(和导出!)var COMPOSER_VENDOR_DIR
。然后我的控制台脚本可以使用它来查找项目的自动加载器。但这似乎可能存在问题:
我们希望该设置仅适用于此项目,但shell var(和导出)将应用于从该shell会话访问的所有项目。似乎对我的小依赖 - myvendor/mylib
- 将其强加于导入项目是不可置疑的。
原则上,依赖本身 - myvendor/mylib
- 应该能够找到他需要的东西。将责任放在进口商身上似乎没有问题。
WDYT?提前致谢。欢迎提示。
答案 0 :(得分:3)
一种方法(来自与@igorw在IRC freenode #composer上的讨论,我正在解释并且我正在进行一些扩展)是让bin脚本console.php
迭代文件系统,从{开始{1}},寻找__DIR__
。