Skip to content

DDEV integration for developing Drupal contrib projects

License

Notifications You must be signed in to change notification settings

ddev/ddev-drupal-contrib

Repository files navigation

tests project is maintained

DDEV Drupal Contrib

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.

Install

  1. If you haven't already, install Docker and DDEV
  2. git clone your contrib module
  3. cd [contrib module directory]
  4. 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 in v1.23.5+)
    • See Misc for help on using alternate versions of Drupal core.
  5. Run ddev add-on get ddev/ddev-drupal-contrib (or ddev get ddev/ddev-drupal-contrib if your DDEV version is older than 1.23.5)
  6. Run ddev start
  7. Run ddev poser
  8. Run ddev symlink-project
  9. ddev config --update to detect expected Drupal and PHP versions.
  10. ddev restart

Update

For DDEV v1.23.5 or above run

ddev add-on get ddev/ddev-drupal-contrib

For earlier versions of DDEV run

ddev get ddev/ddev-drupal-contrib

Commands

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 AND yarn 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.
  • ddev symlink-project. 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 as long as Composer has generated vendor/autoload.php which occurs during composer install/update. See codebase image below.

Run tests on the web/modules/custom directory:

Codebase layout

Folder tree

Misc

Changing the Drupal core version

web_environment:
  - DRUPAL_CORE=^11

After creating this file, 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.

Example of successful test

This is what a successful 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)

Automatically correct coding standard violations

You can set up a pre-commit hook that runs phpcbf:

  1. Create a new file touch .git/hooks/pre-commit in your repository if it doesn't already exist.
  2. Add the following lines to the pre-commit file:
#!/bin/bash

ddev phpcbf -q
  1. Mark the file as executable: chmod +x pre-commit.

Add-on tests

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 agains all of the supported Drupal core versions.

Please make sure to attend to test failures when they happen. Others will be depending on you.

Also, consider adding tests to test for bugs or new features on your PR.

To learn more about Bats see the documentation.

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

Don't forget to run ddev restart if .ddev/config.yaml has been updated.

Contributed and maintained by @weitzman