2016-01-07 15 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醜いなっている、そしてそれはジャンゴの「要件」を参照してくださいするのは難しいとでジャンゴ - allauth混乱。パッケージ場合は制約がのみインストールされているので、

# 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の分類が必要とされている:役に立つコメント付き

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

そしてconstraints.txt:ここ

は、制約ファイルを参照 requirements.txtですそれらを必要とし、そうでなければ無視されます。さらに、パッケージが2年後に別のパッケージを必要としなくなった場合、新しくインストールするとインストールが中止されます。

私はこれに加えていくつかのコメントは、あなたがプロジェクトに使用しているパッケージと、それが依存関係であるためにどのパッケージが含まれているかを伝える便利な方法だと思います。

私はあなたが依存関係-の依存関係のためのバージョンを指定して必要とする、ピップ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''をピックアップコードは[ジャンゴ-allauthのsetup.py]である(https://github.com/pennersr/django-allauth/ blob/master/setup.py#L107-L111)。あなたは、Python 2.xの上にある場合は、 ''ジャンゴ-allauth''は2.2.5'' =>のpython-openidの ''要求します、と '' constraints.txt''ファイルは言う「と、それは正確にバージョン2.2になります.5 "。 – jwhitlock

1

私が使用していないファイルを自分自身を制約するので、私は間違っているかもしれないが、ここで私はドキュメントからそれを理解する方法です。

たとえば、pipを使用して複数のプロジェクトをインストールしているとします。それらのうちのいくつかは人気のあるパッケージfoobarに直接依存していますが、間接的に(依存関係を介して)いくつかはそれに全く依存しません。あなたが先に行くとfoobarにのローカルコピーを作成しますので、ご使用の環境に関連するいくつかの問題を解決するために、foobarのコードを少し変更することを決定

ある日。今、あなたは、すべてのプロジェクトは、このローカルコピーを使用するようにしたい、しかし、あなたはfoobarにに依存し、それらのどの把握して、そのrequirements.txtsetup.pyファイルを編集する時間を費やす必要はありません。ここで

は制約ファイルのみプロジェクトが実際にインストールされたときに適用されるため、 foobarのを必要とするそれらのあなたが foobarにのローカルコピーを指摘して、すべてのプロジェクトのために思いやりのない、それを使用して制約ファイルを、来ます foobar(直接的であれ間接的であれ)に依存します。


redditに可能な使用例があります。

+0

ので、どのように要件ファイル –

+0

@JamesLinないように注意してくださいと一緒にそれを使うのですが、ここでは一つの可能​​なシナリオがあります:あなたのrequirements.txtは、フラスコ、単一のパッケージが含まれています。それは何らかの理由で修正したWerkzeugに依存し、Flaskがあなたのローカルバージョンに依存するようにしたい。ですから、それをconstraints.txtに置き、 'pip install -r requirements.txt -c constraints.txt'を実行します。この単純化した場合、あなただけのrequirements.txtで行うが、constrains.txtを使用することで、複雑な依存関係ツリーで複数のプロジェクトを持っているより多くの理にかなっている可能性があります。 –