如何使用composer / composer PHP类更新单个包

时间:2014-09-17 14:42:36

标签: php composer-php

我想使用composer / composer PHP类来更新各个插件包。 我不想使用像exec这样的命令行解决方案(“php composer.phar update”);

我无法让它发挥作用。我尝试了几种不同的选项,类似于以下代码。 它只会返回一个空白屏幕。

    use Composer\Console\Application;
    use Symfony\Component\Console\Input\ArrayInput;
    use Symfony\Component\Console\Output\BufferedOutput;

    $input = new ArrayInput(array('command' => 'require vendor/packkage dev-master'));
    $output = new BufferedOutput();
    $application = new Application();

    $application->run($input, $output);
    dd($output->fetch());

我想要实现的目标:

  • 下载/更新个别包
  • 获取结果输出以验证是否成功
  • 转储自动加载
  • 删除/要求包

一些上下文细节:

我正在为我的PHP应用程序创建一个插件更新程序(在管理面板中)。 每个插件都是一个作曲家包,并且驻留在我自己的Satis存储库中。 使用我的composer插件将插件安装到自定义目录中。 我可以在本地读取composer.lock并在satisf服务器上读取packages.json来搞清楚 什么包需要更新。

更新 我设法至少让它上班。无输出问题是由于$ application-> setAutoExit在运行之前需要为false。我的下一个问题是所需的包将自己下载到与我调用它的类相同的目录中。通过使用putenv和chdir解决了这个问题。结果:

根/ comp.php

putenv('COMPOSER_HOME=' . __DIR__ . '/vendor/bin/composer');
chdir(__DIR__);

根/工作台/ sumvend / sumpack / SRC / PackageManager.php

include(base_path() . '/comp.php');
$input = new ArrayInput(array('command' => 'require', 'packages' => ['vend/pak dev-master']));
$output = new BufferedOutput();
$application = new Application();

$application->setAutoExit(false);
$application->run($input, $output); //, $output);
dd($output->fetch());

这很有效,但它远非理想。

1 个答案:

答案 0 :(得分:2)

完全解决这个问题的方法很长,但我会尽力让你走上正轨。

php composer.phar require composer/composer dev-master

您可以将作曲家的来源加载到项目供应商中。你可能已经这样做了。

您要查找的代码位于:Composer\Command\RequireCommand

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

$install
    ->setVerbose($input->getOption('verbose'))
    ->setPreferSource($input->getOption('prefer-source'))
    ->setPreferDist($input->getOption('prefer-dist'))
    ->setDevMode($updateDevMode)
    ->setUpdate(true)
    ->setUpdateWhitelist(array_keys($requirements))
    ->setWhitelistDependencies($input->getOption('update-with-dependencies'));
;

$status = $install->run();

大多数命令与composer.json文件的读写有关。 但是,安装程序本身与配置实际来自何处无关。理论上,您可以将配置存储在数据库中。

这是安装程序的静态创建方法:

public static function create(IOInterface $io, Composer $composer)
{
    return new static(
        $io,
        $composer->getConfig(),
        $composer->getPackage(),
        $composer->getDownloadManager(),
        $composer->getRepositoryManager(),
        $composer->getLocker(),
        $composer->getInstallationManager(),
        $composer->getEventDispatcher(),
        $composer->getAutoloadGenerator()
    );
}

您需要特别注意Package,并实施自己的。

虽然您当前尝试在命令行上运行它会起作用,但我不推荐它,因为Composer主要是一个开发和部署实用程序,而不是应用程序实用程序。

为了顺利地使用它来协助在生产环境中加载插件,您需要将其内部与您自己的应用程序紧密集成,而不仅仅是在侧面使用它。

这也是我感兴趣的东西,我认为这激励我自己去研究它。所以我会告诉你我的想法,但这是我现在可以建议你做的最好的方法。