我已经花了一段时间研究如何在WordPress插件开发中管理Composer依赖关系。在WordPress插件中包含依赖关系很容易,但如果两个单独的插件都有composer.json/vvendor目录,并且包含同一个包,则会发生冲突,一切都会崩溃。因此,我的工作解决方案本质上是提供一个API,允许插件将其依赖关系推送到中央包管理器中。
这个解决方案在手动管理和通过命令行安装时运行良好,但WordPress显然很受欢迎,因为它的入门门槛很低。通过命令行安装Composer包是一个很高的入门门槛,所以我开始创建一个插件来列出和安装所有共享依赖项。我已经完成了一半,代码在Github上,在这里。
我一直在尝试对Composer进行逆向工程,但运气很差。它变得一团糟。我真的很好奇是否有人有在CLI之外使用Composer的经验,或者是否有可能,或者除此之外,是否有任何策略可以在没有太大问题的情况下对复制功能进行排序。
我可以下载并安装一些东西,但我在编写锁定文件和自动加载器时遇到了麻烦,这两个部分都是整个过程中非常关键的部分。
tl/dr:
- Composer被编写为打包并通过CLI运行
- 我想在WordPress插件中使用或模仿它的功能
- 有可能吗
- 有人这样做过吗?是否有我可以查看的现有项目
- 我特别关心Autoloader和Lock文件的创建,但我对安装程序的实现也不满意
Composer作为依赖项的工作效果与CLI一样好。Composer CLI是Composer库的一个实现
Composer实现
应用程序本身通过工厂类引导composer
。
Factory::create(IOInterface $io, $config = null, $disablePlugins = false);
composer install
命令从提升安装程序开始
Installer::create(IOInterface $io, Composer $composer);
从那里,它设置了一些运行时变量,无论是声明的还是默认的,并进入Installer::run()
方法。
有关如何进行安装的更多详细信息,请参阅InstallCommand
类。
感兴趣的领域
为了实现您的目标,您应该进行的大部分工作是为您的包实现repository
。您可能希望了解ArrayRepository
和已安装存储库的变体,以指导您的实现。一旦您有了一个存储库,您就可以告诉composer您的包。
Installer::setAdditionalInstalledRepository(RepositoryInterface $repo)
值得注意的项目
元数据浏览器
- Packagist-广泛使用
composer
- Wpackagist-类似于
packagist
,同时为存储库提供伪数据 - Satis-使用
composer
生成类似于上述示例的包存储库
安装程序
- 嵌入式composer-将外部依赖项与应用程序依赖项合并
首先,你有一个特定的问题,然后你应该解释这个问题,而不是你是如何到达那里的。
我写了一个小脚本来测试自动加载程序生成或锁定文件创建的问题。
<?php
include __DIR__ . '/vendor/autoload.php';
$factory = new ComposerFactory();
//$io = new ComposerIONullIO();
$io = new ComposerIOConsoleIO(
new SymfonyComponentConsoleInputArgvInput(),
new SymfonyComponentConsoleOutputConsoleOutput(),
new SymfonyComponentConsoleHelperHelperSet()
);
$composer = $factory->createComposer( $io );
$install = ComposerInstaller::create($io, $composer);
$install
->setDryRun( false )
->setVerbose( false )
->setPreferSource( false )
->setPreferDist( true )
->setDevMode( false )
->setRunScripts( true )
->setOptimizeAutoloader( false )
;
$install->run();
我用composer.json在目录中的命令行中运行它,它就可以工作了。
要从Web服务器(php内部服务器)运行它,我使用NUllIO,它工作起来没有问题。
如果你指定问题,我会更新答案。
如果你想让别人修复你自己的代码,你应该付钱给他们(或我)但不可以说:在这里,看看我的github存储库,请修复错误