Pipfile.lock自动更新的触发场景与未触发原因问询
关于Pipenv锁文件自动更新的问题
问题背景
在GitHub Actions工作流中执行以下命令时出现报错:
pip install pipenv pipenv install --dev pipenv run dbt deps
报错信息为/bin/sh: 1: dbt: not found,排查发现pipenv install --dev未安装dbt,原因是Pipfile.lock中没有包含dbt相关依赖。手动执行pipenv lock并推送新的锁文件后,工作流恢复正常。
对应的Pipfile配置如下:
[[source]] url = "https://pypi.org/simple" verify_ssl = true name = "pypi" [packages] dbt-core = "==1.5.4" dbt-snowflake = "~=1.5" [dev-packages] pytest = "==7.1.2" pytest-env = "==0.6.2" schemachange = "==3.5.3" pre-commit = "*" black = "*" isort = "*" cryptography= "==41.0.6" mypy = "==1.3.0" [requires] python_version = "3.10"
此前该工作流长期正常运行,无明显变更却突然失败。对比成功与失败的运行日志:成功运行时Pipenv检测到Pipfile.lock过期并自动更新,失败运行时则直接使用旧锁文件。
疑问
- Pipenv自动更新锁文件的场景有哪些?
- Pipenv不会自动更新锁文件的场景有哪些?
回答
1. Pipenv自动更新锁文件的场景
Pipfile内容发生变更(新增/删除依赖、修改版本约束),且不存在Pipfile.lock,或Pipfile的修改时间晚于Pipfile.lock时,执行pipenv install(含--dev参数)会自动更新锁文件。- 当前系统Python版本与
Pipfile中[requires]指定的版本不匹配,而锁文件基于其他Python版本生成,pipenv install会自动更新锁文件适配当前环境。 - 执行
pipenv update命令时,会按Pipfile的版本约束更新所有依赖并重新生成锁文件。 Pipfile.lock本身损坏或格式错误时,pipenv install会尝试重新生成锁文件。
2. Pipenv不会自动更新锁文件的场景
Pipfile无任何变更,且Pipfile.lock的修改时间晚于Pipfile,执行pipenv install会直接使用现有锁文件,不触发更新。- 执行
pipenv install时添加了--ignore-pipfile参数,强制使用锁文件安装,不会检查或更新锁文件。 - 依赖源(如PyPI)网络连接异常,导致Pipenv无法获取依赖信息完成更新,会直接使用旧锁文件(若存在)。
- 锁文件记录的依赖版本完全符合
Pipfile的约束,无任何依赖需要更新时,不会自动更新锁文件。 - CI/CD环境中缓存了
Pipfile.lock且缓存未失效,Pipenv会直接使用缓存的锁文件,不进行自动更新。
内容的提问来源于stack exchange,提问作者jamiet
相关产品推荐
相关产品推荐

