Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Composer dependency for specified PHP version

is it possible to tell composer to install a dependency only when using specified PHP versions?

Reason: my library uses password_hash function, which is available in 5.5+, and there is a compatibility library ircmaxell/password-compat for PHP 5.4. However installing this library on PHP 5.5+ is completely pointless. So, Is it possible to tell composer to install ircmaxell/password-compat only when running on versions <5.5?

Short story to make the question more clear - I want to tell composer to:

IF php version < 5.5:
    install ircmaxell/password-compat
ELSE:
    skip ircmaxell/password-compat

Thanks in advance.

P.S. Please posts only direct answers how to do this, not any workarounds or suggestions to drop 5.4 support. I can also come up with them, I am looking for the smart solution here :)

like image 465
amik Avatar asked Aug 17 '15 16:08

amik


2 Answers

The short answer is "It's not possible".

The dependency is not a massive one. Why not simply let it install anyway? If you are on PHP 5.5 the built-in password functions will still be used.

You could also make password-compat an optional dependency (suggests). The issue then is that it's up to the maintainer to install it alongside your application.

Lastly, you could make a secondary, virtual package. Say your package is called 'Acme', It would be possible to create a secondary 'Acme-php54' package that depends on both password_compat and your main project. This keeps the dependency outside of your project, but I would argue that the simplest is to just always install it as long as you intend to support PHP 5.4, and just drop PHP 5.4 in a little while when it EOLs.

like image 95
Evert Avatar answered Oct 12 '22 14:10

Evert


Yes, it is possible.

Consider having one branch, e.g. 1.x for legacy php versions, like

{
    "name": "some/library",
    "version": "1.0.0",
    "require": {
        "ircmaxell/password-compat": "*"
    }
}

and 2.x branch for 5.5+

{
    "name": "some/library",
    "version": "2.0.0",
    "require": {
        "php": ">=5.5"
    }
}

This way loose version requirements, i.e. some/library:* will resolve to appropriate versions.

Another way is to instruct the users to add

"replace": {
    "ircmaxell/password-compat": "*"
}

by themselves if needed.

Note that some users (including myself) can change their php interpreter on the fly and won't be too happy to debug this kind of automagical issues.

like image 31
Estus Flask Avatar answered Oct 12 '22 15:10

Estus Flask