At the company I work with, our modules are individual repositories. We add those as composer packages to our Magento 2 installation by adding GitHub as a repository in our composer.json
:
"require": {
"vendor/custom-module": "dev-master"
},
"repositories": [
{
"type": "git",
"url": "[email protected]:CompanyName/custom-module.git"
}
],
"autoload": {
"files": [
"registration.php"
],
"psr-4": {
"Happy\\PrivateProducts\\": ""
}
},
This works fine, no questions there.
The next thing we want to do is set these modules up as individual testable modules using a Continuous Integration provider (CircleCI in our case). So I've added dependencies like phpunit
and phpcs
to the composer.json
of our module:
"require-dev": {
"phpunit/phpunit": "5.3.5",
"squizlabs/php_codesniffer": "1.5.3"
}
We setup our master
-branch to be protected and do our work in the development
-branch. When we want to merge the changes we send a pull request to our master
-branch. This is the moment where CircleCI kicks in.
Everything gets installed properly on our CI servers' container that is spawned. However, when I try to run phpunit
or phpcs
from the command line (using vender/bin/phpunit
or vendor/bin/phpcs
for example), I get a PHP error that all kind of Magento dependencies are missing:
PHP Fatal error: Uncaught Error: Class 'Magento\Framework\Component\ComponentRegistrar' not found in /home/ubuntu/custom-module/registration.php:6
Stack trace:
#0 /home/ubuntu/custom-module/vendor/composer/autoload_real.php(66): require()
#1 /home/ubuntu/custom-module/vendor/composer/autoload_real.php(56): composerRequiref6475a93b986d5b841accb13703f079a('bdaf00c9b7defe0...', '/home/ubuntu/ma...')
#2 /home/ubuntu/custom-module/vendor/autoload.php(7): ComposerAutoloaderInitf6475a93b986d5b841accb13703f079a::getLoader()
#3 /home/ubuntu/custom-module/vendor/phpunit/phpunit/phpunit(45): require('/home/ubuntu/ma...')
#4 {main}
thrown in /home/ubuntu/mage2-private-products/registration.php on line 6
My question
I have a fairly good idea of why I'm getting this error. After all, I have the registration.php
in my composer.json
autoload-property. However, I am wondering what's best practice here?
Should I omit theregistration.php
from mycomposer.json
-file?- Should I include the complete Magento framework as dev-dependency? (I don't think so because my unit tests should mock everything).
- Should I wrap my register function with a
if class_exists()
? - Some other solution / suggestion?
What are other peoples experiences / best practices when it comes to individual module testing / CI processes with Magento 2?
Edit: I found out that if I omit my registration.php
autoload in my composer.json
, that Magento 2 will not see my module (which makes sense). For now I've included the Magento Framework (magento/framework
) as a development dependency and added an auth.json
for the credentials. I guess that's the best way to do this, but I'm still interested in other peoples' experiences.