在Travis-CI测试中使用Pipenv的最佳实践及疑问咨询
首先先解释你看到的那条警告信息:
Courtesy Notice: Pipenv found itself running within a virtual environment, so it will automatically use that environment, instead of creating its own for any project. You can set PIPENV_IGNORE_VIRTUALENVS=1 to force pipenv to ignore that environment and create its own instead. You can set PIPENV_VERBOSITY=-1 to suppress this warning.
这个提示只是在告诉你:Travis CI本身会为你的Python项目创建一个默认虚拟环境,Pipenv检测到这个环境后,就直接复用它,不会再额外创建新的虚拟环境——这是完全正常的行为,不用过度担心。
接下来逐个解答你的疑问:
1. 在Travis环境中是否应该使用Pipenv?这是否会违背CI测试的初衷?
当然可以用Pipenv,而且完全不违背CI测试的核心初衷。CI的目标是在可控、一致的环境中验证代码稳定性,而Pipenv的核心价值就是通过Pipfile和Pipfile.lock精确锁定依赖版本,保证开发环境和CI环境的依赖完全一致——这反而和CI的目标高度契合,能帮你避免“本地运行正常,CI却报错”的依赖不一致问题。
那条警告只是Pipenv的友好提示,并没有影响依赖安装和测试的可靠性。
2. 开发用Pipenv、CI用Travis的最佳实践是什么?
这里给你几个实用建议:
- 抑制警告(可选):如果不想看到这条提示,可以在
.travis.yml中添加环境变量PIPENV_VERBOSITY=-1;如果你希望Pipenv完全独立创建自己的虚拟环境,也可以设置PIPENV_IGNORE_VIRTUALENVS=1——不过一般来说复用Travis的默认环境更高效,没必要额外创建。 - 用
--deploy参数保证依赖一致性:在执行pipenv install时加上--deploy,这样如果Pipfile和Pipfile.lock不一致(比如你本地修改了Pipfile但没更新lock文件),Pipenv会直接报错,避免CI环境安装不符合预期的依赖,进一步强化环境一致性。 - 关于是否直接运行脚本命令:两种方式都可行,但更推荐继续用
pipenv run——它能确保命令是在Pipenv管理的环境中执行,避免Travis全局环境的干扰。如果你想简化,也可以直接运行脚本对应的命令(比如python -m pytest --cov=marian tests),前提是你已经通过pipenv install --dev把依赖安装到了当前环境(也就是Travis的虚拟环境)。 - 启用缓存加速构建:Travis支持缓存,可以把Pipenv的虚拟环境目录加入缓存,减少每次构建的依赖安装时间。
3. 针对你的配置的优化建议
你的现有配置已经很规范了,这里做几个小调整来提升可靠性和效率:
优化后的.travis.yml:
language: python python: - "3.6" env: - PIPENV_VERBOSITY=-1 # 抑制警告,让日志更干净 install: - pip install --upgrade pip # 先升级pip,避免安装Pipenv时的兼容性问题 - pip install pipenv - pipenv install --dev --deploy # --deploy强制依赖与Pipfile.lock一致 script: - pipenv run unit_tests - pipenv run linting - pipenv run docs cache: pip: true directories: - $HOME/.local/share/virtualenvs # 缓存虚拟环境,加速后续构建
另外记得把Pipfile.lock提交到代码仓库,这样CI环境才能精确安装和你本地完全一致的依赖。
内容的提问来源于stack exchange,提问作者electricwizard

