2012-07-13 12 views
35

特定のバージョン範囲に依存するようにパッケージを作成したいとします。 >= 0.5.0, < 0.7.0install_requiresオプションで可能ですか?もしそうなら、どのようにする必要がありますか?install_requires(setuptools、distribute)でバージョン範囲を指定する方法

+4

何を試しましたか? [The docs](http://peak.telecommunity.com/DevCenter/setuptools#declaring-dependencies)は、あなたの質問にあるような構文がうまくいくことを示唆しているようです。 – Blckknght

答えて

30

the documentationによれば、構文が正しく動作するはずです。

setuptoolspkg_resourcesは、プロジェクトの必要な依存関係を指定するための一般的な構文を使用します。ドキュメントがあると述べています。この構文は、プロジェクトのPyPI名とオプションでコンマで区切られた後に角括弧で囲まれた "extras"のリストと、コンマで区切られたバージョン指定子のリストで構成されます。バージョン指定子は、演算子<、>、< =、> =、==または!=のいずれかで、バージョン識別子が続きます。ドキュメントは、このような単純な例で示します

:あなたはあなたのパッケージがバージョン0.3よりも大きいが、バージョン0.5未満docutilsのバージョンを必要とする場合、その時に展開するには

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 

2つの追加のメモ。

  1. ドキュメントは、冗長/重複し依存関係の仕様はとてもdocutils >= 0.3, >=0.2docutils >= 0.3に統合されるだろう、内部的に結合されると述べています。
  2. また、矛盾するバージョン番号を指定する際には注意が必要です。"is meaningless and may therefore produce bizarre results."たとえば、理由はわかりませんが、これは使用できません。docutils >= 0.3, <=0.2これは不可能なためです。
+2

素晴らしい答えですが、私に混乱を招くのは、カンマが**または**、時には**と**を意味することです。厳密なバージョン仕様のリストには、「1.1または1.2 or ...」と「> = 0.3 、> = 0。2>から '> = 0.2'までしか意味がありません。しかし、 '> = 0.3、<= 0.5'またはバージョン仕様と矛盾しているあなたの段落は、**と**を意味するカンマが必要です。 – zpea

+0

@ zpea質問に基づいて構築する:バージョンの複数の範囲を定義する方法はありますか?例えば、(> = 1.0 AND <2) OR (> = 2.7 AND <2.9) OR (> = 4) ' – stefanfoulis

+0

文書は> 1、> 2が> 1になると言いますが、あなたが言ったように、> 2になるのがより理にかなっています。なぜ誰も知っていますか? –

13

非自発的なベータテストに注意してください。パッケージ保守者は、警告なしに、互換性のない、不完全な、または破損したa、b、およびcのリリースを一般の視聴者にリリースすることがあります。次にsetup.pyを新しいvirtualenvで実行すると、これらの中毒卵の1つをプルダウンすると、突然プログラムが中断します。

foo >=0.3, <0.4スタイルの宣言は、純粋な数値の上限を使用しないでください。 <0.4は、install_requiresと書くと、バージョン0.4a0、0.4a1、0.4b0、0.4c3などが許可されます。代わりに、<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ファイルでどのようにverlibを使用しますか( 'install_requires')? –

関連する問題