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

Dav*_*aub 9 php autoload composer-php

我正在开发一个包 - myvendor/mylib我打算使用Composer分发,可能是通过Packagist.这个软件包包含一个命令行PHP脚本bin/console.php,我希望它可以用于项目 - 比如说myvendor/mymain- 导入mylib软件包.

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

{
    "name": "myvendor/mylib",
    "config" : {
        "bin" : ["bin/console.php"]
    }
}
Run Code Online (Sandbox Code Playgroud)

mymain项目执行一个作曲家安装/更新时,这mylib/bin/console.php是符号链接为mymain/bin/console.php进一步,我知道该mymain项目可以指定 - 在他自己composer.json- 希望依赖关系箱符号链接:

{
    "name": "myvendor/mymain",
    "config": {
        "bin-dir": "scripts"
    }   
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,控制台脚本然后符号链接为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?提前致谢.想法欢迎.

Dav*_*aub 3

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

  • 您不需要真正迭代,您只需查找两个目录即可,因为这将匹配 <vendor-name>/<package-name>/ (2认同)