编辑重要提示:我想要包含does not use composer autoload的包。我必须使用他们的hacky,我想避免这种情况。
我知道作曲家主要是如何运作的,我有一个可以作为依赖的包(这很重要,我知道如何在一个项目中完成这项工作,但是那个' s不是我要问的问题。
有人需要我的包裹
作曲家需要tomas / my-package
将安装
它将使用PSR-4
它也会自动加载第三方套餐
我已经尝试过这样的事情:
"autoload": {
"psr-4": {
"MyPackage\\": "src",
"PHP_CodeSniffer\\": "../../squizlabs/php_codesniffer/src"
}
}
我已经在我的某个依赖项中尝试了这种情况,并且它没有工作 :(。
此外,我已经与软件包作者交谈过,他并不想使用作曲家自动加载。他更喜欢自己的。
感谢您的帮助!
答案 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!
答案 1 :(得分:0)
您在composer.json
文件中执行了一个非NO-NO:您正在为不在您的包中的代码定义自动加载。
这将失败,正如你已经发现的那样。
我想知道你为什么要努力整合PHP Codesniffer,因为该软件包包含一个可用的自动加载定义。您需要做的只是"require": { "squizlabs/php_codesniffer": "^3.0@RC" }
(如果您确实需要最新的3.x版本候选版,否则^2.8.0
会更好。)
如果您需要PHP_Codesniffer而不是以某种方式在自动加载中引用它,那么Composer将尽一切努力来集成该软件包:下载它,将其添加到自动加载器,并在必要时运行它的代码。任何依赖于您的软件包的人都会安装此依赖项。
你说的唯一问题是"它没有工作" ,这是对问题的充分描述,因为你没有描述你在代码中做了什么,以及你得到了什么错误信息。还要说明你预期会发生什么,以及发生了什么(如果这不明显,这会如何偏离你的期望)。