DDEV integration for developing Drupal contrib projects. As a general philosophy, your contributed module 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.
- If you haven't already, install Docker and DDEV
git clone
your contrib module- cd [contrib module directory]
- Configure DDEV for Drupal 10 using
ddev config --project-name=[contrib module] --project-type=drupal10 --docroot=web --create-docroot --php-version=8.1
or select these options when prompted usingddev config
- Remove underscores in the project name, or replace with hyphens.
- Run
ddev get ddev/ddev-drupal-contrib
- Run
ddev start
- Run
ddev poser
- Run
ddev symlink-project
Update by running the ddev get ddev/ddev-drupal-contrib
command.
This project provides the following DDEV container commands.
- ddev poser.
- 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
ANDyarn install
so that dependencies are available. - Note: it is perfectly acceptable to skip this command and edit the require-dev of composer.json by hand.
- Creates a temporary composer.contrib.json so that
- ddev symlink-project. This symlinks the top level files of your project into web/modules/custom so that Drupal finds your module. This command runs automatically on every
ddev start
. See codebase image below.
Run tests on the web/modules/custom
directory:
ddev phpunit
Run PHPUnit tests.ddev nightwatch
Run Nightwatch tests, requires DDEV Selenium Standalone Chrome.ddev phpcs
Run PHP_CodeSniffer.ddev phpcbf
Fix phpcs findings.ddev eslint
Run ESLint on JavaScript files.ddev stylelint
Run Stylelint on CSS files.
- Optional: Install the ddev-selenium-standalone-chrome extension for FunctionalJavascript and Nightwatch tests.
- Optional: Install the ddev-mkdocs extension for local preview of your docs site. Drupal.org's Gitlab CI can automatically publish your site.
- Optional. Commit the changes in the
.ddev
folder after this plugin installs. This saves other users from having to install this integration. - This project reads your
project_type
from DDEV and fetches adds the corresponding version ofdrupal/core-recommended
tocomposer.json
. if you are doing something non-standard with project_type, don't useddev poser
command. - This project should work for any contrib project, including those that haven't opted into Gitlab CI. One advantage of that is that failures in CI are more likely to be reproducible locally when using 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 byddev poser
so feel free to configure any patches that your project needs.
This is what a succesful test looks like, based on Config Enforce Devel.
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)
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:
#!/bin/bash
ddev phpcbf -q
- Mark the file as executable:
chmod +x pre-commit
.
"Error: unknown command":
The commands from this addon are available when the project type a valid drupal
type.
Below, is an example .ddev/config.yaml
for a Drupal 10 project.
type: drupal10
Contributed and maintained by @weitzman