从PHP脚本安装Composer依赖项

时间:2013-12-23 03:16:37

标签: php wordpress composer-php

我一直在努力寻找一种在WordPress插件开发中管理Composer依赖性的好方法。在WordPress插件中包含依赖项很容易,但如果两个单独的插件都有composer.json / vendor目录,并且包含相同的包,则会发生冲突,一切都崩溃了。因此,我的工作解决方案实际上是提供一个API,允许插件将其依赖项推送到中央软件包管理器。

此解决方案在手动管理和通过命令行安装时工作正常,但WordPress显然很受欢迎,因为进入门槛低。通过命令行安装Composer软件包是一个很大的障碍,所以我开始创建一个插件来列出并安装所有共享的依赖项。我完成了中途,代码在Github上,here

我一直试图对Composer进行反向工程,运气有限。它变成了一团糟。我真的很好奇,如果有人有在CLI之外使用Composer的经验,或者如果有可能,或者除非所有这些,如果有任何策略可以使sorta复制功能而没有太大的问题。

我能够下载和安装东西,但我写了锁文件和自动加载器,这两者都是整个事情的关键部分。

TL / DR

  • 编写Composer以打包并通过CLI运行。
  • 我想在WordPress插件中使用或模仿其功能。
  • 有可能吗?
  • 有没有人这样做过?我可以查看现有的项目吗?
  • 我特别关注Autoloader和Lock文件的创建,但我对安装程序的实现也不满意。

2 个答案:

答案 0 :(得分:1)

与CLI一样,Composer与依赖项一样有效。 Composer CLI是作曲家库设计的一个实现。

作曲家实施

应用程序本身通过factory class引导composer

Factory::create(IOInterface $io, $config = null, $disablePlugins = false);

composer install命令首先提升installer

Installer::create(IOInterface $io, Composer $composer);

从那里设置一些运行时变量,无论是声明的还是默认的,都进入Installer::run()方法。

有关如何安装的详细信息,请参阅InstallCommand课程。

感兴趣的领域

为实现目标,您应该使用的大部分内容是为您的软件包实施repository。您可能需要查看ArrayRepository以及已安装存储库的变体以指导您的实施。拥有存储库后,您可以告诉作曲家您的软件包。

Installer::setAdditionalInstalledRepository(RepositoryInterface $repo)

值得关注的项目

元数据浏览器

  • Packagist - 广泛使用composer提供的所有内容
  • Wpackagist - 类似于packagist,同时为存储库提供伪数据
  • Satis - 使用composer生成类似于上述示例的包存储库

安装程序

答案 1 :(得分:-2)

首先,你有一个特定的问题,那么你应该解释这个问题,而不是你如何到达那里。

我写了一个小脚本来测试自动加载器生成或锁定文件创建的问题。

<?php

include __DIR__ . '/vendor/autoload.php';

$factory = new \Composer\Factory();

//$io =  new \Composer\IO\NullIO();
$io =  new \Composer\IO\ConsoleIO( 
    new \Symfony\Component\Console\Input\ArgvInput(),
    new \Symfony\Component\Console\Output\ConsoleOutput(),
    new \Symfony\Component\Console\Helper\HelperSet()
);

$composer = $factory->createComposer( $io );

$install = \Composer\Installer::create($io, $composer);

$install
    ->setDryRun( false )
    ->setVerbose( false )
    ->setPreferSource( false )
    ->setPreferDist( true )
    ->setDevMode( false )
    ->setRunScripts( true )
    ->setOptimizeAutoloader( false )
    ;

$install->run();

我从带有composer.json的目录中的命令行运行它,它可以工作。

要从webserver(php internal one)运行它,我使用NUllIO,它没有问题。

如果您指定问题,我会更新答案。

如果您希望某人修改您自己的代码,您应该付钱给他们(或我) 但不好说:在这里,看看我的github存储库,请修复bug