Php 依赖项中的脚本需要到Composer autoloader的路径

Php 依赖项中的脚本需要到Composer autoloader的路径,php,autoload,composer-php,Php,Autoload,Composer Php,我正在开发一个包-myvendor/mylib,我计划使用Composer分发它,可能是通过Packagist。除其他外,这个包还包含一个命令行PHP脚本bin/console.PHP,我想将它提供给导入mylib包的项目,比如myvendor/mymain 我知道我可以在mylib包中指定composer.json中的config设置,其中包含要导入的容器数组: { "name": "myvendor/mylib", "config" : { "bin" : [

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

我知道我可以在
mylib
包中指定
composer.json
中的
config
设置,其中包含要导入的容器数组:

{
    "name": "myvendor/mylib",
    "config" : {
        "bin" : ["bin/console.php"]
    }
}
mymain
项目安装/更新composer时,这个
mylib/bin/console.php
被符号链接为
mymain/bin/console.php
此外,我知道
mymain
项目可以在他自己的
composer.json
中指定他希望将依赖项bin符号链接到的位置:

{
    "name": "myvendor/mymain",
    "config": {
        "bin-dir": "scripts"
    }   
}
在本例中,控制台脚本随后被符号链接为
scripts/console.php

这很好用——顺便说一句,当所有人都出去时,这很酷

但是,脚本
bin/console.php
本身需要包含生成的编写器
vendor/autoloader.php
。在单独开发
mylib
时,脚本
bin/console.php
知道自己相对于
vendor/autoloader.php
的位置,因此可以轻松地包含它。但是,一旦它作为依赖项导入到另一个项目中-
myvendor/mymain
,在本例中,那么只有
mymain/vendor/autoloader.php
脚本。原则上,控制台脚本无法知道相对于自动加载脚本,它驻留在何处

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

顺便说一句:我知道,所以我想我可以要求导入项目-
mymain
-定义(并导出!)var
COMPOSER\u VENDOR\u DIR
。然后我的控制台脚本可以使用它来查找项目的自动加载程序。但这似乎有潜在的问题:

  • 我们希望该设置仅应用于此项目,但shell变量(和导出)将应用于从该shell会话访问的所有项目。似乎有点自以为是,我有点依赖性-
    myvendor/mylib
    ,把它强加给导入项目

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


  • WDYT?提前谢谢。欢迎您的想法。

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

    的存在,您实际上不需要迭代,只需查找两个dir,因为这将匹配//@Seldaek:对,我终于从中理解了您的示例,并以这种方式实现了它。谢谢你!似乎人们仍然对此(我!)有疑问,在这里找到了答案: