Я пытаюсь потребовать новый пакет composer с использованием PHP, и после огромных исследований в Google я обнаружил, что Composer предоставил официальную опцию \ Composer \ Installer , и я начал создавать мини-прототип.
$installer->run()
верните мне 0
, что означает успех, но результат не тот, который я ожидал, я думаю, что сделал что-то не так.
<?php
//...
$installer = Installer::create($io, $composer)
->setPreferDist()
->setSkipSuggest()
->setUpdate()
->setDumpAutoloader()
->setRunScripts(false)
->setOptimizeAutoloader(true);
try {
$status = $installer->run();
} catch (\Throwable $exception) {
$status = 1;
}
//...
Это мой полный PHP-скрипт:
<?php
namespace mlaxwong\composer;
use Composer\Factory;
use Composer\Installer;
use Composer\Json\JsonFile;
use Composer\Json\JsonManipulator;
use Composer\IO\IOInterface;
use Composer\IO\NullIO;
use Composer\Package\Locker;
class Composer
{
public function install(array $requirements, IOInterface $io = null)
{
// try everything I can ..... ignore this 4 lines
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
ini_set('memory_limit', '-1');
if ($io === null) $io = new NullIO;
$jsonPath = dirname(__DIR__) . '/composer.json';
$wd = dirname($jsonPath);
// chdir($wd);
$backup = file_get_contents($jsonPath);
$config = $this->composerConfig($io, $jsonPath, true);
$composer = Factory::create($io, $config);
$lockFile = pathinfo($jsonPath, PATHINFO_EXTENSION) === 'json'
? substr($jsonPath, 0, -4) . 'lock'
: $jsonPath . '.lock';
$rm = $composer->getRepositoryManager();
$im = $composer->getInstallationManager();
$locker = new Locker($io, new JsonFile($lockFile, null, $io), $rm, $im, file_get_contents($jsonPath));
$composer->setLocker($locker);
$success = true;
$manipulator = new JsonManipulator(file_get_contents($jsonPath));
$requireKey = 'require';
$removeKey = 'require-dev';
foreach ($requirements as $package => $constraint)
{
if (
!$manipulator->addLink($requireKey, $package, $constraint, true) ||
!$manipulator->removeSubNode($removeKey, $package)
) {
$success = false;
break;
}
}
if ($success) file_put_contents($jsonPath, $manipulator->getContents());
$installer = Installer::create($io, $composer)
->setPreferDist()
->setSkipSuggest()
->setUpdate()
->setDumpAutoloader()
->setRunScripts(false)
->setOptimizeAutoloader(true);
try {
$status = $installer->run();
} catch (\Throwable $exception) {
$status = 1;
}
// chdir($wd);
if ($status !== 0)
{
file_put_contents($jsonPath, $backup);
throw $exception ?? new \Exception('An error occurred');
}
}
protected function composerConfig(IOInterface $io, string $jsonPath, bool $prepForUpdate = true): array
{
$file = new JsonFile($jsonPath, null, $io);
$config = $file->read();
return $config;
}
}
и протестировано с:
<?php
require dirname(__DIR__) . '/vendor/autoload.php';
use mlaxwong\composer\Composer;
$composer = new Composer;
$composer->install(['yiisoft/yii-core' => "*"]);
С примером кода я смог:
- добавил "yiisoft / yii-core": "*Секция "to composer.json " require "
- composer.lock изменена (некоторые изменения времени существующего пакета), но" yiisoft / yii-core "нетдобавлен в composer.lock
- Пакет "yiisoft / yii-core" не добавлен в папку vendor .
Я застрял наэти 2 дня ... я думаю, что я почти там, но в Google действительно меньше документов.
Мне действительно нужна ваша помощь, извините за мой английский и т. д.Anks за время ожидания, чтобы прочитать мой вопрос.
Резюме моя цель:
- Возможность установить новый пакет composer с помощью простого PHP API
$composer->install(["package-name", "version"]);
- Зарегистрировать пакет на composer.json и composer.lock, скачатьпакет в папку поставщика.
- Причина, по которой я это делаю, заключается в том, что я хочу настроить хранилище плагинов
Еще раз спасибо:)