laravel将版本添加到composer.json postAutoloadDump失败

时间:2018-03-25 11:44:29

标签: laravel composer-php

我的laravel 5.6项目的composer.json没有"版本"说明符。

所以我加入了我的composer.json:

"version": "0.1.0"

之后,当我运行composer installcomposer update foo/barcomposer dump-autoload时,会发生以下错误:

> Illuminate\Foundation\ComposerScripts::postAutoloadDump
> @php artisan package:discover
PHP Fatal error:  Uncaught Error: Call to undefined method Symfony\Component\Process\ProcessUtils::escapeArgument() in phar:///usr/local/bin/composer/src/Composer/Util/ProcessExecutor.php:134
Stack trace:
#0 phar:///usr/local/bin/composer/src/Composer/EventDispatcher/EventDispatcher.php(260): Composer\Util\ProcessExecutor::escape('1')
#1 phar:///usr/local/bin/composer/src/Composer/EventDispatcher/EventDispatcher.php(232): Composer\EventDispatcher\EventDispatcher->getPhpExecCommand()
#2 phar:///usr/local/bin/composer/src/Composer/EventDispatcher/EventDispatcher.php(96): Composer\EventDispatcher\EventDispatcher->doDispatch(Object(Composer\Script\Event))
#3 phar:///usr/local/bin/composer/src/Composer/Autoload/AutoloadGenerator.php(312): Composer\EventDispatcher\EventDispatcher->dispatchScript('post-autoload-d...', true, Array, Array)
#4 phar:///usr/local/bin/composer/src/Composer/Installer.php(301): Composer\Autoload\AutoloadGenerator->dump(Object(Composer\Config), Object(Composer\Repository\InstalledFilesystemRepository), Object in phar:///usr/local/bin/composer/src/Composer/Util/ProcessExecutor.php on line 134

Fatal error: Uncaught Error: Call to undefined method Symfony\Component\Process\ProcessUtils::escapeArgument() in phar:///usr/local/bin/composer/src/Composer/Util/ProcessExecutor.php:134
Stack trace:
#0 phar:///usr/local/bin/composer/src/Composer/EventDispatcher/EventDispatcher.php(260): Composer\Util\ProcessExecutor::escape('1')
#1 phar:///usr/local/bin/composer/src/Composer/EventDispatcher/EventDispatcher.php(232): Composer\EventDispatcher\EventDispatcher->getPhpExecCommand()
#2 phar:///usr/local/bin/composer/src/Composer/EventDispatcher/EventDispatcher.php(96): Composer\EventDispatcher\EventDispatcher->doDispatch(Object(Composer\Script\Event))
#3 phar:///usr/local/bin/composer/src/Composer/Autoload/AutoloadGenerator.php(312): Composer\EventDispatcher\EventDispatcher->dispatchScript('post-autoload-d...', true, Array, Array)
#4 phar:///usr/local/bin/composer/src/Composer/Installer.php(301): Composer\Autoload\AutoloadGenerator->dump(Object(Composer\Config), Object(Composer\Repository\InstalledFilesystemRepository), Object in phar:///usr/local/bin/composer/src/Composer/Util/ProcessExecutor.php on line 134

当我删除version说明符时,一切都按预期工作。

这是我的composer.json

{
    "name": "myvendor/myproject",
    "description": "",
    "keywords": [],
    "license": "MIT",
    "version": "0.1.0",
    "type": "project",
    "require": {
        "php": "^7.1.3",
        "fideloper/proxy": "^4.0",
        "laravel/framework": "5.6.*",
        "laravel/tinker": "^1.0"
    },
    "require-dev": {
        "barryvdh/laravel-ide-helper": "^2.4",
        "doctrine/dbal": "^2.6",
        "filp/whoops": "^2.0",
        "friendsofphp/php-cs-fixer": "^2.10",
        "fzaninotto/faker": "^1.4",
        "mockery/mockery": "^1.0",
        "nunomaduro/collision": "^2.0",
        "phpunit/phpunit": "^7.0"
    },
    "autoload": {
        "classmap": [
            "database/seeds",
            "database/factories"
        ],
        "psr-4": {
            "App\\": "app/"
        }
    },
    "autoload-dev": {
        "psr-4": {
            "Tests\\": "tests/"
        }
    },
    "extra": {
        "laravel": {
            "dont-discover": [
            ]
        }
    },
    "scripts": {
        "post-root-package-install": [
            "@php -r \"file_exists('.env') || copy('.env.example', '.env');\""
        ],
        "post-create-project-cmd": [
            "@php artisan key:generate"
        ],
        "post-autoload-dump": [
            "Illuminate\\Foundation\\ComposerScripts::postAutoloadDump",
            "@php artisan package:discover"
        ]
    },
    "config": {
        "preferred-install": "dist",
        "sort-packages": true,
        "optimize-autoloader": true
    },
    "minimum-stability": "dev",
    "prefer-stable": true
}

所以它告诉我Symfony\Component\Process\ProcessUtils::escapeArgument未定义。我还发现了https://github.com/laravel/framework/issues/21281https://github.com/eyewitness/eye/issues/8,但是我把这些问题全部放在一起以解决问题。

同样,当我从composer.json中删除version时,问题就消失了。

1 个答案:

答案 0 :(得分:0)

原来这个错误是由我正在使用的作曲家版本引起的。

我正在使用laradock环境,composer --verison1.5.5。将作曲家更新为1.6.3后,问题就消失了。

但是,如果您遇到同样的问题,您很可能会遇到同样的困难,在laradock的工作区容器中更新composer。你不能简单地composer selfupdate,因为由于权限设置,作曲家在将临时文件移动到/usr/local/bin时会遇到问题。

我通过将以下部分添加到我的laradock / workspace / Dockerfile-72来修复它:

#####################################
# Composer:
#####################################

## FIX laradock/workspace permission problem

USER root

RUN rm /usr/local/bin/composer

USER laradock

RUN cd /home/laradock && php -r "copy('https://getcomposer.org/installer', 'composer-setup.php');" && \
    php -r "if (hash_file('SHA384', 'composer-setup.php') === '544e09ee996cdf60ece3804abc52599c22b1f40f4323403c44d44fdfdd586475ca9813a858088ffbc1f233e9b180f061') { echo 'Installer verified'; } else { echo 'Installer corrupt'; unlink('composer-setup.php'); } echo PHP_EOL;" && \
    php composer-setup.php && \
    php -r "unlink('composer-setup.php');"

USER root 

RUN mv /home/laradock/composer.phar /usr/local/bin/composer

## ENDFIX

我猜,问题是,https://github.com/laradock/workspace/blob/master/Dockerfile-72没有执行composer-setup.php(参见@Raaghu的回答:permission denied for composer in /usr/local/bin/)。

通过简单地将其添加到laradock /工作区Dockerfile中,可能更容易解决问题:

USER root

RUN chown laradock:laradock /usr/local/bin/composer

但我没有测试这个设置,我不确定。