[英]How to remove a pipenv's PipFile, PipFile.lock and associated virtualenv?
[英]Best practice for using pipenv Pipfile and Pipfile.lock across multiple platforms
當您要在多個平台(即 Windows、Linux 和 Mac)上開發和運行應用程序代碼時,是否有使用pipenv
進行確定性構建的最佳實踐?
例如,如果您在基於 Windows 的 Python 環境中安裝pytest
, 則atomicwrites
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.