簡體   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