为什么Composer在运行“;composer install”;命令


Why is Composer unable to locate artisan when running the "composer install" command?

我使用的是windows 7,并试图使用composer安装laravel 4.2。我的开发环境是EasyHP,但根据我所做的研究,这不是问题所在。

每次我试图创建一个新的laravel项目,称为"testapp",通过在我的项目目录中运行以下命令:

composer create-project laravel/laravel testapp --prefer-dist

安装是成功的,直到composer尝试生成"自动加载"文件,并输出以下行:

Generating autoload files
Could not open input file: artisan
Script php artisan clear-compiled handling the post-install-cmd event returned with an error
[RuntimeException]
Error Output:

如果我导航到在我的项目目录中创建的名为testapp的新文件夹,并运行

composer update

composer install

我最后也犯了同样的错误。

尽管composer似乎无法运行任何php-artisan命令,但通过导航到我的testapp文件夹并运行:

php artisan {any command here}

我可以完成任何我想要的手工命令。在做了一些研究之后,我发现问题出在作曲家本身。作曲家不知道如何找到手工文件。一个建议是,我编辑composer.json文件,这样artisan将由绝对路径而不是相对路径定义。所以我改了这个:

"scripts": {
        "post-install-cmd": [
            "php artisan clear-compiled",
            "php artisan optimize"
        ],
        "post-update-cmd": [
            "php artisan clear-compiled",
            "php artisan optimize"
        ],
        "post-create-project-cmd": [
            "php artisan key:generate"
        ]
},

到此:

"scripts": {
        "post-install-cmd": [
            "php C:''Program Files (x86)''EasyPHP-DevServer-14.1VC11''data''localweb''projects''testapp''artisan clear-compiled",
            "php C:''Program Files (x86)''EasyPHP-DevServer-14.1VC11''data''localweb''projects''testapp''artisan optimize"
        ],
        "post-update-cmd": [
            "php C:''Program Files (x86)''EasyPHP-DevServer-14.1VC11''data''localweb''projects''testapp''artisan clear-compiled",
            "php C:''Program Files (x86)''EasyPHP-DevServer-14.1VC11''data''localweb''projects''testapp''artisan optimize"
        ],
        "post-create-project-cmd": [
            "php C:''Program Files (x86)''EasyPHP-DevServer-14.1VC11''data''localweb''projects''testapp''artisan key:generate"
        ]
},

在testapp文件夹中的composer.json文件中。现在,当运行时

composer install

我在命令提示符下得到了这个输出:

Loading composer repositories with package information
Installing dependencies (including require-dev) from lock file
Warning: The lock file is not up to date with the latest changes in composer.json.
You may be getting outdated dependencies. Run update to update them.
Nothing to install or update
Generating autoload files
Script php C:'Program Files (x86)'EasyPHP-DevServer-14.1VC11'data'localweb'proje
cts'testapp'artisan clear-compiled handling the post-install-cmd event returned
with an error

[RuntimeException]
Error Output:

install [--prefer-source] [--prefer-dist] [--dry-run] [--dev] [--no-dev] [--no-p
lugins] [--no-custom-installers] [--no-scripts] [--no-progress] [-v|vv|vvv|--ver
bose] [-o|--optimize-autoloader] [packages1] ... [packagesN]

尽管我最初认为这个输出意味着更改composer.json不会解决问题,但我惊讶地发现,当绝对路径不包含空格时,更改composeer.json是有效的。

例如。我去了C:''Users''AlexLeung''DesDesktop,运行了

composer create-project laravel/laravel desktestapp --prefer-dist

得到了初始错误,然后更新了新desktestapp文件夹中的composer.json,使其看起来像

"scripts": {
        "post-install-cmd": [
            "php C:''Users''AlexLeung''Desktop''desktestapp''artisan clear-compiled",
            "php C:''Users''AlexLeung''Desktop''desktestapp''artisan optimize"
        ],
        "post-update-cmd": [
            "php C:''Users''AlexLeung''Desktop''desktestapp''artisan clear-compiled",
            "php C:''Users''AlexLeung''Desktop''desktestapp''artisan optimize"
        ],
        "post-create-project-cmd": [
            "php C:''Users''AlexLeung''Desktop''desktestapp''artisan key:generate"
        ]
},

,并运行

composer install

然后成功了。尽管这表明,如果我只是将laravel安装在没有空格的路径上,我就可以安装它,但我需要能够将它安装在"Program Files(x86)"目录下的位置,因为EasyHP及其Apache web服务器根目录就位于该目录下。在试图获得使用空格的绝对路径时,我尝试过使用下划线和''u0020,前者最终指向错误的路径,后者生成相同的错误。

所以问题仍然存在:

如何让composer识别新创建的testapp文件夹中的artisan文件

如果第一个问题无法回答,则生成一组问题:
1.有没有一种方法可以让composer识别artisan文件,而无需更改composer.json为artisan包含一个绝对路径
2.我是否应该考虑生成自动加载文件?(有必要吗)
3.如果我只是在需要运行composer更新或安装时将项目移动到桌面(或任何其他没有空格的路径),可以吗?

总的来说,我希望有一个完整的laravel安装,并能够在需要时使用方便的composer命令。

也许你的问题与某种权限有关,因为你试图在"C:''Program Files(x86)"中运行命令。尝试停用UAC,看看这是否有效。

同时尝试从命令行运行php artisan clear-compiled。这甚至可能不是composer的问题,而是PHP路径的问题。验证您的Windows PATH变量是否知道php.exe的位置。

我刚刚在一个名为"C:''MyPrograms''某种文件夹''"的文件夹中测试了一个干净的安装,composer按预期运行,所以它可能与空间无关。

您可以让composer以某种方式识别php-artisan。我的个人经验告诉我,在C:''Program Files''中安装开发工具不是一个好主意,因为你会不断出现意想不到的行为。我建议你安装PHP,Apache,EasyHP&新文件夹中需要的任何内容(如"C:''MyPrograms")。

无论如何,即使您在默认程序文件文件夹中安装了PHP和Apache,您也可以随时将Apache的文档根设置到另一个位置,这也可以解决您的问题。

至于你的其他问题:

2) 是的,这真的很有必要。自动加载文件(将位于vendor/composer/中)使您能够使用名称空间和自己的类,而不是include()require(),因为它将由Laravel自动完成。

3) 我想你可以这么做,它会起作用的。但是,每次需要作曲家更新时都要移动整个项目,这似乎很麻烦,也浪费了时间。

我想您在Composer中发现了一个错误。

这一行可能是为了使钩子中使用的命令可执行:

https://github.com/composer/composer/blob/a8adbfeb9fc7861deade782938222714168a22a8/src/Composer/Command/RunScriptCommand.php#L89

我怀疑realpath()与二进制目录的结果将返回正确的路径,但包括空格。putenv()看起来像是直接在shell上操作,它的参数是"PATH=C:'Path with spaces'somewhere;C:'PreviousPaths'"——这可能在Windows上不起作用。

你应该在Github上添加一个问题来解决这个问题。

根据经验,许多软件没有做好处理路径中空间的准备。最近,我不得不重命名我所有的Jenkins作业名称,因为"作业名称===工作区目录名",备份模块在空间上运行。