【问题标题】:How to autoload another package with own composer如何使用自己的作曲家自动加载另一个包
【发布时间】:2017-04-30 14:45:14
【问题描述】:

编辑重要提示:我想包含does not use composer autoload 的包。我必须使用他们的 hacky 并且我想避免这种情况。

我知道作曲家主要是如何工作的,并且我有可以作为依赖项的包(这很重要,我知道如何在一个项目中完成这项工作,但这不是我要问的)。

我需要什么?

  1. 有人需要我的包裹

    作曲家需要 tomas/my-package

  2. 它将安装

  3. 它将使用 PSR-4 自动加载我的包

  4. 它也会自动加载第三方包

我已经尝试过这样的事情:

"autoload": {
    "psr-4": {
        "MyPackage\\": "src",
        "PHP_CodeSniffer\\": "../../squizlabs/php_codesniffer/src"
    }
}

我已经在我的一个依赖项中尝试过,它不起作用 :(.

另外,我已经和包作者谈过了,他不想使用作曲家自动加载。他更喜欢自己的。

感谢您的帮助!

【问题讨论】:

  • “另外,我已经和包作者谈过了,他不想使用作曲家自动加载。他更喜欢自己的。”抛弃它并继续前进。生命太短了,不能使用非 Composer 包。
  • 这也是我的想法。但我认为我真的需要它,因为它为我做了很多工作,我在它上面构建了一个工具:github.com/Symplify/EasyCodingStandard

标签: php composer-php


【解决方案1】:

如果这些答案与我所描述的问题有关,则没有,所以我尝试发布最佳解决方案到目前为止

我在 PHPStan 中得到了启发,它具有自动加载目录的功能,而 Composer 中错过了这些(实际上是相同的问题)。

我添加了 RobotLoader

composer require nette/robot-loader

然后用静态方法创建LegacyCompatibility

use Nette\Loaders\RobotLoader;

// ...

public static function autoloadCodeSniffer(): void
{
    $robotLoader = new RobotLoader;
    $robotLoader->acceptFiles = '*.php';
    $robotLoader->setTempDirectory(sys_get_temp_dir() . '/_robot_loader');
    $robotLoader->addDirectory(getcwd() . '/vendor/squizlabs/php_codesniffer/src');
    $robotLoader->register();
}

我会在需要时调用它

LegacyCompatibility::autoloadCodeSniffer()

像魅力一样工作。但仍然欢迎更好的解决方案 +1!

Github Permalink

【讨论】:

    【解决方案2】:

    你在 composer.json 文件中做了一个很大的 NO-NO:你正在为不在你的包中的代码定义自动加载。

    这将失败,正如您已经发现的那样。

    我想知道您为什么要努力集成 PHP Codesniffer,因为该包包含一个有效的自动加载定义。您需要做的就是"require": { "squizlabs/php_codesniffer": "^3.0@RC" }(如果您真的需要最新的3.x 候选版本,否则^2.8.0 会更好)。

    如果您需要 PHP_Codesniffer 而不是在自动加载中以某种方式引用它,那么 Composer 将尽一切努力集成该包:下载它,将其添加到自动加载器,并在必要时运行它的代码。任何依赖于你的包的人也会安装这个依赖项。

    你陈述的唯一问题是“它不起作用”,这不足以描述问题,因为你没有描述你在代码中做了什么,以及你得到了什么错误信息.还要说明您预期会发生什么,以及实际发生了什么(以及如果这不明显,这与您的预期有何不同)。

    【讨论】:

    • 我意识到我没有包括开始这个的 PR。 CodeSnifer 没有作曲家自动加载,见:github.com/squizlabs/PHP_CodeSniffer/commit/…
    • 我也将此注释添加到问题的开头,因为我意识到它非常重要。感谢您指出这一点!
    猜你喜欢
    • 1970-01-01
    • 2018-08-26
    • 2014-08-16
    • 1970-01-01
    • 2013-12-09
    • 1970-01-01
    • 2018-04-02
    • 1970-01-01
    相关资源
    最近更新 更多