composer php在Docker中使用自己的Symfonypath(加载旧文件)

  • 我正在使用docker。
  • 发布更新命令(php类)在作曲者更新后运行。
  • 工作得很好,直到我做了Laravel更新5.4-> 5.5,下载了新的Symfony包
  • composer php清除caching没有帮助
  • composer php自我更新没有帮助
  • composer php签名是平等的

[Symfony \ Component \ Debug \ Exception \ FatalThrowableError]调用未定义的方法Illuminate \ 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 } 

结果:composer php自动加载自己的,旧的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为添加composer php的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 

composer php部分:

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

也许签名composer php不匹配,你必须知道签名可以改变,如果你想获得最后一个使用此urlhttps://composer.github.io/installer.sig

使用此片段validation签名。

 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;" 

我认为运行composer self-update命令更新composer php的签名。 另外我会build议尝试下面,如果你有SSH访问服务器:

  • 删除composer.lock
  • 删除vendor文件夹
  • 运行composer install

这应该解决你提到的所有问题。

这是我如何安装composer php(Alpine,php7.1-fpm,自编的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,dockerized和平稳运行)

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