Composer использует собственный путь Symfony в докере (загрузка старых файлов)

  • Я использую докер.
  • Команда обновления обновления (php-класс) запускается после обновления композитора.
  • Хорошо работал, пока я не обновил версию Laravel 5.4- > 5.5, которая загружала новые пакеты Symfony.
  • сжатие кеша композитора не помогло
  • самообновление композитора не помогло
  • Подписи композитора равны.

[Symfony\Component\Debug\Exception\FatalThrowableError] Вызов undefined метод Осветить \Foundation\Console\ClosureCommand:: setHidden()

Я обрабатывал файлы, и этот метод существует в родительском классе! Я помещал эту маленькую вещь в конструктор, что происходит:

use Symfony\Component\Console\Command\Command as SymfonyCommand;

class Command extends SymfonyCommand
{
    public function __construct()
    {
        $r1 = new \ReflectionClass($this);
        $r2 = new \ReflectionClass(SymfonyCommand::class);
        var_dump([$r1->getFileName(), $r2->getFileName()]);
    }
// rest of class
}

Результат: композитор autoload собственный, более старый Command.php вместо этого из проекта.

array(2) {
  [0]=>
  string(91) "/var/www/html/vendor/laravel/framework/src/Illuminate/Foundation/Console/ClosureCommand.php"
  [1]=>
  string(67) "phar:///usr/bin/composer/vendor/symfony/console/Command/Command.php"
}

Я хотел бы знать, почему класс symfony не загружается из проекта, а из какого-то волшебного места и как я могу это исправить.


Дополнительная информация:

Dockerfile для php, который добавляет композитор:

# Composer
ENV PATH "/composer/vendor/bin:$PATH"
ENV COMPOSER_ALLOW_SUPERUSER 1
ENV COMPOSER_HOME /composer
ENV COMPOSER_VERSION 1.4.2

RUN curl -s -f -L -o /tmp/composer-setup.php https://getcomposer.org/installer
RUN curl -s -f -L -o /tmp/composer-setup.sig https://composer.github.io/installer.sig
RUN php -r " \
    \$signature_php = hash('SHA384', file_get_contents('/tmp/composer-setup.php')); \
    \$signature_sig = trim(file_get_contents('/tmp/composer-setup.sig')); \
    echo ' SIGNATURE PHP: [' . \$signature_php . \"]\\n\"; \
    echo ' SIGNATURE SIG: [' . \$signature_sig . \"]\\n\"; \
    if (\$signature_php !== \$signature_sig) { \
        unlink('/tmp/composer-setup.php'); \
        echo 'Integrity check failed, installer is either corrupt or worse.' . PHP_EOL; \
        exit(1); \
    }"
RUN php /tmp/composer-setup.php --no-ansi --install-dir=/usr/bin cd --filename=composer --version=${COMPOSER_VERSION} \
 && rm /tmp/composer-setup.php \
 && composer --ansi --version --no-interaction

Составная часть:

"post-update-cmd": [
   "Modules\\Core\\Composer\\ComposerScripts::postUpdate",
   "php artisan vendor:publish --tag=public --force",
   "php artisan optimize"
],

Ответы

Ответ 1

Возможно, подпись для получения композитора не соответствует, вы должны знать, что подпись может измениться, если вы хотите получить последний, используйте этот url https://composer.github.io/installer.sig

Используйте этот фрагмент для проверки подписи.

php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" && \
            php -r "if (hash_file('SHA384', 'composer-setup.php') === '$(wget -q -O - https://composer.github.io/installer.sig)') { \
                echo 'Installer good'; \
            } else { \
                echo 'Installer corrupt'; die; \
            } echo PHP_EOL;"

Ответ 2

Я думаю, что команда composer self-update также обновляет подпись композитора. Также я предлагаю попробовать следующее, если у вас есть ssh доступ к серверу:

  • Удалить composer.lock.
  • Удалите папку vendor.
  • Запустить composer install

Это должно исправить все упомянутые вами проблемы.

Ответ 3

вот как я устанавливаю композитор (Alpine, php7.1-fpm, self compiled nginx)

EXPECTED_COMPOSER_SIGNATURE=$(wget -q -O - https://composer.github.io/installer.sig) && \
php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" && \
php -r "if (hash_file('SHA384', 'composer-setup.php') === '${EXPECTED_COMPOSER_SIGNATURE}') { echo 'Composer.phar Installer verified'; } else { echo 'Composer.phar Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;" && \
php composer-setup.php --install-dir=/usr/bin --filename=composer && \
php -r "unlink('composer-setup.php');"

и попытайтесь изменить свою пост-установку на это (laravel 5.5, докеры и плавный ход)

    "post-update-cmd": [
        "Illuminate\\Foundation\\ComposerScripts::postUpdate",
        "php artisan optimize"
         .....