DDEV integration for developing Drupal contrib projects. As a general philosophy, your contributed module/theme is the center of the universe. The codebase layout (see image below) and commands in this project match the Gitlab CI approach from the Drupal Association.
Configure DDEV for Drupal using ddev config --project-type=drupal --docroot=web --php-version=8.3 --corepack-enable --project-name=[module] or select these options when prompted using ddev config
Remove underscores in the project name, or replace with hyphens. (DDEV will do this for you.)
See Misc for help on using alternate versions of Drupal core.
Run ddev add-on get ddev/ddev-selenium-standalone-chrome && ddev add-on get ddev/ddev-drupal-contrib
Run ddev start
Run ddev poser
Run ddev symlink-project
ddev config --update to detect expected Drupal and PHP versions.
ddev restart
After installation, make sure to commit the .ddev directory to version control.
Update
ddev add-on get ddev/ddev-selenium-standalone-chrome
ddev add-on get ddev/ddev-drupal-contrib
ddev restart
Commands
This project provides the following DDEV container commands.
Creates a temporary composer.contrib.json so that drupal/core-recommended becomes a dev dependency. This way the composer.json from the module is untouched.
Runs composer install AND yarn install so that dependencies are available. Additional arguments to ddev poser like –prefer-source are passed along to composer install
Note: it is perfectly acceptable to skip this command and edit the require-dev of composer.json by hand.
ddev symlink-project. Symlinks your project files into the configured location (defaults to web/modules/custom) so Drupal can find your module. This command runs automatically on every ddev startas long as Composer has generated vendor/autoload.php which occurs during composer install/update. See codebase image below.
Run tests on your project code (defaults to web/modules/custom, configurable):
Optional. Commit the changes in the .ddev folder after this plugin installs. This saves other users from having to install this integration.
If you add/remove a root file or directory, re-symlink root files via EITHER of these methods
ddev restart
ddev symlink-project
cweagans/composer-patches:^1 is added by ddev poser so feel free to configure any patches that your project needs.
Any development dependencies (e.g. Drush) should be manually added to require-dev in your project’s composer.json file. Don’t use the composer require command to do that.
In .ddev/config.local.yaml set the Drupal core version:
web_environment:
- DRUPAL_CORE=^11
Then run ddev restart and then ddev poser to update the Drupal core version.
If Drupal core cannot be changed because the project is using an unsupported version of PHP, ddev poser will show a composer error. In that case, open .ddev/config.yaml and change the PHP_VERSION to a supported version; then run ddev restart and ddev poser again. Note that the project PHP version is set in .ddev/config.yaml, while the core version to use is set in .ddev/config.local.yaml.
Changing the symlink location
In .ddev/config.local.yaml set the location relative to webroot (which usually is web/). Defaults to modules/custom
user:~/config_enforce_devel$ ddev phpunit
PHPUnit 9.6.15 by Sebastian Bergmann and contributors.
Default Target Module (Drupal\Tests\config_enforce_devel\Functional\DefaultTargetModule)
✔ Default target module created
Form Alter Implementation Order (Drupal\Tests\config_enforce_devel\Functional\FormAlterImplementationOrder)
✔ Form alter implementation order
Theme Settings Form (Drupal\Tests\config_enforce_devel\Functional\ThemeSettingsForm)
✔ Theme settings form submit
Time: 00:13.453, Memory: 4.00 MB
OK (3 tests, 20 assertions)
Automatically correct coding standard violations
You can set up a pre-commit hook that runs phpcbf:
Create a new file touch .git/hooks/pre-commit in your repository if it doesn’t already exist.
Add the following lines to the pre-commit file:
#!/usr/bin/env bash
ddev phpcbf -q
Mark the file as executable: chmod +x pre-commit.
Troubleshooting
“Error: unknown command”:
The commands from this addon are available when the project type is drupal. Make sure the type configuration is correctly set in .ddev/config.yaml:
type: drupal
Tip
Remember to run ddev restart if .ddev/config.yaml has been updated.
Contributing
Tests are done with Bats. It is a testing framework that uses Bash. To run tests locally you need to first install bats’ git submodules with:
git submodule update --init
Then you can run within the root of this project:
./tests/bats/bin/bats ./tests
Tests will be run using the default drupal core of the contrib. To test against a different Drupal core version, update the TEST_DRUPAL_CORE environment
variable.
i.e. TEST_DRUPAL_CORE=11 ./tests/bats/bin/bats ./tests.
Tests are triggered automatically on every push to the
repository, and periodically each night. The automated tests are against all the supported Drupal core versions.