Why composer install --no-dev does not work? - php

I am developing a package library which has regular dependencies and one dev dependency. Composer recommends to not include the composer.lock file for libraries, so here is the composer.json
{
"name": "myself/mypackage",
"require": {
"php": ">=5.6",
"nesbot/carbon": "~1.20"
},
"require-dev": {
"phpunit/phpunit": "^6.0"
}
}
I want this to be compatible for use with applications running PHP 5.6, and I want to develop it using the latest PHPUnit testing tools which require PHP 7.
On the travis continuous integration testing server, I have a build matrix which runs the PHPUnit tests on PHP > 7 and a linting script:
composer install
./lint-php.bash
phpunit
and on PHP < 7, simply lint the source code:
composer install --no-dev
./lint-php.bash
However, it fails because it ignores the --no-dev flag and tries to install the dev dependency anyway.
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].
Why is it ignoring the --no-dev flag? I just want it to install my regular dependencies and to ignore the require-dev section.

Despite the recommendation, this is because you don't have a composer.lock file, and is actually a requested feature.
First, it tries to resolve all dependencies. If this fails, it aborts. Next, it runs the actual install, and at that time ignores the dev dependencies. Your problem is that it couldn't pass the first step for resolution. So it's not that it ignored the --no-dev flag, it just never made it that far.
Option 1
If you include a composer.lock file, then it skips the dependency resolution and goes straight to installation at which time it will skip the dev dependencies.
Option 2
Since you're not including a library, but rather an executable tool, then instead of fighting the potential dependency conflicts between other dev tools you may include later, just pull it out of composer entirely and use phive (The PHAR Installation and Verification Environment).

Related

Cant run composer install because a mismatch in PHP version

I have PHP version 8.1.5 as I'm writing this and I'm trying to experiment with older github repo like trix tutorial for example and a problem occurs when I tried to run composer install an error that said
Your lock file does not contain a compatible set of packages. Please run composer update.
Problem 1
- Root composer.json requires php ^7.2.5 but your php version (8.1.5) does not satisfy that requirement.
Problem 2
- doctrine/inflector is locked to version 1.3.1 and an update of this package was not requested.
- doctrine/inflector 1.3.1 requires php ^7.1 -> your php version (8.1.5) does not satisfy that requirement.
Problem 3
- doctrine/lexer is locked to version 1.2.0 and an update of this package was not requested.
- doctrine/lexer 1.2.0 requires php ^7.2 -> your php version (8.1.5) does not satisfy that requirement.
Problem 4
- dragonmantank/cron-expression is locked to version v2.3.0 and an update of this package was not requested.
- dragonmantank/cron-expression v2.3.0 requires php ^7.0 -> your php version (8.1.5) does not satisfy that requirement.
Problem 5
- laravel/framework is locked to version v7.2.1 and an update of this package was not requested.
- laravel/framework v7.2.1 requires php ^7.2.5 -> your php version (8.1.5) does not satisfy that requirement.
...
I certainly don't want to downgrade my PHP version is there a way to upgrade those packages to be compatible with my PHP version?
so far I've tried
change my composer.json file
"require": {
"php": ">=8.1.5",
...
},
and
"require": {
"php": ">=7.2.5",
...
},
and running both composer install and composer update php --with-all-dependencies
You can also use Composer's --ignore-platform-reqs switch to install packages. It will install packages without complaining, but it's not guaranteed that your code will run.

Installing Amazon SDK via composer issue

Good day:
I'm running PHP 5.6 and I'm trying to install aws/aws-sdk-php however, getting error:
$ composer require aws/aws-sdk-php
./composer.json has been updated
Loading composer repositories with package information
Updating dependencies (including require-dev)
Your requirements could not be resolved to an installable set of packages.
Problem 1
- symfony/translation v4.1.3 requires php ^7.1.3 -> your PHP version (5.6.20) does not satisfy that requirement.
- symfony/translation v4.1.3 requires php ^7.1.3 -> your PHP version (5.6.20) does not satisfy that requirement.
- Installation request for symfony/translation == 4.1.3.0 -> satisfiable by symfony/translation[v4.1.3].
Installation failed, reverting ./composer.json to its original content.
Not sure why I'm getting this issue as aws/aws-sdk-php requires minimum PHP 5.6 however, these dependencies requires php 7. I already have these dependencies installed in my vendor directory (through composer)
"require" : {
"jenssegers/proxy" : "^2.2",
"league/oauth2-client" : "0.12.1",
"zendframework/zend-diactoros" : "^1.7",
"nesbot/carbon" : "^1.22"
}
As #rob006 mentioned, I needed to delete my vendor directly and run composer again.
This main reason for the issue is that I ran composer install initially on a PHP 7 system and then ran it subsequently on php 5.6 which cause the issue. Another fix is to set the platform version of php in the composer.json file.

Composer & Plesk, encountering PHP version difficulties

Am currently attempting to get my Laravel application running behind Plesk Onyx. Now when trying to run composer install, I get the following error messages:
Your requirements could not be resolved to an installable set of packages.
Problem 1
- Installation request for doctrine/inflector v1.3.0 -> satisfiable by doctrine/inflector[v1.3.0].
- doctrine/inflector v1.3.0 requires php ^7.1 -> your PHP version (7.0.27) does not satisfy that requirement.
Problem 2
- Installation request for symfony/css-selector v4.0.6 -> satisfiable by symfony/css-selector[v4.0.6].
- symfony/css-selector v4.0.6 requires php ^7.1.3 -> your PHP version (7.0.27) does not satisfy that requirement.
Problem 3
- Installation request for symfony/event-dispatcher v4.0.6 -> satisfiable by symfony/event-dispatcher[v4.0.6].
- symfony/event-dispatcher v4.0.6 requires php ^7.1.3 -> your PHP version (7.0.27) does not satisfy that requirement.
Problem 4
- Installation request for symfony/translation v4.0.6 -> satisfiable by symfony/translation[v4.0.6].
- symfony/translation v4.0.6 requires php ^7.1.3 -> your PHP version (7.0.27) does not satisfy that requirement.
Problem 5
- Installation request for doctrine/instantiator 1.1.0 -> satisfiable by doctrine/instantiator[1.1.0].
- doctrine/instantiator 1.1.0 requires php ^7.1 -> your PHP version (7.0.27) does not satisfy that requirement.
Problem 6
- doctrine/inflector v1.3.0 requires php ^7.1 -> your PHP version (7.0.27) does not satisfy that requirement.
- laravel/framework v5.5.39 requires doctrine/inflector ~1.1 -> satisfiable by doctrine/inflector[v1.3.0].
- Installation request for laravel/framework v5.5.39 -> satisfiable by laravel/framework[v5.5.39].
OK. I understand the errors for sure. I run Debian 9 and "PHP by OS Vendor" is 7.0.27. However, I know that PHP 7.1+ (and even 7.2) is installed on the server, because Plesk'd let me choose (for domains and vhosts) these versions. My question now is: How can I tell composer to use a certain PHP version installed on the server, and how could this work under Debian with Plesk?
Edit: I did not install Composer globally. Just https://getcomposer.org/download/ "Command-line installation".
Here's how:
Find the PHP paths used by Plesk. In my case, this is /opt/plesk/php/. Inside this folder, there are the folders according to PHP versions installed: 7.0, 7.1, 7.2. So php composer.phar install becomes /opt/plesk/php/7.2/bin/php composer.phar install. & it works. :-)
You may use platform setting in composer.json to emulate PHP version:
"config": {
"platform": {
"php": "7.1"
}
},
Composer will assume that PHP version is 7.1 during installation and update, even if you're using 7.0 to actual install.
This will only affect Composer installation and update - if you want to run console commands of your app, you will need to use correct binary (same for web server). However setting this will make your Composer installs and updates more predictable, so it's worth doing it anyway.

Composer: prevent updating packages that require higher PHP version

I'm using the doctrine/dbal (v2.4.*) package in my PHP project. My production server runs PHP v5.6.
I ran composer update this morning which updated my composer.lock file. Now, when I'm deploying to production, I see this:
Problem 1
- Installation request for doctrine/inflector v1.2.0 -> satisfiable by doctrine/inflector[v1.2.0].
- doctrine/inflector v1.2.0 requires php ^7.0 -> your PHP version (5.6.14) does not satisfy that requirement.
Problem 2
- doctrine/inflector v1.2.0 requires php ^7.0 -> your PHP version (5.6.14) does not satisfy that requirement.
- doctrine/common v2.4.3 requires doctrine/inflector 1.* -> satisfiable by doctrine/inflector[v1.2.0].
- Installation request for doctrine/common v2.4.3 -> satisfiable by doctrine/common[v2.4.3].
Specifically these:
doctrine/common v2.4.3 requires doctrine/inflector 1.* -> satisfiable by doctrine/inflector[v1.2.0].
doctrine/inflector v1.2.0 requires php ^7.0 -> your PHP version
(5.6.14) does not satisfy that requirement
This means, that even if dbal is old, it requires the newest common, and common requires the newest inflector package. Problem is that inflector started depending on PHP7 to run.
Is there any way in Composer to limit updating of the packages to those supported by specific PHP version? Like saying: "Please update what you can, but only if the server's PHP version is sufficient."
Use the platform option in your composer.json file to define the PHP version your production environment is using like this:
{
"config": {
"platform": {
"php": "5.6.14"
}
}
}
see https://getcomposer.org/doc/06-config.md#platform
Remove composer.lock file
Run composer install

Laravel new doesn't work in my local environment

I'm trying to create a new laravel app, but when I use the command "laravel new" I've got an error :
laravel new
Crafting application...
Loading composer repositories with package information
Installing dependencies (including require-dev) from lock file
Your requirements could not be resolved to an installable set of packages.
Problem 1
- Installation request for phpunit/php-token-stream 2.0.0 -> satisfiable by phpunit/php-token-stream[2.0.0].
- phpunit/php-token-stream 2.0.0 requires php ^7.0 -> your PHP version (5.6.30) does not satisfy that requirement. Problem 2
- phpunit/php-token-stream 2.0.0 requires php ^7.0 -> your PHP version (5.6.30) does not satisfy that requirement.
- phpunit/php-code-coverage 4.0.8 requires phpunit/php-token-stream ^1.4.2 || ^2.0 -> satisfiable by phpunit/php-token-stream[2.0.0].
- Installation request for phpunit/php-code-coverage 4.0.8 -> satisfiable by phpunit/php-code-coverage[4.0.8].
Application ready! Build something amazing.
I'm on Windows 10, with php 5.6.30 installed.
I already tried to update composer itself, and laravel's installer (via composer global require "laravel/installer"), but it still doesn't work.
Last time I tried on this computer was three weeks ago, and it worked then.
Edit : I can't change my PHP version since it is the one I use on my server.
It looks like you are trying to download the latest realease of laravel. Though it is 5.4 but for some reason, it is downloading laravel's version that is compatible only with PHP7
Try with composer create-project --prefer-dist laravel/laravel blog "5.4.*" to install laravel 5.4
It's only the phpunit version. Change the version to smaller, like:
"phpunit/phpunit": "~5.7"
to
"phpunit/phpunit": "~5.0"

Categories