如何使用自己的作曲家自动加载另一个包

时间:2017-04-30 14:45:15

标签: php composer-php

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

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

我需要什么?

  1. 有人需要我的包裹

    作曲家需要tomas / my-package

  2. 将安装

  3. 它将使用PSR-4

  4. 自动加载我的包裹
  5. 它也会自动加载第三方套餐

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

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

    我已经在我的某个依赖项中尝试了这种情况,并且它没有工作 :(。

    此外,我已经与软件包作者交谈过,他并不想使用作曲家自动加载。他更喜欢自己的。

    感谢您的帮助!

2 个答案:

答案 0 :(得分:1)

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

我的灵感来自于PHPStan,它已经成为自动加载目录,在作曲家中错过了(几乎同样的问题)。

我添加了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

答案 1 :(得分:0)

您在composer.json文件中执行了一个非NO-NO:您正在为不在您的包中的代码定义自动加载。

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

我想知道你为什么要努力整合PHP Codesniffer,因为该软件包包含一个可用的自动加载定义。您需要做的只是"require": { "squizlabs/php_codesniffer": "^3.0@RC" }(如果您确实需要最新的3.x版本候选版,否则^2.8.0会更好。)

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

你说的唯一问题是"它没有工作" ,这是对问题的充分描述,因为你没有描述你在代码中做了什么,以及你得到了什么错误信息。还要说明你预期会发生什么,以及发生了什么(如果这不明显,这会如何偏离你的期望)。

相关问题