pipenv不能真正隔离开发与生产环境依赖,因其默认install会装入全部依赖;需显式设置pipenv_dev=0并配合--ignore-pipfile和--skip-lock才能确保仅安装production包。

pipenv 不能真正隔离开发与生产环境依赖——它只靠 Pipfile 中的 [dev-packages] 和 [packages] 区分,但 pipenv install 默认会装全部,部署时若不加 --skip-lock 或手动过滤,极易把 dev-only 包(如 pytest、black)打进生产镜像。
为什么 pipenv install --deploy 不等于“只装 production 依赖”
很多人以为 pipenv install --deploy 会自动跳过 [dev-packages],其实它只是校验 Pipfile.lock 是否被修改,不检查安装范围。实际行为取决于你上次运行 pipenv lock 时的上下文:
- 如果上次
pipenv lock是在完整环境(含 dev)下执行的,Pipfile.lock就包含所有包,--deploy仍会全量安装 -
pipenv install --ignore-pipfile才强制按 lock 文件装,但依然不分 dev/non-dev - 真正生效的开关是
PIPENV_DEV=0 pipenv install(Linux/macOS)或set PIPENV_DEV=0 && pipenv install(Windows)
PIPENV_DEV 环境变量怎么用才可靠
这个变量控制 pipenv install 是否读取 [dev-packages],但它有陷阱:
- 必须在
pipenv install命令执行前设置,且不能和--dev参数共存(后者优先级更高) -
PIPENV_DEV=0 pipenv install→ 只装[packages],跳过[dev-packages] -
PIPENV_DEV=1 pipenv install或直接pipenv install --dev→ 两者都装 - CI/CD 中建议显式写成
export PIPENV_DEV=0 && pipenv install --ignore-pipfile,避免依赖本地 shell 配置
生产部署时最简安全流程
别信“一键部署”,关键步骤必须显式拆开:
- 开发机上:先
pipenv lock(确保Pipfile.lock已更新),再git add Pipfile Pipfile.lock - 部署机上:
pipenv --python 3.9(指定 Python 版本,避免用系统默认) - 然后执行:
PIPENV_DEV=0 pipenv install --ignore-pipfile --skip-lock——--skip-lock防止重生成 lock,--ignore-pipfile强制只读 lock 文件 - 验证:
pipenv graph --reverse查看是否混入了pytest、mypy等典型 dev 包
真正的麻烦不在命令本身,而在于团队对 Pipfile 的维护习惯:只要有人在生产环境里随手敲了 pipenv install pytest --dev,再忘记 pipenv lock,整个部署链就不可信了。lock 文件不是保险柜,是快照——拍得不准,回放就错。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!











