Description
Edit to avoid to summarise the state of this issue.
When scoping a package which has autoloaded files, the scoped files will keep the same hash. As a result if your current application/library is using the scoped package and has files with the same hash, only one file will be loaded which results in undesirable behaviours.
It appears the hash strategy is not something we can change composer/composer#7942 and changing the package name of the scoped packages has undesirable side effects so it is not a solution either.
@jarrodbell #298 (comment) and @ondrejmirtes #298 (comment) made it work by changing it after the composer dump process as part of the scoping build process.
The discussion is carrying from that point to figure out if there is a way PHP-Scoper could fix it by itself without further actions from the user.
Bug report
Question | Answer |
---|---|
Box version | PHP Scoper version 0.11.4 2018-11-13 08:49:16 UTC |
PHP version | PHP 7.1.22 |
Platform with version | Ubuntu 16.04.5 LTS |
Github Repo | https://github.com/mollie/mollie-api-php |
We are using php-scoper in our client to generate a release for integrators to be used in for example Wordpress. When it is used there, there are often more packages with Guzzle via composer.
When this happens they will get the exception:
Uncaught Error: Call to undefined function GuzzleHttp\choose_handler()
This is because the corresponding guzzlehttp/guzzle/src/functions_include.php
is not loaded for the second implementation due to the composer file require hash being the same.
Below there is an example of our package being ran alongside another guzzle package.
This is a var_dump inside the composer_real.php where the functions_include is being required if the file hash is not already loaded.
array(3) {
["c964ee0ededf28c96ebd9db5099ef910"]=>
string(99) "{path_to_site}/vendor/composer/../guzzlehttp/promises/src/functions_include.php"
["a0edc8309cc5e1d60e3047b5df6b7052"]=>
string(95) "{path_to_site}/vendor/composer/../guzzlehttp/psr7/src/functions_include.php"
["37a3dc5111fe8f707ab4c132ef1dbc62"]=>
string(97) "{path_to_site}/vendor/composer/../guzzlehttp/guzzle/src/functions_include.php"
}
array(3) {
["c964ee0ededf28c96ebd9db5099ef910"]=>
string(106) "{path_to_site}/guzzle/vendor/composer/../guzzlehttp/promises/src/functions_include.php"
["a0edc8309cc5e1d60e3047b5df6b7052"]=>
string(102) "{path_to_site}/guzzle/vendor/composer/../guzzlehttp/psr7/src/functions_include.php"
["37a3dc5111fe8f707ab4c132ef1dbc62"]=>
string(104) "{path_to_site}k/guzzle/vendor/composer/../guzzlehttp/guzzle/src/functions_include.php"
}
So this causes only the first implementation it's choose_handler
function to be available.
I'm not really sure if this bug should be reported here, but i'm curious to your expert opinion about this. Might it be worth it to also scope the files that outta be required by composer? To avoid some of them not being loaded? As manipulating the hash in above example would fix the problem.