Skip to content

description: Composer path repos install drupal-recipe packages as symlinks that dangle inside a DDEV container — force symlink:false, and never trust a path repo for tag-accurate resolution. drupal_version: "11.x" tldr: Composer path repos symlink drupal-recipe packages, and the symlink points outside the DDEV mount so drush/install can't read the recipe. Force symlink: false (or copy the package in). Path repos ignore git tags — use a local vcs repo when you must test a tagged constraint.


DDEV + Composer Path Repo for drupal-recipe Packages

What: When you develop or verify a type: drupal-recipe package locally with a Composer path repository, force symlink: false, run require ops on the HOST (not ddev composer), and use a local vcs repo instead of a path repo whenever you need tag-accurate resolution.

Rationale: A Composer path repository installs the package as a symlink by default (recipes/<pkg> → ../../<pkg>). Inside a DDEV container only the project directory is mounted, so a symlink to a sibling directory points outside the mount — drush site:install ../recipes/<pkg> and drush recipe then fail to read recipe.yml (file-not-found, even though the host sees it). ddev composer has the same blind spot: it can't resolve a ../sibling path repo the container doesn't mount, so require ops must run on host Composer. Separately, a path repo always resolves to the working-tree HEAD as a dev version and ignores git tags — so you cannot exercise a real constraint like ^1.0.0-beta2 through it (you get a dev-main vs ^1 canonical-priority conflict instead).

When it applies: Any local build/verify loop for a recipe or site-template package (or any package) consumed via a Composer path repository under DDEV.

Example:

// composer.json — force a real copy, not a symlink
"repositories": {
  "local-recipe": {
    "type": "path",
    "url": "../my_recipe",
    "options": { "symlink": false }   // ← copy into vendor/recipes, survives the container mount
  }
}
# Require on the HOST, not `ddev composer` (the container can't see ../sibling)
composer require drupal/my_recipe:@dev

# Need to test a TAGGED constraint (^1.0.0-beta2)? A path repo can't — use a local vcs repo:
"repositories": {
  "local-tagged": { "type": "vcs", "url": "../my_theme" }   // reads real git tags
}