繁体   English   中英

跨多个平台使用 pipenv Pipfile 和 Pipfile.lock 的最佳实践

[英]Best practice for using pipenv Pipfile and Pipfile.lock across multiple platforms

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

例如,如果您在基于 Windows 的 Python 环境中安装pytestatomicwrites pytest定义为条件依赖项。

但是,如果我定义...

[dev-packages]
pytest = "*"

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

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

  • 但是,当他们 go 运行pytest测试运行程序时,它将失败,因为atomicwrites不会安装在他们的pipenv环境中,因此pytest命令将失败,因为缺少依赖项。

  • What's more, my Windows test-build will also fail when using a CI service like GitHub Actions or Azure Pipelines because pipenv will fail to install the atomicwrites dependency there too (because it will not be specified in the repo's Pipfile.lock specifications).

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

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

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

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

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

这显然为时已晚,对您没有帮助,但我发现在这些多个环境中生成锁定文件同时保持过时版本解决了 pipenv 的大部分问题。

例如,我们的 CI/CD 使用 GitHub 图像,因此在 Windows 子系统中 Linux Z2591C98B70119FE62E91898B:

pipenv install --dev

然后,在 Windows shell

pipenv install --dev --keep-outdated

但是,在 Windows 中运行有时可以将依赖项固定到该平台(在撰写本答案时,colorama 目前正在执行此操作)。 为避免这种情况,您可以在 WSL 中重新生成锁定文件:

pipenv lock --dev --keep-outdated

这将使“过时”的软件包远离仅限 Windows 的环境,但通常会修复平台条件。

请注意,上面的舞蹈最终并不是万无一失的——我发现了这个问题,因为这个确切的方法不适用于atomicwrites 但是,它似乎可以解决绝大多数问题,而那些通常无法通过手动将 package 添加到您的依赖项来解决的问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM