2012-07-13 32 views
35

我想製作一個包以取決於特定的版本範圍,例如>= 0.5.0, < 0.7.0。是否有可能在install_requires選項中,如果是這樣的話應該如何?如何在install_requires(setuptools,distribute)中指定版本範圍

+4

你嘗試過什麼? [文檔](http://peak.telecommunity.com/DevCenter/setuptools#declaring-dependencies)似乎表明,就像你在你的問題中的語法將工作。 – Blckknght 2012-07-15 18:49:08

回答

30

根據the documentation,您的語法應該正常工作。該文件指出:

setuptoolspkg_resources使用共同的語法,用於指定項目的需要的依賴。此語法由一個項目的PyPI名稱組成,可選地在方括號後跟隨逗號分隔的「extras」列表,可選地後跟逗號分隔的版本說明符列表。版本說明符是其中一個運算符<,>,< =,> =,==或!=,後跟版本標識符。

的文件給出了一個簡單的例子是這樣的:

docutils >= 0.3 

# comment lines and \ continuations are allowed in requirement strings 
BazSpam ==1.1, ==1.2, ==1.3, ==1.4, ==1.5, \ 
    ==1.6, ==1.7 # and so are line-end comments 

擴大後,如果你希望你的包需要一個版本的docutils大於0.3的版本,但低於0.5的版本,如代碼這將工作:

docutils >= 0.3, <=0.5 

兩個額外的筆記。

  1. 該文檔還指出冗餘/重疊的相關性規範將在內部結合,使docutils >= 0.3, >=0.2將被組合成docutils >= 0.3
  2. 另外,請注意指定相沖突的版本號,其中"is meaningless and may therefore produce bizarre results."例如,我不知道你爲什麼會,但不要使用這個:docutils >= 0.3, <=0.2,因爲這是不可能的。
+2

好的答案,但讓我困惑的是,逗號有時候意味着**或**,有時**和**:精確版本規範清單中明確指出「1.1或1.2或...」,並且結合了> = 0.3 ,> = 0。2'只是'> = 0.2'只有這個意義。但是'> = 0.3,<= 0.5'或者你的關於矛盾版本規範的段落需要用逗號來表示**和**。 – zpea 2012-07-21 22:34:58

+0

建立在@zpea的問題上:有沒有什麼辦法來定義多個版本的範圍?例如'(> = 1.0 AND <2) OR (> = 2.7 AND <2.9) OR (> = 4)' – stefanfoulis 2015-08-04 13:41:31

+0

文檔說,> 1,> 2會變成> 1,但如您所說,變爲> 2會更有意義。有人知道爲什麼 – 2017-07-18 08:33:53

13

對非自願的β測試謹慎。程序包維護人員有時會在不發出警告的情況下向普通用戶發佈不兼容,不完整或破壞的a,b和c版本。下一次在新的virtualenv中運行setup.py時,您可能會拉下其中一個有毒雞蛋,突然您的程序將會中斷。

爲了減輕這種風險,不要使用樣式聲明,它具有純數字上限。 <0.4仍然承認版本0.4a0,0.4a1,0.4b0,0.4c3等。相反,當您編寫install_requires時,請使用<0.4a0的上限,如foo >=0.3, <0.4a0

setuptools的做什麼意外,使用verlib你的版本比較建模嘗試。只要你的版本正常化並且沒有矛盾,Verlib是一個很好的選擇。下面是一個說明標準化版本的潛在反直覺的排序爲例:

#!/usr/bin/env python 

from verlib import NormalizedVersion as V 

assert (V("0.7.9") < V("0.8a0") < V("0.8a1") < V("0.8b0") < V("0.8b1") 
    < V("0.8b2") < V("0.8.0") < V("0.8.1a0") < V("0.8.1") < V("0.9") 
    < V("1.0a3") < V("1.0b2") < V("1.0b20") < V("1.0c0") < V("1.0") 
    < V("1.0.1")) 

assert (V("0.7.9") < V("0.8.0a0") < V("0.8.0a1") < V("0.8.0b0") 
    < V("0.8.0b1") < V("0.8.0b2") < V("0.8.0") < V("0.8.1a0") < V("0.8.1") 
    < V("0.9") < V("1.0a3") < V("1.0b2") < V("1.0b20") < V("1.0c0") 
    < V("1.0") < V("1.0.1")) 

print "Version comparisons are sane." 
+1

如何在setup.py文件('install_requires')中使用verlib? – 2014-04-05 15:51:07

相關問題