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

时间:2012-09-03 04:13:36

标签: php autoload composer-php

我正在开发一个包 - 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。然后我的控制台脚本可以使用它来查找项目的自动加载器。但这似乎可能存在问题:

  1. 我们希望该设置仅适用于项目,但shell var(和导出)将应用于从该shell会话访问的所有项目。似乎对我的小依赖 - myvendor/mylib - 将其强加于导入项目是不可置疑的。

  2. 原则上,依赖本身 - myvendor/mylib - 应该能够找到他需要的东西。将责任放在进口商身上似乎没有问题。

  3. WDYT?提前致谢。欢迎提示。

1 个答案:

答案 0 :(得分:3)

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

的存在