You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
#178 added a temporary workaround so drupal12 workspaces can install Drush. Drupal core main requires guzzlehttp/guzzle: "^8.0" as of 2026-07-24 (drupal.org #3612544) while every Drush version still requires ^7.0, making ddev composer require drush/drush unsatisfiable against Drupal 12 HEAD.
The workaround retries the require with a Composer inline alias presenting the locked Guzzle 8 version as a 7.x one:
ddev composer require "guzzlehttp/guzzle:8.0.0 as 7.99.0" drush/drush -W
This needs to come back out once Drush supports Guzzle 8.
Trigger
Watch drush-ops/drush#6602 — a one-line change relaxing the constraint to ^7.8.2 || ^8.0. When it merges and lands in a release (or in 14.x-dev, which is what these workspaces install), this issue is actionable.
Note: the workaround is self-clearing at runtime. The template tries the plain require first and only falls back when it fails, so new workspaces stop using the alias the moment Drush is fixed — there's no urgency, and no workspace breaks if this issue sits. What's left to do is delete the dead code.
Verify first
# Should now report a constraint that includes ^8.0
curl -s https://raw.githubusercontent.com/drush-ops/drush/14.x/composer.json | jq -r '.require["guzzlehttp/guzzle"]'
Then, in a drupal12 workspace on core HEAD, confirm the plain require succeeds on its own:
cd~/drupal-core && ddev composer require drush/drush && ddev drush status
The setup log (/tmp/drupal-setup.log) should show ✓ Drush installed with no preceding Drush/Guzzle constraint conflict line.
Remove
drupal-core/template.tf — in the Drush install block (~L925–L957), delete the else branch containing the _guzzle_ver lookup and the aliased retry, collapsing back to a plain if ddev composer require drush/drush ....
drupal-core/scripts/test-issue-branches.sh — delete the case "$GUZZLE_VER" fallback. The DRUSH_EXIT capture can stay or go; it exists only to feed the fallback, but it's also more correct than the original cmd | tail -5 (which tested tail's exit status).
Keep the SETUP_FAILED=true on Drush install failure. That's an independent fix — every later step (site install, cache rebuild, uli) runs through Drush, so the old "non-critical" warning just buried the real cause. Not part of the revert.
Run the pre-push checklist: terraform fmt -recursive, terraform -chdir=drupal-core validate, terraform -chdir=drupal-core test.
Build a fresh drupal12 workspace and confirm the Drupal install completes.
drupal-contrib/template.tf — in the ddev poser retry loop (~L775–L800), delete the if [ "$_guzzle_aliased" = "false" ] && grep -q ... block that adds the alias to composer.json and retries.
drupal-contrib/scripts/test-issue-branches.sh — delete the matching if [ "$POSER_RC" != "0" ] && grep -q ... block. The POSER_RC capture can stay; it's more correct than the original cmd | tail -10 form regardless of the fallback.
Run the pre-push checklist for drupal-contrib: terraform fmt -recursive, terraform -chdir=drupal-contrib validate, terraform -chdir=drupal-contrib test.
Build a fresh drupal-contrib workspace with Drupal Version = 12 and confirm ddev poser succeeds without the alias.
Consider reverting the PR-matrix change in fix(drupal-contrib): install Drush via Guzzle alias on Drupal 12 HEAD #181 (.github/workflows/drupal-contrib-integration-test.yml, smoke cell back to token D11) once D12 is no longer the fragile one — or leave it, since it's now the cell most likely to catch the next core dependency bump.
Already-provisioned workspaces
Workspaces created while the workaround was active keep "guzzlehttp/guzzle": "<version> as 7.99.0" in composer.local.json (gitignored by core, so it won't dirty the checkout). It stays harmless, but pins that exact Guzzle version. To clear it without recreating the workspace:
The same applies to any non-Coder DDEV project where the one-liner was applied by hand — there the alias lives in the project's own composer.json and will show in git status.
Context
#178 added a temporary workaround so
drupal12workspaces can install Drush. Drupal coremainrequiresguzzlehttp/guzzle: "^8.0"as of 2026-07-24 (drupal.org #3612544) while every Drush version still requires^7.0, makingddev composer require drush/drushunsatisfiable against Drupal 12 HEAD.The workaround retries the require with a Composer inline alias presenting the locked Guzzle 8 version as a 7.x one:
This needs to come back out once Drush supports Guzzle 8.
Trigger
Watch drush-ops/drush#6602 — a one-line change relaxing the constraint to
^7.8.2 || ^8.0. When it merges and lands in a release (or in14.x-dev, which is what these workspaces install), this issue is actionable.Note: the workaround is self-clearing at runtime. The template tries the plain require first and only falls back when it fails, so new workspaces stop using the alias the moment Drush is fixed — there's no urgency, and no workspace breaks if this issue sits. What's left to do is delete the dead code.
Verify first
Then, in a
drupal12workspace on core HEAD, confirm the plain require succeeds on its own:The setup log (
/tmp/drupal-setup.log) should show✓ Drush installedwith no precedingDrush/Guzzle constraint conflictline.Remove
drupal-core/template.tf— in the Drush install block (~L925–L957), delete theelsebranch containing the_guzzle_verlookup and the aliased retry, collapsing back to a plainif ddev composer require drush/drush ....drupal-core/scripts/test-issue-branches.sh— delete thecase "$GUZZLE_VER"fallback. TheDRUSH_EXITcapture can stay or go; it exists only to feed the fallback, but it's also more correct than the originalcmd | tail -5(which testedtail's exit status).SETUP_FAILED=trueon Drush install failure. That's an independent fix — every later step (site install, cache rebuild,uli) runs through Drush, so the old "non-critical" warning just buried the real cause. Not part of the revert.terraform fmt -recursive,terraform -chdir=drupal-core validate,terraform -chdir=drupal-core test.drupal12workspace and confirm the Drupal install completes.drupal-contrib (added in #181)
drupal-contrib/template.tf— in theddev poserretry loop (~L775–L800), delete theif [ "$_guzzle_aliased" = "false" ] && grep -q ...block that adds the alias tocomposer.jsonand retries.drupal-contrib/scripts/test-issue-branches.sh— delete the matchingif [ "$POSER_RC" != "0" ] && grep -q ...block. ThePOSER_RCcapture can stay; it's more correct than the originalcmd | tail -10form regardless of the fallback.drupal-contrib:terraform fmt -recursive,terraform -chdir=drupal-contrib validate,terraform -chdir=drupal-contrib test.drupal-contribworkspace with Drupal Version = 12 and confirmddev posersucceeds without the alias..github/workflows/drupal-contrib-integration-test.yml, smoke cell back totokenD11) once D12 is no longer the fragile one — or leave it, since it's now the cell most likely to catch the next core dependency bump.Already-provisioned workspaces
Workspaces created while the workaround was active keep
"guzzlehttp/guzzle": "<version> as 7.99.0"incomposer.local.json(gitignored by core, so it won't dirty the checkout). It stays harmless, but pins that exact Guzzle version. To clear it without recreating the workspace:The same applies to any non-Coder DDEV project where the one-liner was applied by hand — there the alias lives in the project's own
composer.jsonand will show ingit status.Related
drupal-contribwith Drupal Version = 12 hit the same conflict (theskiptoD12 cell failed starting 2026-07-25, run 30165116093). It was deliberately left alone in fix(drupal-core): install Drush via Guzzle alias while Drush lags core's Guzzle 8 bump #178 since the lock-file technique doesn't transfer toddev poser(the solve fails before a lock exists). fix(drupal-contrib): install Drush via Guzzle alias on Drupal 12 HEAD #181 adds a separately-tested packagist-based fallback for it. Its removal steps are now also in scope for this issue — see the newdrupal-contribsection under Remove below.