web-dev-qa-db-ja.com

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

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

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

私が考えたこと:

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

要件ファイルをカスケードし、「-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
154

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

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

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

pipenv install <package>

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

pipenv install <package> --dev

これらのコマンドを介して、pipenvは環境設定を2つのファイル(PipfileおよびPipfile.lock)に保存および管理します。 Herokuの現在のPython buildpackはネイティブでpipenvをサポートし、requirements.txtの代わりにPipfile.lockが存在する場合はそれ自体を構成します。

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

4

同じマシン上の環境を切り替えることができるようにする必要がある場合は、切り替える必要のある環境ごとに異なる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. 
1
nurettin