我的laravel 5.6项目的composer.json没有"版本"说明符。
所以我加入了我的composer.json:
"version": "0.1.0"
之后,当我运行composer install
,composer update foo/bar
或composer 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/21281和https://github.com/eyewitness/eye/issues/8,但是我把这些问题全部放在一起以解决问题。
同样,当我从composer.json中删除version
时,问题就消失了。
答案 0 :(得分:0)
原来这个错误是由我正在使用的作曲家版本引起的。
我正在使用laradock环境,composer --verison
为1.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
但我没有测试这个设置,我不确定。