Travis-CI で使用しているファイルがあります。とrequirements.txt
の両方で要件を重複させるのは無意味に思えるので、の kwargにファイル ハンドルを渡したいと考えていました。requirements.txt
setup.py
install_requires
setuptools.setup
これは可能ですか? もし可能であれば、どうすればいいでしょうか?
これが私のrequirements.txt
ファイルです:
guessit>=0.5.2
tvdb_api>=1.8.2
hachoir-metadata>=1.3.3
hachoir-core>=1.3.3
hachoir-parser>=1.3.4
ベストアンサー1
一見すると、requirements.txt
と はsetup.py
愚かな重複のように見えますが、形式は似ているものの、意図されている機能は非常に異なることを理解することが重要です。
依存関係を指定するときのパッケージ作成者の目標は、「このパッケージをどこにインストールしても、このパッケージが動作するために必要な他のパッケージはこれらである」と示すことです。
対照的に、デプロイメントの作成者 (別の時点では同じ人物である可能性があります) は、「ここに、私たちが収集してテストしたパッケージのリストがあり、これをインストールする必要があります」と言うという点で、異なる仕事をします。
パッケージ作成者は、さまざまなシナリオを想定してパッケージを作成します。なぜなら、パッケージの作成者は、自分の知らない方法でパッケージが使用されるようにパッケージを公開しており、パッケージと一緒にどのパッケージがインストールされるかを知るすべがないからです。良き隣人となり、他のパッケージとの依存関係バージョンの競合を避けるために、パッケージ作成者は、可能な限り幅広い依存関係バージョンを指定する必要があります。これがinstall_requires
insetup.py
が行うことです。
デプロイメントの作成者は、非常に異なる、非常に具体的な目標、つまり、特定のコンピューターにインストールされたアプリケーションまたはサービスの単一のインスタンスを作成するために記述します。デプロイメントを正確に制御し、適切なパッケージがテストおよびデプロイされるようにするには、デプロイメントの作成者は、依存関係と依存関係の依存関係を含め、インストールするすべてのパッケージの正確なバージョンとソースの場所を指定する必要があります。この仕様により、デプロイメントを複数のマシンに繰り返し適用したり、テスト マシンでテストしたりすることができ、デプロイメントの作成者は、毎回同じパッケージがデプロイされることを確信できます。これが の機能ですrequirements.txt
。
どちらもパッケージとバージョンの大きなリストのように見えますが、これら 2 つの機能は非常に異なることがわかります。そして、これを混同して間違えることは間違いなく簡単です。しかし、これについて考える正しい方法は、requirements.txt
さまざまなパッケージ ファイルのすべての要件によって提起された「質問」に対する「回答」であるということですsetup.py
。手動で記述するのではなく、多くの場合、setup.py
必要なパッケージのセット内のすべてのファイルを調べ、すべての要件に適合すると思われるパッケージのセットを見つけ、インストール後にそのパッケージのリストをテキスト ファイルに「フリーズ」するように pip に指示することで生成されます (これが名前pip freeze
の由来です)。
つまり、次のようになります。
setup.py
動作可能な、可能な限り緩い依存関係バージョンを宣言する必要があります。その役割は、特定のパッケージが動作できるものを指定することです。requirements.txt
は、インストール ジョブ全体を定義するデプロイメント マニフェストであり、特定のパッケージに関連付けられていると考えるべきではありません。デプロイメントを機能させるために必要なすべてのパッケージの完全なリストを宣言することがその役割です。- これら 2 つのものは内容も存在理由も大きく異なるため、一方を他方に単純にコピーすることは現実的ではありません。
参考文献:
- install_requires と要件ファイルPython パッケージング ユーザー ガイドより。