web-dev-qa-db-fra.com

Comment personnaliser un requirements.txt pour plusieurs environnements?

J'ai deux branches, Développement et Production. Chacun a des dépendances, dont certaines sont différentes. Le développement pointe vers des dépendances qui sont elles-mêmes en développement. De même pour la production. Je dois déployer sur Heroku qui attend les dépendances de chaque branche dans un seul fichier appelé 'requirements.txt'.

Quelle est la meilleure façon de s'organiser?

Ce à quoi j'ai pensé:

  • Maintenir des fichiers d'exigences distincts, un dans chaque branche (doit survivre aux fusions fréquentes!)
  • Dites à Heroku quel fichier d'exigences je veux utiliser (variable d'environnement?)
  • Écrire des scripts de déploiement (créer une branche temporaire, modifier le fichier d'exigences, valider, déployer, supprimer la branche temporaire)
84
Charles R

Vous pouvez mettre en cascade vos fichiers d'exigences et utiliser l'indicateur "-r" pour indiquer à pip d'inclure le contenu d'un fichier dans un autre. Vous pouvez répartir vos besoins en une hiérarchie de dossiers modulaire comme celle-ci:

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

Le contenu des fichiers ressemblerait à ceci:

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
...

En dehors de Heroku, vous pouvez désormais configurer des environnements comme celui-ci:

pip install -r requirements/dev.txt

ou

pip install -r requirements/prod.txt

Étant donné que Heroku recherche spécifiquement "requirements.txt" à la racine du projet, il devrait simplement refléter la prod, comme ceci:

requirements.txt:

# Mirrors prod
-r requirements/prod.txt
154
Christian Abbott

Une option viable aujourd'hui qui n'existait pas lorsque la question et la réponse d'origine a été publiée est d'utiliser pipenv au lieu de pip pour gérer les dépendances.

Avec pipenv, la gestion manuelle de deux fichiers d'exigences distincts comme avec pip n'est plus nécessaire, et à la place, pipenv gère lui-même les packages de développement et de production via des interactions sur la ligne de commande.

Pour installer un package à utiliser en production et en développement:

pipenv install <package>

Pour installer un package pour l'environnement de développement uniquement:

pipenv install <package> --dev

Via ces commandes, pipenv stocke et gère la configuration de l'environnement dans deux fichiers (Pipfile et Pipfile.lock). La version actuelle de Heroku Python buildpack supporte nativement pipenv et se configurera à partir de Pipfile.lock s'il existe au lieu de requirements.txt.

Voir le lien pipenv pour une documentation complète de l'outil.

4
Christian Abbott

Si vous souhaitez pouvoir basculer entre les environnements sur la même machine, il peut être nécessaire de créer des dossiers virtualenv différents pour chaque environnement vers lequel vous devez basculer.

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