2016-01-07 25 views
8

我讀docs,不能換我的頭周圍:PIP約束文件

約束文件要求文件只控制其中 版本要求的安裝,而不是無論是安裝還是 不是。它們的語法和內容幾乎與要求 文件相同。

有一個關鍵區別:在約束文件 中包括一個包不會觸發安裝該包。

  • 那麼這是否意味着我需要先要求文件然後運行約束?
  • 需要同時具備requirements.txt和constraints.txt嗎?
  • 或者只是-c requirements.txt

請問有人請用簡單的英語解釋一下新的PIP功能:限制文件是做什麼的?

回答

8

我認爲一個約束文件是一個很好的方法來保持你的「真正」的要求與完整安裝列表分開。

這是good practice在您的需求文件中完整指定軟件包版本。例如,如果您正在使用的Django LTS安裝django-allauth,將其固定到最新版本(我的答案):

Django==1.8.12 
django-allauth==0.25.2 

當您安裝包,它結束了安裝一些所需的軟件包爲好。所以,你添加爲好,這樣每個人都得到包的版本相同:

Django==1.8.12 
django-allauth==0.25.2 
oauthlib==1.0.3 
python-openid==2.2.5 
requests==2.9.1 
requests-oauthlib==0.6.1 

然後你會得到錯誤報告「沒有的Python 3下工作」。哎呀,python-openid是Python的只有2個,而python3-openid來代替,進一步要求defusedxml

Django==1.8.12 
django-allauth==0.25.2 
oauthlib==1.0.3 
python-openid==2.2.5 ; python_version < '3.0' 
python3-openid==3.0.10 ; python_version >= '3.0' 
defusedxml==0.4.1  ; python_version >= '3.0' 
requests==2.9.1 
requests-oauthlib==0.6.1 

現在requirements.txt越來越難看,這是很難看到的Django的「要求」和Django的allauth在一塌糊塗。

這裏是一個requirements.txt是指約束文件:

-c constraints.txt 
Django==1.8.12 
django-allauth==0.25.2 

而且constraints.txt有幫助的註釋:需要

# django-allauth requirements 
oauthlib==1.0.3 
python-openid==2.2.5 
python3-openid==3.0.10 
defusedxml==0.4.1 
requests==2.9.1 
requests-oauthlib==0.6.1 

沒有Python的分類,因爲約束只有一個包安裝要求他們,否則將被忽略。另外,如果一個包裹在路上停下來需要另外2年的包裹,新安裝將停止安裝。

我覺得這個,加上一些評論,是一種有用的方式來傳達你正在使用什麼軟件包的項目,以及哪些包含,因爲它們是依賴項。

如果您使用pip 8.x的hash-checking mode,我認爲它會變得更加有用,它需要指定相關依賴關係的版本。如果沿着這條路走下去,我推薦hashin來幫助你管理哈希。有關使用約束和散列的複雜需求設置,請參閱browsercompat

+1

您好我有點困惑,在約束中指定'python-openid == 2.2.5'和'python3-openid == 3.0.10'將有助於確定基於python版本使用哪一個? –

+1

基於Python版本選擇''python-openid''或''python3-openid''的代碼位於[django-allauth的setup.py]中(https://github.com/pennersr/django-allauth/斑點/主/ setup.py#L107-L111)。如果你使用的是Python 2.x,那麼''django-allauth''會請求''python-openid> = 2.2.5'',並且''constraints.txt''文件會說「並且使它成爲2.2版本.5" 。 – jwhitlock

1

我自己並沒有使用約束文件,所以我可能是錯的,但這裏是我從文檔中理解的。

假設您有多個使用pip安裝的項目。其中一些直接依賴於流行的包foobar,一些間接(通過它們的依賴),一些根本不依賴它。

有一天你決定改變foobar的代碼位,以解決有關環境問題的一些,這樣你就創建foobar的的本地副本。現在,您要確保所有項目都使用本地副本,但您不想花時間弄清楚哪些依賴於foobar,然後編輯它們的requirements.txtsetup.py文件。

這裏來約束文件,在那裏你指出你的本地foobar的的副本,並將其用於所有的項目,不關心這其中需要foobar的,因爲約束文件只當被實際安裝的工程應用取決於foobar(無論是直接還是間接)。


reddit上有一個更好的可能用法示例。

+0

所以如何將它與需求文件結合使用 –

+0

@JamesLin不知道我是否正確理解你的問題,但這裏有一種可能的情況:你的requirements.txt包含單個包Flask。它取決於您爲什麼原因修改過的Werkzeug,並希望Flask取決於您的本地版本。所以你把它放在constraints.txt文件中,然後運行'pip install -r requirements.txt -c constraints.txt'。在這種簡單的情況下,你可以只使用requirements.txt,但是當你有多個具有複雜依賴樹的項目時,使用constrains.txt會更有意義。 –