依赖项中的脚本需要Composer自动加载器的路径


Script in dependency needs path to Composer autoloader

我正在开发一个包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本身需要包括Composer生成的vendor/autoloader.php。当孤立地开发mylib时,脚本bin/console.php知道他自己相对于vendor/autoloader.php的位置,因此他可以很容易地包含它。但是,一旦它作为依赖项导入到另一个项目中(在本例中为myvendor/mymain),那么就只有mymain/vendor/autoloader.php脚本了。原则上,控制台脚本无法知道他相对于自动加载器脚本的位置。

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

BTW:我知道Composer CLI环境变量,所以我想我可以要求导入项目-mymain-定义(并导出!)var COMPOSER_VENDOR_DIR。然后我的控制台脚本可以使用它来查找项目的自动加载器。但这似乎有潜在的问题:

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

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

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

一种方法(来自于与@igorw在IRC freenode#composer上的讨论,我正在对此进行转述和扩展)是让bin脚本console.php__DIR__开始迭代文件系统,寻找autoload.php的存在。