为什么composer安装--no-dev不起作用?

Jef*_*ett 5 php composer-php

我正在开发一个包含常规依赖项和一个dev依赖项的包库.Composer建议不要包含composer.lock库的文件,所以这里是composer.json

{
    "name": "myself/mypackage",
    "require": {
        "php": ">=5.6",
        "nesbot/carbon": "~1.20"
    },
    "require-dev": {
        "phpunit/phpunit": "^6.0"
    }
}
Run Code Online (Sandbox Code Playgroud)

我希望这与运行PHP 5.6的应用程序兼容,我希望使用最新的PHPUnit测试工具来开发它,这需要PHP 7.

在travis持续集成测试服务器上,我有一个构建矩阵,它运行PHP> 7上的PHPUnit测试和一个linting脚本:

composer install
./lint-php.bash
phpunit
Run Code Online (Sandbox Code Playgroud)

在PHP <7上,只需lint源代码:

composer install --no-dev
./lint-php.bash
Run Code Online (Sandbox Code Playgroud)

但是,它失败了,因为它忽略了--no-dev标志并尝试安装dev依赖项.

Your requirements could not be resolved to an installable set of packages.

  Problem 1
    - phpunit/phpunit 6.0.7 requires php ^7.0 -> your PHP version (5.6.5) does not satisfy that requirement.
    - phpunit/phpunit 6.0.6 requires php ^7.0 -> your PHP version (5.6.5) does not satisfy that requirement.
    - phpunit/phpunit 6.0.5 requires php ^7.0 -> your PHP version (5.6.5) does not satisfy that requirement.
    - phpunit/phpunit 6.0.4 requires php ^7.0 -> your PHP version (5.6.5) does not satisfy that requirement.
    - phpunit/phpunit 6.0.3 requires php ^7.0 -> your PHP version (5.6.5) does not satisfy that requirement.
    - phpunit/phpunit 6.0.2 requires php ^7.0 -> your PHP version (5.6.5) does not satisfy that requirement.
    - phpunit/phpunit 6.0.1 requires php ^7.0 -> your PHP version (5.6.5) does not satisfy that requirement.
    - phpunit/phpunit 6.0.0 requires php ^7.0 -> your PHP version (5.6.5) does not satisfy that requirement.
    - Installation request for phpunit/phpunit ^6.0 -> satisfiable by phpunit/phpunit[6.0.0, 6.0.1, 6.0.2, 6.0.3, 6.0.4, 6.0.5, 6.0.6, 6.0.7].
Run Code Online (Sandbox Code Playgroud)

它为什么忽略--no-dev国旗?我只是希望它安装我的常规依赖项并忽略该require-dev部分.

Jef*_*ett 6

尽管有建议,但这是因为您没有composer.lock文件,实际上是一个请求的功能.

首先,它尝试解决所有依赖项.如果失败,则中止.接下来,它运行实际安装,并在那时忽略dev依赖项.你的问题是它无法通过解决的第一步.所以并不是它忽略了--no-dev旗帜,它从来没有让它如此遥远.

选项1

如果您包含一个composer.lock文件,那么它会跳过依赖项解析并直接进入安装,此时它将跳过dev依赖项.

选项2

既然你没有包含一个库,而是一个可执行的工具,那么你可以完全将其从作曲家中拉出来并使用phive(PHAR安装和验证环境),而不是与之后可能包含的其他开发工具之间的潜在依赖冲突作斗争..