当您要在多个平台(即Windows、Linux和Mac)上开发和运行应用程序代码时,是否有使用pipenv进行确定性构建的最佳实践?
例如,如果您要在基于Windows的环境中安装库作为条件依赖项。,则使用pytest。
但是如果我定义..。
[dev-packages]
pytest = "*"在我的项目的Pipfile和运行pipenv install --dev中,需要在基于Linux的Python环境中生成初始Pipfile.lock,因此在生成的Pipfile.lock文件中既没有安装atomicwrites,也没有以任何方式指定atomicwrites。
稍后,在我git commit我的新Linux生成的Pipfile.lock之后,我或其他人最终会将提交的Pipfile.lock文件拉到他们的Pipfile.lock机器上,并运行pipenv install --dev来生成他们自己的本地pipenv环境。
pytest测试运行程序时,它会失败,因为atomicwrites不会安装在他们的pipenv环境中,因此pytest命令会因为缺少依赖关系而失败。pipenv也无法在那里安装atomicwrites依赖项(因为它不会在回购程序的Pipfile.lock规范中指定)。这个pytest示例是这个问题的一个非常简单的例子。在这种情况下,只要在我的atomicwrites中添加[dev-packages]作为我的[dev-packages]需求之一就足够容易了,这样就可以不考虑平台而安装它,甚至添加sys_platform = "== 'win32'"来指定它只应该由pipenv在Windows平台上安装。
然而,当我的项目有许多依赖项时,这些平台条件依赖关系变得更加难以处理,所有这些依赖项都有它们自己的平台条件依赖关系。
但是,我还没有找到任何简单的方法来处理这个问题(除了在不同的平台上运行pipenv之前不使用Pipfile.lock或删除pipenv install --dev文件)。
是否有任何pipenv用户有处理这个多操作系统Pipfile.lock安装问题的推荐最佳实践?
发布于 2021-12-06 15:58:16
这显然太晚了,无法对您有所帮助,但我发现,在这些多个环境中生成锁文件,同时保持过时的版本,解决了pipenv的大多数问题。
例如,我们的CI/CD使用GitHub映像,因此在中:
pipenv install --dev然后,在Windows shell中
pipenv install --dev --keep-outdated然而,在Windows中运行有时会导致依赖于该平台(colorama目前正在编写这个答案时就这样做了)。为了避免这种情况,您可以在WSL中重新生成锁文件:
pipenv lock --dev --keep-outdated这将保持“过时”包来自Windows环境,但通常会修复平台条件。
请注意,上面的舞蹈最终不是万无一失的--我发现了这个问题,因为这个确切的方法并不适用于atomicwrites。但是,它似乎解决了绝大多数问题,以及那些通常无法通过手动将包添加到依赖项中来解决的问题。
https://stackoverflow.com/questions/62785666
复制相似问题