Нужна помощь для \ Composer \ Installer :: создать и запустить - PullRequest
0 голосов
/ 29 января 2019

Я пытаюсь потребовать новый пакет 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' => "*"]);

С примером кода я смог:

  1. добавил "yiisoft / yii-core": "*Секция "to composer.json " require "
  2. composer.lock изменена (некоторые изменения времени существующего пакета), но" yiisoft / yii-core "нетдобавлен в composer.lock
  3. Пакет "yiisoft / yii-core" не добавлен в папку vendor .

Я застрял наэти 2 дня ... я думаю, что я почти там, но в Google действительно меньше документов.

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

Резюме моя цель:

  1. Возможность установить новый пакет composer с помощью простого PHP API $composer->install(["package-name", "version"]);
  2. Зарегистрировать пакет на composer.json и composer.lock, скачатьпакет в папку поставщика.
  3. Причина, по которой я это делаю, заключается в том, что я хочу настроить хранилище плагинов

Еще раз спасибо:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...