Un flujo clásico de manejo de paquetes y de entorno de desarrollo virtual en
Python, es la utilización de pip
en combinación con virtualenv
, para
manejar paquetes y administrar entornos de desarrollo virtuales
respectivamente, para tener la ventaja de replicar el proyecto en otro sistema,
o de desarrollar distintos proyectos sin conflictos de librerías.
Un ejemplo de flujo de trabajo de estas herramientas seria:
virtualenv -p python3 entorno-virtual
source entorno-virtual/bin/activate
pip install django==1.11
pip freeze > requirements.txt
En el primer comando crea un entorno de desarrollo con una versión por defecto
de python3 y le damos un nombre al entorno: "entorno-virtual", seguimos con el
siguiente comando para activar el entorno virtual, y estar aislado del sistema,
procedemos a instalar django específicamente la versión 1.11. Una vez que
termina dicha instalación procedemos a plasmar el nuevo paquete en el archivo
requirements.txt
.
Django==1.11
pytz==2018.3 # dependencia de instalación automática de django.
Es un proceso simple, pero se puede volver algo tedioso de mantener
manualmente, el archivo requirements.txt
no se actualiza solo, teniendo que
ejecutar pip freeze > requirements.txt
cada vez que instalamos una biblioteca
nueva y no especifica la versión especifica de Python que se utiliza.
En distintos estados de desarrollos o fases, pueden que utilicemos bibliotecas
que no sean necesarias en un sistema de producción pero si en un sistema
desarrollo. Por ejemplo, necesitamos instalar el paquete pytest
, para hacer
test de desarrollo de una aplicación que desarrollada con django, obviamente no
necesitamos dicha biblioteca en nuestro servidor de producción.
Lo más simple que se hace es tener de dos a tres archivos con los requerimientos específicos y llevar la administración de estos archivos de manera manual.
Ejemplo básico: producción.txt
:
Django==1.11
pytz==2018.3
y desarrollo.txt
:
pluggy==0.6.0
py==1.5.2
pytest==3.4.1
six==1.11.0
El ejemplo anterior no es un estándar, los desarrolladores de Python administran sus listas de paquetes como más les guste o le parezca correcto.
Un tema que no es menor, en ningún lado queda documentado que versión de Python es la que se debe de usar para replicar el proyecto, esto igual queda en manos del desarrollador.
En resumen de esta tediosa historia, es que hay que tener una filosofía de administración de dependencias, hay que documentar en alguna parte que con que versión funciona el proyecto. Las dependencias de las librerías pueden romperse por alguna incompatibilidad difícil de encontrar entre la librería principal y versiones de Python, haciendo un poco más difícil la administración y replicación del proyecto, sin mencionar la carga de "variables de entorno (.env)" se deben de hacer manual.
Pipenv: Python Development Workflow for Humans
Pipenv es la herramienta, que administra este flujo de trabajo de manera
eficaz, utilizando pip como administrador de paquetes, virtualenv como creador
de entorno virtual y pyenv como administrador de versiones de python. Generando
automáticamente dos archivos, Pipfile
y Pipfile.lock
, encargados de
documentar automáticamente el entorno de desarrollo.
La instalación de pipenv
la podemos de realizar con pip
, la única
dependencia que no se cumple es pyenv
que tendrán que realizar una
instalación manual. (pipenv no es compatible con Windows.)
pip3 install pipenv
Veamos como seria un flujo de trabajo con pipenv
.
Primero creamos un directorio en donde estará el código del proyecto e ingresamos:
mkdir website
cd website
luego procedemos a ejecutar:
pipenv install django
Con el comando anterior se crean los archivos automáticamente de Pipfile
y Pipfile.lock
, un entorno virtual y obviamente se instala el paquete Django.
Veamos el archivo Pipfile
:
[[source]]
url = "https://pypi.python.org/simple"
verify_ssl = true
name = "pypi"
[packages]
django = "*"
[dev-packages]
[requires]
python_version = "3.6"
En resumen, la sección de "source" contiene la información del repositorio de los paquetes, "packages" contiene los nombre de los paquetes instalado, "dev-packages" contiene los nombres de los paquetes necesarios en desarrollo, y por ultimo “requires” la versión de Python a usar.
Para instalar y agregar un paquete en dev-packages.
pipenv install --dev pytest
En Pipfile.lock
, contiene la información detallada sobre la biblioteca,
dependencias de la mismas, y versión de Python usada.
Para inicializar y salir del entorno de desarrollo:
# activara el entorno
pipenv shell
# saldrá del entorno de la manera correcta.
exit
Para desinstalar paquetes, borrara el paquete del entorno y lo eliminara de
Pipfile
.
pipenv uninstall django
Para replicar el entorno virtual en otra máquina basta con ingresar al directorio y ejecutar pipenv install ejmplo:
cd website
# Instalacion de los paquetes del proyecto en producción,
# sin los de desarrollo
pipenv install
# Instalación de paquetes de desarrollo
pipenv install --dev
Al encontrar los archivos Pipfile
y Pipfile.lock
replicará los paquetes
instalados, y creara un ambiente virtual y en el caso se usar una versión en
especifico de python la instalara automáticamente con pyenv(debe de estar
instalado).
El flujo de trabajo se automatiza, y se especifican los requerimientos necesarios para llevar a cabo una buena replicación del entorno virtual en otros sistemas.
pipenv
tiene muchas mas características, como la carga automática del archivo
.env
, y pipenv check
que verifica que se cumplan los requisitos del PEP
508, etc.
Puedes leer más en la Documentación oficial.