Using conflict in composer.json for BC Break handling on Optional feature
You may have a PHP library that can work with multiple project skeletons with optional feature, so the dependencies are not required. For example, your composer.json library looks like:
{
"name": "your/library",
"require": {
"php": "^7.1",
},
"require-dev": {
"foo/bar": "^2.0",
"phpunit/phpunit": "^7.0"
},
"suggest": {
"foo/bar": "^2.0 usage via Your\\Library\\Adapter\\Foo\\Bar adapter"
}
}
The “foo/bar” library is an optional library which used in “your/library” that consume it, collected in the require-dev above for testing purpose.
The “foo/bar” library has class “Foo\Bar\Way”. There are 2 versions of “foo/bar” lib, which version 1 and version 2 have different signature as follow:
a. “foo/bar” version 1 of “Foo\Bar\Way”
namespace Foo\Bar;
class Way
{
public function execute(string $a, string $b)
{
// ...
}
}
b. “foo/bar” version 2 of “Foo\Bar\Way”
namespace Foo\Bar;
use stdClass;
class Way
{
public function execute(stdClass $std)
{
// ...
}
}
In above code, if current user are using foo/bar:^1.0, the user code will be break when user upgrade “your/library” to version 2.0. So, to avoid that, you can restrict it via “conflict”, as follow:
{
"name": "your/library",
"require": {
"php": "^7.1",
},
"require-dev": {
"foo/bar": "^2.0",
"phpunit/phpunit": "^7.0"
},
"suggest": {
"foo/bar": "^2.0 usage via Your\\Library\\Adapter\\Foo\\Bar adapter"
},
"conflict": {
"foo/bar": "<2.0"
}
}
Now, you can tag “your/library” as “2.0” and user won’t be allowed to install new tagged library if they still uses “foo/bar”:”^1.0″ in existing project, That’s it!
leave a comment