首页 > 解决方案 > 跨多个平台使用 pipenv Pipfile 和 Pipfile.lock 的最佳实践

问题描述

pipenv当您要在多个平台(即 Windows、Linux 和 Mac)上开发和运行应用程序代码时,是否有用于确定性构建的最佳实践?

例如,如果您在基于 Windows 的 Python 环境中安装,则要求将库pytest定义atomicwrites为条件依赖项。pytest

但是,如果我定义...

[dev-packages]
pytest = "*"

作为我的项目的要求Pipfile并运行以在基于 Linux 的 Python 环境中pipenv install --dev生成我的初始值,然后在生成的文件中既没有安装也没有以任何方式指定。Pipfile.lockatomicwritesPipfile.lock

稍后,在我git commit创建了新的 Linux-generatedPipfile.lock之后,我或其他人最终会将提交Pipfile.lock的文件下载到他们的 Windows 机器上,并运行pipenv install --dev以生成他们自己的本地pipenv环境。

这个pytest例子是这个问题的一个超级简单的例子。atomicwrites在这种情况下,只需将其添加为我的[dev-packages]要求之一就很容易了,Pipfile以便无论平台如何都可以安装它,或者甚至添加sys_platform = "== 'win32'"以指定它只能pipenv在 Windows 平台上安装。

但是,当我的项目有很多依赖项时,这些平台条件依赖项变得更难处理,所有依赖项都有自己的平台条件依赖项。

我在几个不同的地方看到过这个问题,比如这里这里

但是,我还没有找到任何直接的方法来处理这个问题(在不同平台上运行之前不使用pipenv或删除Pipfile.lock文件)。pipenv install --dev

是否有任何pipenv用户有推荐的最佳实践来处理这个多操作系统Pipfile.lock安装问题?

标签: pythonpipenv

解决方案


这显然为时已晚,对您没有帮助,但我发现在这些多个环境中生成锁定文件同时保持过时版本解决了 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. 但是,它似乎可以解决绝大多数问题,而那些通常无法通过手动将包添加到依赖项来解决的问题。


推荐阅读