【问题标题】:Composer uses own Symfony path in docker (loading old files)Composer 在 docker 中使用自己的 Symfony 路径(加载旧文件)
【发布时间】:2018-03-24 04:53:26
【问题描述】:
  • 我正在使用 docker。
  • 发布更新命令(php 类)在作曲家更新后运行。
  • 在我更新 Laravel 5.4->5.5 之前运行良好,它下载了新的 Symfony 包
  • 作曲家清除缓存没有帮助
  • 作曲家自我更新没有帮助
  • 作曲家签名相等

[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 自动加载自己的旧 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 类不是从项目加载,而是从某个神奇的地方加载,以及如何解决这个问题。


附加信息:

添加 composer 的 php 的 Dockerfile:

# 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"
],

【问题讨论】:

  • 错误是什么时候出现的?
  • 通过 composer updatecomposer post-update-cmd 执行,其中包含构建 Laravel 应用程序的脚本。
  • composer diagnose 说什么?
  • 您的 post-update-cmd 在您的 composer.json 文件中的外观如何?

标签: php laravel symfony docker composer-php


【解决方案1】:

可能是获取composer的签名不匹配,要知道签名是可以改变的,如果要获取最后一个使用这个urlhttps://composer.github.io/installer.sig

使用这个 sn-p 验证签名。

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

【讨论】:

  • 感谢您的代码。我确实将我的更改为类似的东西。签名是平等的。 SIGNATURE PHP:[544e09ee996cdf60ece3804abc52599c22b1f40f4323403c44d44fdfdd586475ca9813a858088ffbc1f233e9b180f061]签名Sig:[544e09ee996cdf60ece3804abc52599c22b1f40f4323403c44d44fdfdd586475ca9813a858088ffbc1f233e9b180f061] 跨度>
【解决方案2】:

我认为运行composer self-update 命令也会更新作曲家的签名。如果您可以通过 ssh 访问服务器,我还建议您尝试以下操作:

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

这应该可以解决您提到的所有问题。

【讨论】:

  • 这是我做的第一件事。我什至可以删除symfony console package 并且会发生错误,因为composer 以某种方式存储了它自己的这个包的版本,与Laravel 5.5 的使用不兼容。更有趣的是,所有这些都在 docker 上,所以从头开始构建容器应该清除所有缓存。我觉得我什么都试过了:/
【解决方案3】:

这就是我安装作曲家的方式(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"
         .....

【讨论】:

  • 当然这将毫无问题地运行,因为原始的ComposerScripts 不会创建应用程序。我有自己的使用当前环境设置的脚本。从脚本引导应用程序足以触发错误。我的朋友们,我坚信这是作曲家加载自己的文件而不是项目问题(缓存或可能包含在作曲家包中)。
  • 只是为了排除所有可能...你能提供你自己的 ComposerScripts 类吗?
  • 首先尝试调用“Illuminate\\Foundation\\ComposerScripts::postUpdate”,您的脚本仍会进行所需的更改。你有没有把你的“服务提供者”行放在 config/app.php 中?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-18
  • 1970-01-01
  • 1970-01-01
  • 2012-12-03
  • 1970-01-01
相关资源
最近更新 更多