在 DDEV 或 Lando 中使用 Composer 必须通过容器执行命令,不可在宿主机运行;需确认容器内 Composer 版本匹配项目要求,正确安装依赖、添加包、更新及运行脚本,并妥善处理 vendor 权限与私有仓库认证。

在 DDEV 或 Lando 中使用 Composer,核心是不要在宿主机上直接运行 Composer 命令,而应始终通过容器环境执行。这是因为本地 PHP 版本、扩展、路径和依赖隔离都由容器定义,宿主机的 Composer 很可能与项目所需不兼容,导致安装失败或运行时错误。
确保 Composer 在容器内可用
DDEV 和 Lando 默认都预装了 Composer(通常为最新稳定版),但需确认版本匹配项目要求:
-
DDEV:运行
ddev composer --version查看;如需切换版本,可在.ddev/config.yaml中添加:composer_version: "2.5.8"(支持 2.x 和 1.x) -
Lando:运行
lando composer --version;若服务使用自定义 PHP 镜像,需确保镜像已内置 Composer,或通过build_as_root在构建阶段安装
正确执行 Composer 命令
所有操作必须在容器上下文中进行:
- 安装依赖:
ddev composer install或lando composer install - 添加新包:
ddev composer require drupal/core-recommended:^10 - 更新依赖:
lando composer update --with-all-dependencies(谨慎使用,建议指定包名) - 运行脚本:
ddev composer run-script post-install-cmd
⚠️ 注意:不要用 php composer.phar 或宿主机全局 Composer,会绕过容器环境,导致 vendor/autoload.php 路径错误或扩展缺失。
处理 vendor 目录与文件权限
DDEV/Lando 容器中 PHP 进程通常以非 root 用户(如 www-data)运行,而宿主机挂载的 vendor 目录可能属主不一致,引发写入失败:
-
DDEV:默认启用
mutagen_enabled: true(v1.22+),自动同步并修复权限;也可在.ddev/config.yaml中设composer_home: "/tmp/composer"避免宿主机写入 -
Lando:在
.lando.yml的服务配置中加入:run_as_root: ["chown -R www-data:www-data /app/vendor"](仅首次启动时执行) - 通用建议:将
vendor加入.gitignore,不提交到代码库;CI/CD 环境中始终用composer install --no-dev
自定义 Composer 配置与私有仓库
若项目需访问私有 Packagist、GitHub 或 GitLab 包,需在容器内配置认证:
- 将
auth.json放在项目根目录(与composer.json同级),DDEV/Lando 会自动挂载并识别 - 内容示例:
{"http-basic": {"your-private-repo.com": {"username": "token", "password": "abc123"}}} - 敏感 token 不要硬编码:DDEV 支持
hooks注入环境变量,Lando 可用env_file加载.env并在run命令中动态生成auth.json
关键原则就一条:Composer 是项目的一部分,不是开发工具——它必须和 PHP、扩展、OS 一起运行在声明式环境中。只要命令走 ddev composer 或 lando composer,其余配置基本不会出错。










