Как использовать PHP-классы composer / composer для обновления отдельных пакетов

Я хочу использовать PHP-классы composer / composer для обновления отдельных пакетов плагинов.
Я не хочу использовать решения командной строки, такие как 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 локально и packages.json на сервере suc, чтобы выяснить,
какие пакеты требуют обновлений.

Обновить
Мне удалось, по крайней мере, заставить его работать. Проблема отсутствия вывода была вызвана тем, что $ application-> setAutoExit должно было быть ложным перед запуском. Следующая проблема, с которой я столкнулся, заключалась в том, что требуемый пакет загружался в тот же каталог, что и класс, откуда я его вызывал. Решил это, используя 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

Решение

Полное решение этого вопроса будет довольно долгим, но я постараюсь вывести вас на правильный путь.

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 — это, прежде всего, утилита для разработки и развертывания, а не утилита для приложений.

Чтобы беспрепятственно использовать его для облегчения загрузки плагинов в производственной среде, вам нужно будет тесно интегрировать его внутренние компоненты с вашим собственным приложением, а не просто использовать его на стороне.

Это то, что меня также интересует, и я думаю, что это вдохновило меня на то, чтобы самому заняться этим. Итак, я дам вам знать, что я придумаю, но это лучшее, что я могу вам посоветовать на данный момент о том, что я считаю правильным подходом.

2

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]