162 votes

Comment personnaliser un requirements.txt pour des environnements multiples ?

J'ai deux branches, le développement et la production. Chacune a des dépendances, dont certaines sont différentes. La branche Développement pointe vers des dépendances qui sont elles-mêmes en cours de développement. De même pour la production. Je dois effectuer un déploiement sur Heroku, qui attend les dépendances de chaque branche dans un fichier unique appelé "requirements.txt".

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

Ce à quoi j'ai pensé :

  • Maintenir des fichiers d'exigences séparés, un dans chaque branche (doit survivre aux fusions fréquentes !)
  • Indiquer à Heroku quel fichier d'exigences je veux utiliser (variable d'environnement ?)
  • Ecrire deploy scripts (créer une branche temporaire, modifier le fichier d'exigences, commiter, déployer, supprimer la branche temporaire)

311voto

Christian Abbott Points 4964

Vous pouvez cascader vos fichiers d'exigences et utiliser le drapeau "-r" pour indiquer à pip d'inclure le contenu d'un fichier dans un autre. Vous pouvez répartir vos exigences dans une hiérarchie de dossiers modulaires comme ceci :

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

Le contenu des fichiers ressemblerait à ceci :

commun.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 maintenant configurer des environnements comme celui-ci :

pip install -r requirements/dev.txt

o

pip install -r requirements/prod.txt

Puisque Heroku cherche spécifiquement "requirements.txt" à la racine du projet, il devrait juste refléter prod, comme ceci :

exigences.txt :

# Mirrors prod
-r requirements/prod.txt

20voto

Christian Abbott Points 4964

Une option viable aujourd'hui, qui n'existait pas lorsque la question et la réponse originales ont été postées, est d'utiliser pipenv au lieu de pip pour gérer les dépendances.

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

Pour installer un paquet à utiliser à la fois en production et en développement :

pipenv install <package>

Pour installer un paquet 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). Le buildpack Python actuel de Heroku 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.

5voto

nurettin Points 4083

Si votre exigence est de pouvoir passer d'un environnement à l'autre 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 passer.

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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X