Php 为什么Composer在运行“artisan”时无法找到artisan;composer安装";指挥部?

Php 为什么Composer在运行“artisan”时无法找到artisan;composer安装";指挥部?,php,json,windows-7,laravel-4,composer-php,Php,Json,Windows 7,Laravel 4,Composer Php,我正在使用Windows7并尝试使用composer安装Laravel4.2。我的开发环境是EasyHP,但根据我所做的研究,这不是问题所在 每次我试图通过在我的项目目录中运行以下命令来创建一个名为“testapp”的新laravel项目时: composer create-project laravel/laravel testapp --prefer-dist ..,安装成功,直到composer尝试生成“自动加载”文件并输出以下行: Generating autoload files C

我正在使用Windows7并尝试使用composer安装Laravel4.2。我的开发环境是EasyHP,但根据我所做的研究,这不是问题所在

每次我试图通过在我的项目目录中运行以下命令来创建一个名为“testapp”的新laravel项目时:

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似乎无法运行任何php artisan命令,但可以导航到我的testapp文件夹并运行:

php artisan {any command here}
我可以完成我想要的任何工匠命令。 在做了一些研究之后,我发现问题出在作曲家身上。Composer不知道如何查找artisan文件。 一个建议是编辑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不会解决问题,但我惊讶地发现,当绝对路径不包含空格时,更改composer.json是有效的

比如说。我转到C:\Users\AlexLeung\Desktop,运行

composer create-project laravel/laravel desktestapp --prefer-dist
获取初始错误,然后将new 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更改为i包含artisan的绝对路径?
2.我是否应该关心自动加载文件的生成?(有必要吗)
3.如果我在需要运行composer update或install的任何时候将项目移动到桌面(或任何其他没有空格的路径),可以吗


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

可能您的问题与某种权限有关,因为您试图在“C:\Program Files(x86)”中运行命令。尝试停用UAC,看看是否有效

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

我刚刚在一个名为“C:\MyPrograms\Some-Some-Think folder\”的文件夹中测试了一个干净的安装,composer按预期运行,因此它可能与空间无关

您可以让composer以某种方式识别php artisan。我的个人经验告诉我,在C:\Program文件中安装开发人员工具不是一个好主意,因为您将不断遇到意外行为。我建议您在新文件夹中安装PHP、Apache、EasyHP&您需要的任何东西(如“C:\MyPrograms”)

无论如何,即使在默认的ProgramFiles文件夹中安装了PHP和Apache,也可以将Apache的文档根目录设置到其他位置,这也可以解决您的问题

至于你的其他问题:

2) 是的,这确实是必要的。自动加载文件(将位于
vendor/composer/
)使您能够使用名称空间和自己的类,并且永远不会
include()
require()
,因为这将由Laravel自动完成


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

我认为您在composer中发现了一个bug

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

我怀疑带有二进制目录的
realpath()
的结果将返回正确的路径,但包括空格
putenv()
看起来像是直接在shell上操作,其参数为
“PATH=C:\PATH with spaces\where;C:\PreviousPaths\”
-这可能在Windows上不起作用

您应该在Github上添加一个问题来解决此问题


根据经验,很多软件都没有做好处理路径空间的准备。我最近不得不重命名我所有的Jenkins作业名,因为“作业名===工作区目录名”,而备份模块在这些空间上出现了问题。

看起来我要将EasyHP安装到另一个位置。这是一个非常恼人的错误。我想我已经学会了不要把软件放在有空格的路径上。
composer install