一、依赖文件结构规范

requirements/
├── base.txt       # 所有环境基础依赖
├── dev.txt        # 开发环境专用依赖
├── prod.txt       # 生产环境专用依赖
└── constraints.txt # 版本约束文件(可选)

二、各文件具体内容及作用

1. base.txt(跨环境基础依赖)

# 核心框架
Django==4.2.3
djangorestframework==3.14.0

# 数据库驱动
psycopg2-binary==2.9.6
redis==4.5.5

# 异步支持
celery==5.3.1

# 严格指定版本格式
sqlalchemy==1.4.46 \
    --hash=sha256:abc123... \
    --hash=sha256:def456...

最佳实践

  • 使用双等号固定精确版本

  • 对关键依赖添加hash校验(通过 pip hash 生成)

  • 按功能模块分组注释

2. dev.txt(开发环境扩展)

-r base.txt  # 继承基础依赖

# 测试框架
pytest==7.3.1
pytest-django==4.5.2
factory-boy==3.2.1

# 代码质量
flake8==6.0.0
black==23.3.0
mypy==1.3.0

# 文档生成
sphinx==6.1.3

# 本地调试
ipython==8.12.0
debugpy==1.6.7

3. prod.txt(生产环境优化)

-r base.txt  # 继承基础依赖

# 生产专用依赖
gunicorn==20.1.0
uvicorn==0.22.0
sentry-sdk==1.25.1

# 性能优化
psutil==5.9.5
orjson==3.8.12

# 安全扫描
bandit==1.7.5

4. constraints.txt(跨环境版本约束)

# 统一版本约束
django==4.2.3
requests==2.30.0
sqlalchemy==1.4.46

三、具体操作流程

传统方式(requirements.txt)

  1. 初始化依赖

python -m venv .venv
source .venv/bin/activate

# 安装开发依赖
pip install -r requirements/dev.txt
  1. 更新依赖树

# 安装新包
pip install package==x.x.x

# 生成锁定文件
pip freeze --exclude-editable > requirements/base.txt

# 分离生产依赖
pip freeze --exclude-editable | grep -vE 'pytest|mypy' > requirements/prod.txt
  1. 生产环境安装

pip install -r requirements/prod.txt --no-deps

现代方式(推荐使用Poetry)

  1. 初始化配置

poetry init  # 生成pyproject.toml
  1. pyproject.toml示例

[tool.poetry]
name = "myproject"
version = "0.1.0"

[tool.poetry.dependencies]
python = "^3.9"
django = "4.2.3"
psycopg2 = {version = "2.9.6", extras = ["binary"]}

[tool.poetry.dev-dependencies]
pytest = "7.3.1"
black = "23.3.0"

[tool.poetry.group.prod.dependencies]
gunicorn = "20.1.0"
  1. 常用命令

# 添加生产依赖
poetry add django@4.2.3

# 添加开发依赖
poetry add --group dev pytest

# 安装全部依赖
poetry install

# 仅安装生产依赖
poetry install --only main

# 生成锁定文件
poetry lock  # 生成poetry.lock

# 导出requirements.txt
poetry export -f requirements.txt --output requirements/prod.txt --without-hashes

四、版本控制策略

  1. 必须纳入版本控制

  • pyproject.toml(Poetry)

  • poetry.lock / pipenv.lock

  • requirements/*.txt

  1. 忽略文件

  • 虚拟环境目录(.venv/)

  • pycache/

  • *.egg-info/

五、多环境管理方案

# 使用环境变量区分
export ENV_MODE=production

# 安装时动态选择
if [ "$ENV_MODE" = "production" ]; then
    pip install -r requirements/prod.txt
else
    pip install -r requirements/dev.txt
fi

# 使用direnv工具(推荐)
# .envrc文件内容
layout poetry
export DJANGO_SETTINGS_MODULE=config.settings.${ENV:-dev}

六、安全审计流程

  1. 定期扫描:

pip-audit  # 官方漏洞扫描
safety check -r requirements/prod.txt
  1. 更新策略:

# 半自动更新
pip list --outdated
poetry update --dry-run

# 批量升级命令
poetry update package1 package2

七、企业级最佳实践

  1. 分层依赖管理

  • 基础层:OS级依赖(Dockerfile中定义)

  • 应用层:Python包依赖(poetry管理)

  • 服务层:基础设施依赖(Kubernetes Helm Charts)

  1. 私有源集成

# poetry私有源配置
[[tool.poetry.source]]
name = "private"
url = "https://pypi.example.com/simple"
default = true
  1. 依赖矩阵测试

# GitHub Actions示例
jobs:
  test:
    strategy:
      matrix:
        python-version: ["3.9", "3.10", "3.11"]
        django-version: ["4.2.3", "4.1.9"]
    steps:
      - run: poetry add django@${{ matrix.django-version }}

建议结合Docker镜像构建,实现完全可重复的依赖安装:

FROM python:3.9-slim

# 优先安装系统依赖
RUN apt-get update && apt-get install -y \
    build-essential \
    libpq-dev

# 使用poetry安装Python依赖
RUN pip install poetry
COPY pyproject.toml poetry.lock ./
RUN poetry config virtualenvs.create false \
    && poetry install --no-dev --no-interaction --no-ansi

通过这种分级管理方案,既能保证开发灵活性,又能确保生产环境的稳定性。建议优先采用Poetry等现代化工具,其依赖解析算法(使用SAT solver)能有效处理复杂依赖关系,避免传统requirements.txt容易出现的版本冲突问题。