【问题标题】:Why is Composer unable to locate artisan when running the "composer install" command?为什么 Composer 在运行“composer install”命令时无法找到 artisan?
【发布时间】:2014-11-01 21:48:33
【问题描述】:

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

每次我尝试通过在我的项目目录中运行以下命令来创建一个名为“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 install

最后我得到了同样的错误。

虽然 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

得到初始错误,然后更新新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)”目录下的位置,因为这是 EasyPHP 及其 Apache Web 服务器的位置根,位于。在尝试获取使用空格的绝对路径时,我尝试使用下划线,它最终指向错误的路径,以及 \u0020,它会产生相同的错误。

所以问题仍然存在:

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

如果第一个问题无法回答,则会出现一组问题:
1. 有没有办法让作曲家在没有我的情况下识别工匠文件需要更改 composer.json 以包含 artisan 的绝对路径?
2. 我是否应该担心生成自动加载文件? (甚至有必要)
3. 如果我在需要运行作曲家更新或安装的任何时候将我的项目移动到桌面(或任何其他没有空格的路径),可以吗?

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

【问题讨论】:

    标签: php json windows-7 laravel-4 composer-php


    【解决方案1】:

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

    也尝试从命令行运行php artisan clear-compiled。它甚至可能不是作曲家的问题,而是 PHP 路径的问题。验证您的 Windows PATH 变量是否知道您的 php.exe 所在的位置。

    我刚刚在一个名为 "C:\MyPrograms\Some kind of folder\" 的文件夹中测试了一个全新安装,并且 composer 按预期运行,因此它可能与空格无关。

    您可以让作曲家以一种或另一种方式识别 php artisan。我的个人经验告诉我,将开发人员工具安装在 C:\Program Files 中并不是一个好主意,因为您会不断收到意外行为。我建议你在一个新文件夹中安装 PHP、Apache、EasyPHP 和任何你需要的东西(比如 "C:\MyPrograms")。

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

    至于你的其他问题:

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

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

    【讨论】:

    • 看来我要把 EasyPHP 安装到不同的位置
    【解决方案2】:

    我认为您在 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 作业名称,因为“作业名称 === 工作区目录名称”,并且备份模块在空间上起作用。

    【讨论】:

    • 这是一个非常烦人的错误。我想我已经学会了不要将软件放在带有空格的路径中。
    猜你喜欢
    • 2019-01-01
    • 2019-07-12
    • 2017-03-14
    • 1970-01-01
    • 2018-10-26
    • 2019-03-13
    • 1970-01-01
    • 2019-06-26
    • 1970-01-01
    相关资源
    最近更新 更多