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

标签 php autoload composer-php

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

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

{
    "name": "myvendor/mylib",
    "config" : {
        "bin" : ["bin/console.php"]
    }
}

mymain 项目执行 Composer 安装/更新时,此 mylib/bin/console.php 被符号链接(symbolic link)为 mymain/bin/console.php 此外,我知道 mymain 项目可以指定 - 在他自己的 composer.json 中 - 想要依赖库被符号链接(symbolic link):

{
    "name": "myvendor/mymain",
    "config": {
        "bin-dir": "scripts"
    }   
}

在这种情况下,控制台脚本将被符号链接(symbolic link)为 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 脚本?

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

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

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

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

最佳答案

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

关于php - 依赖脚本需要 Composer 自动加载器的路径,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12241903/

相关文章:

php - Laravel:如果与公用文件夹子目录相同,则定义路由

php - 关于类别名的文档中是否存在错误?

laravel - "https://packagist.org/packages.json"文件无法下载: failed to open stream: Operation timed out

php bin/console symfony 命令给出一个 fatal error

php - 使用 foreach 处理错误并分解 PHP

php - 按 Log_time 排序但按组部分排序?

php - 如何在 Laravel 5.4 中播种数据透视表?

php - 自动加载函数最佳实践

php - 如何强制 composer dump-autoload 从头开始​​?

php - 我可以将 packagist.org 的依赖项与我自己的 Composer Satis 安装同步或镜像吗?