python - 跨多个平台使用 pipenv Pipfile 和 Pipfile.lock 的最佳实践
问题描述
pipenv
当您要在多个平台(即 Windows、Linux 和 Mac)上开发和运行应用程序代码时,是否有用于确定性构建的最佳实践?
例如,如果您在基于 Windows 的 Python 环境中安装,则要求将库pytest
定义atomicwrites
为条件依赖项。pytest
但是,如果我定义...
[dev-packages]
pytest = "*"
作为我的项目的要求Pipfile
并运行以在基于 Linux 的 Python 环境中pipenv install --dev
生成我的初始值,然后在生成的文件中既没有安装也没有以任何方式指定。Pipfile.lock
atomicwrites
Pipfile.lock
稍后,在我git commit
创建了新的 Linux-generatedPipfile.lock
之后,我或其他人最终会将提交Pipfile.lock
的文件下载到他们的 Windows 机器上,并运行pipenv install --dev
以生成他们自己的本地pipenv
环境。
但是,当他们去运行
pytest
test-runner 时,它会失败,因为atomicwrites
不会在他们的pipenv
环境中安装,因此pytest
命令会因为缺少依赖项而失败。更重要的是,当使用像 GitHub Actions 或 Azure Pipelines 这样的 CI 服务时,我的 Windows 测试构建也会失败,因为
pipenv
在那里也无法安装atomicwrites
依赖项(因为它不会在 repo 的Pipfile.lock
规范中指定)。
这个pytest
例子是这个问题的一个超级简单的例子。atomicwrites
在这种情况下,只需将其添加为我的[dev-packages]
要求之一就很容易了,Pipfile
以便无论平台如何都可以安装它,或者甚至添加sys_platform = "== 'win32'"
以指定它只能pipenv
在 Windows 平台上安装。
但是,当我的项目有很多依赖项时,这些平台条件依赖项变得更难处理,所有依赖项都有自己的平台条件依赖项。
但是,我还没有找到任何直接的方法来处理这个问题(在不同平台上运行之前不使用pipenv
或删除Pipfile.lock
文件)。pipenv install --dev
是否有任何pipenv
用户有推荐的最佳实践来处理这个多操作系统Pipfile.lock
安装问题?
解决方案
这显然为时已晚,对您没有帮助,但我发现在这些多个环境中生成锁定文件同时保持过时版本解决了 pipenv 的大部分问题。
例如,我们的 CI/CD 使用 GitHub 图像,因此在 Linux 外壳的 Windows 子系统中:
pipenv install --dev
然后,在 Windows shell 中
pipenv install --dev --keep-outdated
但是,在 Windows 中运行有时可以将依赖项固定到该平台(在撰写本答案时,colorama 目前正在执行此操作)。为避免这种情况,您可以在 WSL 中重新生成锁定文件:
pipenv lock --dev --keep-outdated
这将使“过时”的软件包远离仅限 Windows 的环境,但通常会修复平台条件。
请注意,上面的舞蹈最终并不是万无一失的——我发现这个问题是因为这个确切的方法不适用于atomicwrites
. 但是,它似乎可以解决绝大多数问题,而那些通常无法通过手动将包添加到依赖项来解决的问题。
推荐阅读
- go - GO resty 相当于下面的 CURL 命令
- c# - 自定义每个类的属性的 Json 序列化
- reactjs - React JS - Firestore,如何在文档中保存特定集合文档的 UID
- nginx - Nginx,使用certbot时无法将www域重定向到https非www域
- python - 组合具有各种外键的关系数据库的两个组合框
- java - java 在 Netbeans 中回答 exec-maven-plugin:1.2.1
- php - 使用 php 从对象 json 读取数据
- python - KivyMD 对话框未调整其小部件的大小
- visual-studio-2019 - 打开任何 Razor 页面后 VS2019 崩溃;“由于内部错误,Razor Taghelper 提供程序当前不可用”
- javascript - 对象为空时如何阻止useSelector触发?