Magento 2 bug: «bin/magento module:enable» fails with the «The file "/composer.json" doesn't exist» message when a Composer package contains multiple Magento modules

composer
bug
bug-fix

(Dmitry Fedyuk) #1

Where is it fail?

Magento\Framework\Filesystem\File\Read::assertValid()

Magento\Framework\Module\PackageInfo::load()

How to fix?

I have added a workaround to the 2.9.9 version of the mage2pro/core package:

To fix the issue just upgrade your extensions.


Magento Enterprise Cloud Edition bug: «The file "/composer.json" doesn't exist»
How to fix the «There are no commands defined» failure while executing a console command
(Dmitry Fedyuk) #4

The defect method is \Magento\Framework\Module\Dir\Reader::getFiles():

By the way, in my 2 years Magento 2 experience, the filesystem handling is one of the less quality (one of the most buggy) Magento 2 parts.

Particularly, Magento 2 uses this method to find out all the composer.json files of all the installed modules.
In this case, the $filename input argument has the composer.json value.
If a Composer package contains multiple Magento 2 modules in subfolders (as mage2pro/core), then the following code line works for such modules incorrectly and returns an empty string:

The next code line ignores the incorrect result of the previous line and concatenates in with the /composer.json string:

So the $file is /composer.json.
The following lines is an ugly attempt to detect the existence of the $file:

It is incorrect, because /composer.json is really interpreted here as the root Magento 2 composer.json file, and the detection result is true, but actually it should be false.

How to fix it manually without my official patch (I do not recommend this method!)

Locate the following code block (it is explained above):

Replace it with the folllowing one:

if ($moduleSubDir) {
	$file = $moduleSubDir . '/' . $filename;
	$directoryRead = $this->readFactory->create($moduleSubDir);
	$path = $directoryRead->getRelativePath($file);
	if ($directoryRead->isExist($path)) {
		$result[] = $file;
	}            	
}

Magento Enterprise Cloud Edition bug: «The file "/composer.json" doesn't exist»
(Dmitry Fedyuk) #5

Today I have fixed a similar issue in the mage2pro/core package with Magento Marketplace: