PIP約束文件
回答
我認爲一個約束文件是一個很好的方法來保持你的「真正」的要求與完整安裝列表分開。
這是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。
我自己並沒有使用約束文件,所以我可能是錯的,但這裏是我從文檔中理解的。
假設您有多個使用pip安裝的項目。其中一些直接依賴於流行的包foobar,一些間接(通過它們的依賴),一些根本不依賴它。
有一天你決定改變foobar的代碼位,以解決有關環境問題的一些,這樣你就創建foobar的的本地副本。現在,您要確保所有項目都使用本地副本,但您不想花時間弄清楚哪些依賴於foobar,然後編輯它們的requirements.txt
或setup.py
文件。
這裏來約束文件,在那裏你指出你的本地foobar的的副本,並將其用於所有的項目,不關心這其中需要foobar的,因爲約束文件只當被實際安裝的工程應用取決於foobar(無論是直接還是間接)。
在reddit上有一個更好的可能用法示例。
所以如何將它與需求文件結合使用 –
@JamesLin不知道我是否正確理解你的問題,但這裏有一種可能的情況:你的requirements.txt包含單個包Flask。它取決於您爲什麼原因修改過的Werkzeug,並希望Flask取決於您的本地版本。所以你把它放在constraints.txt文件中,然後運行'pip install -r requirements.txt -c constraints.txt'。在這種簡單的情況下,你可以只使用requirements.txt,但是當你有多個具有複雜依賴樹的項目時,使用constrains.txt會更有意義。 –
- 1. Symfony:文件約束錯誤
- 2. Symfony 2文件約束
- 3. SQLServer2000約束條件
- 4. UITableViewCell約束條件
- 5. scipy.optimize.leastsq有約束約束
- 6. 約束ID屬性是XSD文件
- 7. Symfony2文件大小約束形式
- 8. 歡迎文件忽略安全約束
- 9. Oracle約束:混合唯一性和檢查約束條件
- 10. 「SQLSTATE [23000]:完整性約束違規」與有效約束條件
- 11. 在iOS7上的UICollectionViewCell子類中未約束的約束條件
- 12. Elasticsearch字段約束中的多個字段約束條件
- 13. 無法同時滿足約束條件 - 沒有約束到位
- 14. POSTGRESQL的約束條件
- 15. 更改約束條件
- 16. UILabel sizeToFit和約束條件
- 17. HABTM刪除約束條件
- 18. 覆蓋約束條件
- 19. Sybase - 默認約束條件
- 20. Oracle找到約束條件
- 21. GLPK MathProg - 條件約束
- 22. 或QueryOver的約束條件
- 23. terrain gen python約束條件
- 24. 優先約束條件
- 25. MySQL UNIQUE約束條件
- 26. ER圖和約束條件
- 27. SignalR.EventAggregatorProxy約束事件問題
- 28. Mysql的約束與條件
- 29. SQL Server 2012約束條件
- 30. 添加約束條件
您好我有點困惑,在約束中指定'python-openid == 2.2.5'和'python3-openid == 3.0.10'將有助於確定基於python版本使用哪一個? –
基於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