【问题标题】:Composer update doesn’t install PHPUnit in Laravel?Composer 更新没有在 Laravel 中安装 PHPUnit?
【发布时间】:2014-06-28 23:39:15
【问题描述】:

我正在尝试通过ComposerPHPUnit 安装到Laravel 框架中。

问题是运行 composer update 后没有下载所需的文件。

我的流程是这样的:

首先,我在composer.json 中插入PHPUnit 需求。整个文件如下所示:

{
    "name": "laravel/laravel",
    "description": "The Laravel Framework.",
    "keywords": ["framework", "laravel"],
    "license": "MIT",
    "require": {
        "laravel/framework": "4.1.*",
        "laravelbook/ardent": "dev-master",
        "phpunit/phpunit": "4.2.*" // i have also tried with 3.7 and 3.8
    },
    "autoload": {
        "classmap": [
            "app/commands",
            "app/controllers",
            "app/models",
            "app/database/migrations",
            "app/database/seeds",
            "app/tests/TestCase.php",
            "app/filters"
        ]
    },
    "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"
        ]
    },
    "config": {
        "preferred-install": "dist"
    },
    "minimum-stability": "stable",
        "require": {
            "laravelbook/ardent": "dev-master"
        }

}

接下来,我运行composer update -vvv。转储看起来像这样(额外的怪异:这是从命令提示符复制的,如果我执行相同的命令但尝试使用 > 命令将其写入 txt 文件,则该过程会在 Downloading https://packagist.org/packages.json 行之后挂起)

C:\wamp\www\Dropbox\ltest>composer update -vvv
Reading ./composer.json
Executing command (CWD): git describe --exact-match --tags
Executing command (CWD): git branch --no-color --no-abbrev -v
Loading composer repositories with package information
Downloading https://packagist.org/packages.json
Writing C:/Users/aske/AppData/Local/Composer/repo/https---packagist.org/packages
.json into cache
Updating dependencies (including require-dev)
Reading C:/Users/aske/AppData/Local/Composer/repo/https---packagist.org/p-provid
er-active.json from cache
Reading C:/Users/aske/AppData/Local/Composer/repo/https---packagist.org/p-provid
er-archived.json from cache
Reading C:/Users/aske/AppData/Local/Composer/repo/https---packagist.org/p-provid
er-latest.json from cache
Reading C:/Users/aske/AppData/Local/Composer/repo/https---packagist.org/p-provid
er-stale.json from cache
Reading C:/Users/aske/AppData/Local/Composer/repo/https---packagist.org/provider
-laravelbook$ardent.json from cache
Reading C:/Users/aske/AppData/Local/Composer/repo/https---packagist.org/provider
-laravel$laravel.json from cache
Reading C:/Users/aske/AppData/Local/Composer/repo/https---packagist.org/provider
-psr$log.json from cache
Reading C:/Users/aske/AppData/Local/Composer/repo/https---packagist.org/provider
-symfony$http-foundation.json from cache
Reading C:/Users/aske/AppData/Local/Composer/repo/https---packagist.org/provider
-symfony$http-kernel.json from cache
Reading C:/Users/aske/AppData/Local/Composer/repo/https---packagist.org/provider
-stack$builder.json from cache
Reading C:/Users/aske/AppData/Local/Composer/repo/https---packagist.org/provider
-symfony$event-dispatcher.json from cache
Reading C:/Users/aske/AppData/Local/Composer/repo/https---packagist.org/provider
-symfony$debug.json from cache
Reading C:/Users/aske/AppData/Local/Composer/repo/https---packagist.org/provider
-predis$predis.json from cache
Reading C:/Users/aske/AppData/Local/Composer/repo/https---packagist.org/provider
-phpseclib$phpseclib.json from cache
Reading C:/Users/aske/AppData/Local/Composer/repo/https---packagist.org/provider
-nesbot$carbon.json from cache
Reading C:/Users/aske/AppData/Local/Composer/repo/https---packagist.org/provider
-monolog$monolog.json from cache
Reading C:/Users/aske/AppData/Local/Composer/repo/https---packagist.org/provider
-nikic$php-parser.json from cache
Reading C:/Users/aske/AppData/Local/Composer/repo/https---packagist.org/provider
-jeremeamia$superclosure.json from cache
Reading C:/Users/aske/AppData/Local/Composer/repo/https---packagist.org/provider
-jeremeamia$functionparser.json from cache
Reading C:/Users/aske/AppData/Local/Composer/repo/https---packagist.org/provider
-ircmaxell$password-compat.json from cache
Reading C:/Users/aske/AppData/Local/Composer/repo/https---packagist.org/provider
-filp$whoops.json from cache
Reading C:/Users/aske/AppData/Local/Composer/repo/https---packagist.org/provider
-d11wtq$boris.json from cache
Reading C:/Users/aske/AppData/Local/Composer/repo/https---packagist.org/provider
-symfony$console.json from cache
Reading C:/Users/aske/AppData/Local/Composer/repo/https---packagist.org/provider
-symfony$filesystem.json from cache
Reading C:/Users/aske/AppData/Local/Composer/repo/https---packagist.org/provider
-symfony$finder.json from cache
Reading C:/Users/aske/AppData/Local/Composer/repo/https---packagist.org/provider
-classpreloader$classpreloader.json from cache
Reading C:/Users/aske/AppData/Local/Composer/repo/https---packagist.org/provider
-patchwork$utf8.json from cache
Reading C:/Users/aske/AppData/Local/Composer/repo/https---packagist.org/provider
-swiftmailer$swiftmailer.json from cache
Reading C:/Users/aske/AppData/Local/Composer/repo/https---packagist.org/provider
-symfony$browser-kit.json from cache
Reading C:/Users/aske/AppData/Local/Composer/repo/https---packagist.org/provider
-symfony$css-selector.json from cache
Reading C:/Users/aske/AppData/Local/Composer/repo/https---packagist.org/provider
-symfony$dom-crawler.json from cache
Reading C:/Users/aske/AppData/Local/Composer/repo/https---packagist.org/provider
-symfony$process.json from cache
Reading C:/Users/aske/AppData/Local/Composer/repo/https---packagist.org/provider
-symfony$routing.json from cache
Reading C:/Users/aske/AppData/Local/Composer/repo/https---packagist.org/provider
-symfony$security.json from cache
Reading C:/Users/aske/AppData/Local/Composer/repo/https---packagist.org/provider
-symfony$translation.json from cache
Reading C:/Users/aske/AppData/Local/Composer/repo/https---packagist.org/provider
-laravel$framework.json from cache
Reading C:/Users/aske/AppData/Local/Composer/repo/https---packagist.org/provider
-doctrine$dbal.json from cache
Reading C:/Users/aske/AppData/Local/Composer/repo/https---packagist.org/provider
-doctrine$common.json from cache
Reading C:/Users/aske/AppData/Local/Composer/repo/https---packagist.org/provider
-doctrine$inflector.json from cache
Reading C:/Users/aske/AppData/Local/Composer/repo/https---packagist.org/provider
-doctrine$cache.json from cache
Reading C:/Users/aske/AppData/Local/Composer/repo/https---packagist.org/provider
-doctrine$collections.json from cache
Reading C:/Users/aske/AppData/Local/Composer/repo/https---packagist.org/provider
-doctrine$lexer.json from cache
Reading C:/Users/aske/AppData/Local/Composer/repo/https---packagist.org/provider
-doctrine$annotations.json from cache
Reading C:/Users/aske/AppData/Local/Composer/repo/https---packagist.org/provider
-illuminate$support.json from cache
Reading C:/Users/aske/AppData/Local/Composer/repo/https---packagist.org/provider
-illuminate$database.json from cache
Reading C:/Users/aske/AppData/Local/Composer/repo/https---packagist.org/provider
-illuminate$validation.json from cache
Reading C:/Users/aske/AppData/Local/Composer/repo/https---packagist.org/provider
-illuminate$container.json from cache
Reading C:/Users/aske/AppData/Local/Composer/repo/https---packagist.org/provider
-illuminate$events.json from cache
Reading C:/Users/aske/AppData/Local/Composer/repo/https---packagist.org/provider
-illuminate$auth.json from cache
Reading C:/Users/aske/AppData/Local/Composer/repo/https---packagist.org/provider
-illuminate$cache.json from cache
Reading C:/Users/aske/AppData/Local/Composer/repo/https---packagist.org/provider
-illuminate$config.json from cache
Reading C:/Users/aske/AppData/Local/Composer/repo/https---packagist.org/provider
-illuminate$console.json from cache
Reading C:/Users/aske/AppData/Local/Composer/repo/https---packagist.org/provider
-illuminate$cookie.json from cache
Reading C:/Users/aske/AppData/Local/Composer/repo/https---packagist.org/provider
-illuminate$encryption.json from cache
Reading C:/Users/aske/AppData/Local/Composer/repo/https---packagist.org/provider
-illuminate$exception.json from cache
Reading C:/Users/aske/AppData/Local/Composer/repo/https---packagist.org/provider
-illuminate$filesystem.json from cache
Reading C:/Users/aske/AppData/Local/Composer/repo/https---packagist.org/provider
-illuminate$foundation.json from cache
Reading C:/Users/aske/AppData/Local/Composer/repo/https---packagist.org/provider
-illuminate$hashing.json from cache
Reading C:/Users/aske/AppData/Local/Composer/repo/https---packagist.org/provider
-illuminate$html.json from cache
Reading C:/Users/aske/AppData/Local/Composer/repo/https---packagist.org/provider
-illuminate$http.json from cache
Reading C:/Users/aske/AppData/Local/Composer/repo/https---packagist.org/provider
-illuminate$log.json from cache
Reading C:/Users/aske/AppData/Local/Composer/repo/https---packagist.org/provider
-illuminate$mail.json from cache
Reading C:/Users/aske/AppData/Local/Composer/repo/https---packagist.org/provider
-illuminate$pagination.json from cache
Reading C:/Users/aske/AppData/Local/Composer/repo/https---packagist.org/provider
-illuminate$queue.json from cache
Reading C:/Users/aske/AppData/Local/Composer/repo/https---packagist.org/provider
-illuminate$redis.json from cache
Reading C:/Users/aske/AppData/Local/Composer/repo/https---packagist.org/provider
-illuminate$routing.json from cache
Reading C:/Users/aske/AppData/Local/Composer/repo/https---packagist.org/provider
-illuminate$session.json from cache
Reading C:/Users/aske/AppData/Local/Composer/repo/https---packagist.org/provider
-illuminate$translation.json from cache
Reading C:/Users/aske/AppData/Local/Composer/repo/https---packagist.org/provider
-illuminate$view.json from cache
Reading C:/Users/aske/AppData/Local/Composer/repo/https---packagist.org/provider
-illuminate$workbench.json from cache
Reading C:/Users/aske/AppData/Local/Composer/repo/https---packagist.org/provider
-symfony$security-acl.json from cache
Reading C:/Users/aske/AppData/Local/Composer/repo/https---packagist.org/provider
-symfony$security-core.json from cache
Reading C:/Users/aske/AppData/Local/Composer/repo/https---packagist.org/provider
-symfony$security-csrf.json from cache
Reading C:/Users/aske/AppData/Local/Composer/repo/https---packagist.org/provider
-symfony$security-http.json from cache
Nothing to install or update
Reading ./composer.lock
Generating autoload files
Executing command (CWD): php artisan clear-compiled
Executing command (CWD): php artisan optimize
Generating optimized class loader

最终所需的文件不会添加到vendor/bin/。据我所知,此时应该已将一个名为 phpunit.php 的文件放在那里,但没有任何迹象。

Here is my composer.lock 作为奖励信息,运行更新后没有任何 phpunit 的迹象。

【问题讨论】:

  • 这可能不相关,但是phpunit应该在require-dev中不需要,并尝试使用稳定的4.1.*,至于4.2,它是一个alpha版本。
  • 尝试将您的作曲家更新到最新版本,并删除 ~/.composer 中的任何缓存?前段时间我遇到了一些旧作曲家版本没有正确找到某些库的问题。
  • 嗨,奥利,我已经做了这些事情,但还是谢谢。
  • 嗨,Mamdouh,你是对的!我将依赖项添加到了require-dev,现在它可以工作了!如果您愿意,可以添加您的评论作为答案。这里的教训必须是:require 和 require dev 之间的区别不仅在于 composer 处理它们的方式。一些依赖项需要使用 require-dev 下载(当然无论如何都应该这样做)。作为一个简短的旁注:我必须运行三次“composer update --dev -vvv”,然后才能运行整个过程而不会挂在某个地方。似乎作曲家在下载时会有点不稳定......
  • @lowkey - 感谢您深入研究并提供反馈,我回答了这个问题,以及您的评论。显然, require 和 require-dev 不仅仅是标签和组织包依赖的一种方式,它还对包应该包含在哪里提供了严格的要求,正如你已经提到的。

标签: php json laravel-4 phpunit composer-php


【解决方案1】:

添加 PHPUnit 失败的原因是您的 composer.json 中有两个名为“require”的键,这是非法的。最后一个实例覆盖第一个实例 - 它覆盖了添加的 PHPUnit 要求。

只有将其更改为“require-dev”,这是一个不同的键,Composer 才能检测到您需要 PHPUnit。

{
    "name": "laravel/laravel",
    "description": "The Laravel Framework.",
    "keywords": ["framework", "laravel"],
    "license": "MIT",
    "require": {
        "laravel/framework": "4.1.*",
        "laravelbook/ardent": "dev-master",
        "phpunit/phpunit": "4.2.*" // i have also tried with 3.7 and 3.8
    },

    // deleted lines here...

    "minimum-stability": "stable",
        "require": {
            "laravelbook/ardent": "dev-master"
        }

}

看到提到“require”是 JSON 中最后一个缩进严重的键吗?这至少会让 Composer 感到困惑。我很确定“laravelbook/ardent”依赖于“laravel/framework”和很多其他东西,所以你没有看到你的第一个要求键被覆盖了。

建议:始终使用命令行来添加内容——这样更容易,而且您不必注意正确的 JSON 格式:

composer require --dev phpunit/phpunit:~4.0

这会将依赖项添加到 composer.json 文件中,如果没有冲突,则立即下载。它还将编写一个新的、格式清晰的 composer.json 文件。如果 Composer 有机会删除双键,您会很快发现错误。

【讨论】:

  • 谢谢,实际上这个答案似乎是正确的!关于通过命令行添加所有内容以尽可能自动化并消除语法/语义错误的好建议。
【解决方案2】:

正如我的评论所指出的那样,phpunit 应该在 require-dev 中,而不是要求,并尝试使用稳定的 4.1.* 版本,而不是 4.2,因为它是一个 alpha 版本。正如他在评论中提到的低调:

require 和 require dev 之间的区别不仅在于方式 作曲家处理它们。一些依赖项需要下载 require-dev (他们当然应该这样做)。作为一个简短的旁注:我 在运行之前必须运行三次“composer update --dev -vvv” 该过程无需挂在某处。似乎作曲家可以是 下载时有点不稳定

所以直接的答案是:phpunit 应该包含在 require-dev 中而不是 require,并且总是最好安装稳定版本而不是 beta。

【讨论】:

  • 事实上它起作用的结论是错误的。 PHPUnit 将作为“require”依赖项愉快地运行,但建议使用“require-dev”的原因是在生产中运行软件不需要它 - 如果您只添加所需的依赖项,它可以进行更干净的安装在生产服务器上运行的软件,而不是要开发的软件。
  • @Sven - 我同意你所说的,这就是为什么我在评论中提到这可能无关紧要。然而,结果是它在 require-dev 中与他一起工作,但并没有将它包含在 require 中。这就是我得出这个结论的原因。
猜你喜欢
  • 2015-05-16
  • 2014-11-11
  • 2018-05-13
  • 2018-08-17
  • 2013-09-12
  • 2015-01-18
  • 1970-01-01
  • 1970-01-01
  • 2017-11-10
相关资源
最近更新 更多