複数の環境用にrequirements.txtをカスタマイズする方法は?


111

開発と生産の2つの部門があります。それぞれに依存関係があり、その一部は異なります。開発は、開発中の依存関係を指します。同様に生産。'requirements.txt'と呼ばれる単一のファイルで各ブランチの依存関係を期待するHerokuにデプロイする必要があります。

整理するための最良の方法は何ですか?

私が考えたこと:

  • 各ブランチに1つずつ、個別の要件ファイルを維持します(頻繁なマージに耐える必要があります!)
  • 使用する要件ファイルをHerokuに伝えます(環境変数?)
  • デプロイスクリプトの作成(一時ブランチの作成、要件ファイルの変更、コミット、デプロイ、一時ブランチの削除)

1
簡単な配置スクリプト:2つのファイルを維持します。それらの間のシンボリックリンクを使用します。
Udy

回答:


205

要件ファイルをカスケードし、「-r」フラグを使用して、あるファイルの内容を別のファイル内に含めるようにpipに指示できます。要件を次のようなモジュラーフォルダー階層に分割できます。

`-- django_project_root
|-- requirements
|   |-- common.txt
|   |-- dev.txt
|   `-- prod.txt
`-- requirements.txt

ファイルの内容は次のようになります。

common.txt:

# Contains requirements common to all environments
req1==1.0
req2==1.0
req3==1.0
...

dev.txt:

# Specifies only dev-specific requirements
# But imports the common ones too
-r common.txt
dev_req==1.0
...

prod.txt:

# Same for prod...
-r common.txt
prod_req==1.0
...

Herokuの外では、次のような環境をセットアップできます。

pip install -r requirements/dev.txt

または

pip install -r requirements/prod.txt

Herokuは特にプロジェクトルートで「requirements.txt」を探すため、次のようにprodをミラーリングするだけです。

requirements.txt:

# Mirrors prod
-r requirements/prod.txt

2
herokuの異なる環境で個別の要件ファイルを使用する方法の問題を無視しました。
Ed J

29
私の答えはそれに対処したと思います。
クリスチャンアボット

1
ステージング(追加のデバッグパッケージが必要な場合)と本番環境(これらのデバッグパッケージが不要な場合)のHerokuに異なる要件を設定する方法を探していました。残念ながら、@ EdJが言ったように、この回答はこれに対処していません。
Antoine Pinsard 2016

1
私はあなたの質問を誤解しているかもしれません、またはおそらくあなたの質問は元のポスターとは異なります。ただし、明確にするために、ステージングブランチのrequirements.txtには「-r requirements / staging.txt」(または同様の)を含めることができますが、prodブランチには「-r requirements / prod.txt」を含めることができます(私の回答の終わりを参照)。適切なブランチを対応するHerokuインスタンスに同期します。
クリスチャンアボット

2
@SohamNavadiyaそれは私が尋ねたものではありません。たとえばbase.txt、3つのパッケージとdev.txt、1つのパッケージ(および-r base.txt)が含まれているとします。4つのパッケージすべてが仮想環境にインストールされています。5番目のパッケージをインストールして、devではなくベースにリストしたいのですが、どうすればよいですか?もちろん、インストールできますがpip freeze > base.txt、問題は解決しません。次に、4番目の開発依存関係をベースに配置しますが、これは私が望まないものです。
Manan Mehta

10

元の質問と回答が投稿されたときに存在しなかった実行可能なオプションは、依存関係を管理するためにpipではなくpipenvを使用することです。

pipenvを使用すると、pipのように2つの個別の要件ファイルを手動で管理する必要がなくなり、代わりにpipenvはコマンドラインでの対話を介して開発パッケージと本番パッケージ自体を管理します。

本番と開発の両方で使用するパッケージをインストールするには:

pipenv install <package>

開発環境のみのパッケージをインストールするには:

pipenv install <package> --dev

これらのコマンドを使用して、pipenvは2つのファイル(PipfileとPipfile.lock)に環境構成を格納および管理します。Herokuの現在のPythonビルドパックはpipenvをネイティブでサポートし、requirements.txtの代わりにPipfile.lockが存在する場合はそれから構成します。

ツールの完全なドキュメントについては、pipenvリンクを参照してください。


4
pipenvは時間の無駄です。ロックに時間がかかりすぎます。
nurettin

9
pipenvはほぼすべての面で壊れています。それは多くのことを約束しますが、非常に少数を出荷します
オスパイダー

4
@ospider毎日ベースでpipenvを使用していて、あなたとnurettinが報告しているような負の問題は発生していません。pipenvバージョン2018.10.13での作業。したがって、すべての点で壊れているのは非常に空のステートメントです。
Kwuite

1
@Kwuite私はあなたの最後の文の感情を共有します。コメントが批判的でありながら空虚である場合に取り組む対話はほとんどありません。
クリスチャンアボット

3
nurettinとospiderに同意します。pipenvはひどいです。
Andrew Palmer

3

要件が同じマシン上の環境間で切り替えることができる場合は、切り替える必要がある環境ごとに異なるvirtualenvフォルダーを作成する必要がある場合があります。

python3 -m venv venv_dev
source venv_dev/bin/activate
pip install -r pip/common.txt
pip install -r pip/dev.txt
exit
python3 -m venv venv_prod
source venv_prod/bin/activate
pip install -r pip/common.txt
exit
source venv_dev/bin/activate
# now we are in dev environment so your code editor and build systems will work.

# let's install a new dev package:
# pip install awesome
# pip freeze -r pip/temp.txt
# find that package, put it into pip/dev.txt
# rm pip/temp.txt

# pretty cumbersome, but it works. 
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.