mcpField
D
ddev-expert

ddev-expert

github.com/madsnorgaard开发49328 次安装6 周前更新
代码仓库

关于 ddev-expert

ddev-expert 是面向 PHP 项目开发者的 DDEV 参考技能,内容尤其涵盖 Drupal。它整理项目配置、常用命令、性能调整和故障排查方法。

主要功能

  1. 01DDEV 项目生命周期命令
  2. 02Drupal 10 和 11 配置指南
  3. 03数据库导入、导出与快照
  4. 04自定义服务和 PHP 配置
  5. 05Xdebug 与性能调整
  6. 06故障排查和 CI 示例

适用场景

  1. 01启动本地 Drupal 开发项目
  2. 02向现有项目导入数据库
  3. 03为 DDEV 添加 Redis 或 Solr 服务
  4. 04排查容器或数据库问题

安装

复制下面的命令,在终端中运行。

$npx skills add https://github.com/madsnorgaard/drupal-agent-resources --skill ddev-expert

安装后在 Claude Code 中输入/ddev-expert确认已加载。

详细介绍

DDEV 开发专家

你是 DDEV 专家,精通用于 PHP 项目的基于 Docker 的本地开发环境。

核心概念

DDEV 提供一致的容器化本地开发环境,包含:

  • 预配置的 PHP、Web 服务器和数据库容器
  • 使用 mkcert 自动配置 HTTPS
  • 内置 Composer 和 Node.js 支持
  • 轻松管理多个项目

注意: 默认不包含 Drush——创建 Drupal 项目后,必须执行 composer require drush/drush。

常用命令

项目管理
ddev start          # Start project containers
ddev stop           # Stop project containers
ddev restart        # Restart containers
ddev poweroff       # Stop all DDEV projects
ddev delete         # Remove project (keeps files)
执行命令
ddev drush <cmd>    # Run Drush commands
ddev composer <cmd> # Run Composer
ddev php <script>   # Run PHP scripts
ddev exec <cmd>     # Run any command in web container
ddev ssh            # SSH into web container
数据库
ddev mysql          # MySQL CLI
ddev export-db      # Export database
ddev import-db      # Import database (--file=dump.sql)
ddev snapshot       # Create database snapshot
ddev restore        # Restore from snapshot
实用工具
ddev describe       # Show project info and URLs
ddev logs           # View container logs
ddev launch         # Open site in browser
ddev share          # Create public URL (ngrok)

配置

.ddev/config.yaml
name: my-project
type: drupal           # Auto-detects Drupal version, or use drupal11/drupal10
docroot: web
php_version: "8.3"     # Use 8.3 for Drupal 11, 8.2 for Drupal 10
webserver_type: nginx-fpm
database:
  type: mariadb
  version: "10.11"

# Additional hostnames
additional_hostnames:
  - api.my-project.ddev.site

# Extra PHP packages
webimage_extra_packages: [php8.3-imagick]
常见自定义配置

自定义服务(.ddev/docker-compose.*.yaml):

version: '3.6'
services:
  redis:
    image: redis:7
    container_name: ddev-${DDEV_SITENAME}-redis
    labels:
      com.ddev.site-name: ${DDEV_SITENAME}
    expose:
      - "6379"

PHP 覆盖配置(.ddev/php/my-settings.ini):

memory_limit = 512M
upload_max_filesize = 64M
post_max_size = 64M

Nginx 配置(.ddev/nginx_full/nginx-site.conf): 用于特殊路由需求的自定义 Nginx 配置。

Drupal 专属设置

新建 Drupal 11 项目
mkdir my-drupal && cd my-drupal
ddev config --project-type=drupal --docroot=web --php-version=8.3
ddev start
ddev composer create-project drupal/recommended-project:^11
ddev composer require drush/drush
ddev drush site:install --account-name=admin --account-pass=admin -y
ddev launch

重要说明:

  • ddev composer create-project 需要空目录——先移走所有现有文件(如 .claude/),完成后再移回来
  • Drupal 11 的 recommended-project 不包含 Drush——务必单独安装
  • 使用 --project-type=drupal(自动检测版本)或明确指定 drupal11
新建 Drupal 10 项目
mkdir my-drupal && cd my-drupal
ddev config --project-type=drupal --docroot=web --php-version=8.2
ddev start
ddev composer create-project drupal/recommended-project:^10
ddev composer require drush/drush
ddev drush site:install --account-name=admin --account-pass=admin -y
ddev launch
现有 Drupal 项目
cd existing-project
ddev config --project-type=drupal --docroot=web
ddev start
ddev composer install
ddev import-db --file=database.sql.gz
ddev drush cr

故障排除

常见问题

ddev composer create-project 因 "not allowed to be present" 失败:

# This happens when extra directories exist (like .claude/, .git/, etc.)
# Solution: Move them out temporarily
mv .claude /tmp/claude-backup
mv .git /tmp/git-backup
ddev composer create-project drupal/recommended-project:^11
mv /tmp/claude-backup .claude
mv /tmp/git-backup .git

端口冲突:

ddev poweroff
# Check what's using ports 80/443
sudo lsof -i :80

容器问题:

ddev restart
ddev debug refresh    # Rebuild containers
ddev delete && ddev start  # Nuclear option

数据库连接问题:

  • 主机:db(容器内)或 127.0.0.1:PORT(容器外)
  • 使用 ddev describe 检查端口

权限问题:

ddev exec chown -R $(id -u):$(id -g) .
实用调试命令
ddev debug capabilities  # Show DDEV capabilities
ddev debug router       # Show router status
ddev logs -f            # Follow logs
ddev exec env           # Show environment variables

多环境工作流

使用 ddev pull

在 .ddev/providers/ 中配置提供商:

# .ddev/providers/platform.yaml
environment_variables:
  project: my-project
  environment: main

db_pull_command:
  command: platform db:dump -e ${environment}

然后执行:ddev pull platform

Xdebug 配置

启用 Xdebug
ddev xdebug on           # Enable step debugging
ddev xdebug off          # Disable (faster performance)
ddev xdebug status       # Check current state
IDE 配置

VS Code(搭配 PHP Debug 扩展):

// .vscode/launch.json
{
  "version": "0.2.0",
  "configurations": [
    {
      "name": "Listen for Xdebug",
      "type": "php",
      "request": "launch",
      "port": 9003,
      "pathMappings": {
        "/var/www/html": "${workspaceFolder}"
      }
    }
  ]
}

PHPStorm:

  1. 设置 → PHP → 服务器
  2. 添加服务器:名称与 DDEV 项目名称一致
  3. 主机:<project>.ddev.site,端口:443,HTTPS
  4. 路径映射:项目根目录 → /var/www/html
Xdebug 模式
# .ddev/php/xdebug.ini
[xdebug]
xdebug.mode=debug,develop,coverage

模式:debug(单步调试)、develop(增强错误信息)、coverage(代码覆盖率)、profile(性能分析)

自定义服务

Redis
# .ddev/docker-compose.redis.yaml
services:
  redis:
    image: redis:7-alpine
    container_name: ddev-${DDEV_SITENAME}-redis
    labels:
      com.ddev.site-name: ${DDEV_SITENAME}
      com.ddev.approot: $DDEV_APPROOT
    expose:
      - "6379"
    volumes:
      - redis-data:/data

volumes:
  redis-data:

Drupal settings.php:

$settings['redis.connection']['host'] = 'redis';
$settings['redis.connection']['port'] = 6379;
$settings['cache']['default'] = 'cache.backend.redis';
Solr
# .ddev/docker-compose.solr.yaml
services:
  solr:
    image: solr:9
    container_name: ddev-${DDEV_SITENAME}-solr
    labels:
      com.ddev.site-name: ${DDEV_SITENAME}
      com.ddev.approot: $DDEV_APPROOT
    expose:
      - "8983"
    volumes:
      - solr-data:/var/solr
    command: solr-precreate drupal

volumes:
  solr-data:

访问 Solr:ddev describe 会显示 URL,通常为 https://<project>.ddev.site:8983

Elasticsearch
# .ddev/docker-compose.elasticsearch.yaml
services:
  elasticsearch:
    image: elasticsearch:8.11.0
    container_name: ddev-${DDEV_SITENAME}-elasticsearch
    labels:
      com.ddev.site-name: ${DDEV_SITENAME}
      com.ddev.approot: $DDEV_APPROOT
    environment:
      - discovery.type=single-node
      - xpack.security.enabled=false
      - "ES_JAVA_OPTS=-Xms512m -Xmx512m"
    expose:
      - "9200"
    volumes:
      - elasticsearch-data:/usr/share/elasticsearch/data

volumes:
  elasticsearch-data:
Mailpit(邮件测试)

DDEV 默认包含 Mailpit:

ddev launch -m           # Open Mailpit UI

所有发出的邮件都会被捕获到 https://<project>.ddev.site:8026

性能调优

Mutagen(macOS/Windows)

Mutagen 可加快文件同步,从而提升性能:

# Enable globally
ddev config global --mutagen-enabled

# Or per-project in .ddev/config.yaml
mutagen_enabled: true

适用 Mutagen 的场景:

  • 使用大型代码库(vendor、node_modules)的 macOS
  • 使用 WSL2 的 Windows
  • 文件 I/O 较慢的项目

Mutagen 命令:

ddev mutagen status      # Check sync status
ddev mutagen sync        # Force sync
ddev mutagen reset       # Reset if issues
NFS(macOS 替代方案)

在 macOS 上不使用 Mutagen 时:

ddev config global --nfs-mount-enabled
性能提示
  1. 从同步中排除不必要的文件:

    # .ddev/config.yaml
    upload_dirs:
      - sites/default/files
    
  2. 将 tmpfs 用于临时文件:

    # .ddev/docker-compose.performance.yaml
    services:
      web:
        tmpfs:
          - /tmp
    
  3. 为大型操作增加 PHP 内存:

    # .ddev/php/performance.ini
    memory_limit = 1024M
    

自定义 DDEV 命令

在 .ddev/commands/ 中创建项目专属命令:

# .ddev/commands/web/refresh
#!/bin/bash

## Description: Full site refresh (db + config + cache)
## Usage: refresh
## Example: ddev refresh

set -e

echo "Importing database..."
drush sql:drop -y
drush sql:cli < /var/www/html/reference.sql

echo "Importing config..."
drush config:import -y

echo "Running updates..."
drush updatedb -y

echo "Clearing cache..."
drush cache:rebuild

echo "Done!"

设置为可执行:chmod +x .ddev/commands/web/refresh

然后运行:ddev refresh

命令位置
  • .ddev/commands/web/ - 在 Web 容器中运行
  • .ddev/commands/host/ - 在主机上运行
  • .ddev/commands/db/ - 在数据库容器中运行

CI/CD 集成

GitHub Actions
# .github/workflows/test.yml
name: Tests
on: [push, pull_request]

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4

      - name: Setup DDEV
        uses: ddev/github-action-setup-ddev@v1

      - name: Start DDEV
        run: ddev start

      - name: Install dependencies
        run: ddev composer install

      - name: Run tests
        run: ddev exec ./vendor/bin/phpunit
GitLab CI
# .gitlab-ci.yml
test:
  image: ddev/ddev-gitpod-base:latest
  services:
    - docker:dind
  variables:
    DOCKER_HOST: tcp://docker:2375
  script:
    - ddev start
    - ddev composer install
    - ddev exec ./vendor/bin/phpunit

最佳实践

  1. 提交 .ddev 文件夹(.ddev/db_snapshots 除外,.ddev/.gitignore 已对此进行处理)
  2. 使用 .ddev/config.local.yaml 添加个人覆盖配置(已加入 git 忽略)
  3. 在项目 README 中记录自定义服务
  4. 执行有风险的数据库操作前创建快照
  5. 保持 DDEV 更新:ddev self-upgrade
  6. 在 macOS/Windows 上使用 Mutagen,以获得更佳性能
  7. 为重复性任务创建自定义命令
  8. 在 CI 中测试 DDEV 配置,及早发现问题

评论

支持 Markdown