簡體   English   中英

為什么pipenv需要Pipfile和Pipfile.lock?

[英]Why does pipenv need Pipfile and Pipfile.lock?

(我認為[!])我了解pipenv (和其他 venvs)背后的原理並經常使用它們。 但是,我從來沒有真正理解為什么pipenv需要PipfilePipfile.lock文件。

這個答案暗示,本教程

現在,一旦您在生產環境中獲得代碼和 Pipfile.lock,您應該安裝記錄的最后一個成功環境:

 $ pipenv install --ignore-pipfile

但它並沒有解釋為什么需要使用Pipfile.lock .lock文件包含Pipfile不包含的Pipfile ,以及為什么Pipfile足以與其他開發人員共享:

現在假設另一個開發人員想要對您的代碼進行一些添加。 在這種情況下,他們將獲取代碼,包括 Pipfile,並使用以下命令:

 $ pipenv install --dev

但不足以用於在生產中復制您的環境嗎?

官方 Pipfile 項目對此有話要說

Python 應用程序的具體要求來自Pipfile 這將包括應從何處獲取包及其松散的版本約束。

環境的詳細信息(所有已安裝的帶有固定版本和其他詳細信息的包)將存儲在Pipfile.lock ,以實現可重復性。 該文件將自動生成,用戶不應修改。

換句話說, Pipfile給人用的Pipfile.lock是給電腦用的

在您的Pipfile您列出了該文件中所需的內容,並以一種有點松散的方式定義它們,例如“Django 版本 2 或更高版本”。 但這還不足以確定性地重現環境。 那是指“Django 2.0.3”還是“Django 2.1.0”?

Pipfile.lock准確地指定了需求,它也准確地指定了依賴項 例如,如果您明確想要foo並將其放入您的Pipfile ,則會生成您的Pipfile.lock將其鎖定到特定版本。 如果foo本身依賴於bar ,而bar依賴於quuxflorp ,則Pipfile.lock文件也會鎖定barquuxflorp ,因此依賴關系的微小差異不會破壞事情。

正如@Chris 所說, Pipfile.lock適用於計算機,而Pipfile則適用於人類。 如果你查看Pipfile.lock文件,你會發現每個依賴項甚至都有 sha256 代碼!

該文件是人類無法處理的,您只能處理Pipfile 但是Pipfile不夠嚴格,無法重現完全相同的環境。 所以這就是為什么我們還需要一個Pipfile.lock

這是一個類似 npm 的工具。(也許?)
Pipfile是標識你的項目的依賴,你會從Pipfile得到依賴樹。
但是根據不同的來源,你會得到不同的包。 所以你可以從.lock文件中獲得實際的本地依賴。
例如,在 Pipfile 中,您可以看到如下內容:

matplotlib = "*"
numpy = "*"

但是在.lock文件中,您將看到實際的依賴項,例如:

"pytz": {
        "hashes": [
            "sha256:a061aa0a9e06881eb8b3b2b43f05b9439d6583c206d0a6c340ff72a7b6669053",
            "sha256:ffb9ef1de172603304d9d2819af6f5ece76f2e85ec10692a524dd876e72bf277"
        ],
        "version": "==2018.5"
    }

簡而言之, Pipfile是為了更兼容,而.lock文件是為了獲取本地的實際依賴。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM