¿Es malo tener mi directorio virtualenv dentro de mi repositorio git?
Estoy pensando en poner el virtualenv para una aplicación web de Django que estoy haciendo dentro de mi repositorio git para la aplicación. Parece una manera fácil de mantener la implementación simple y fácil. ¿Hay alguna razón por la que no deberÃa hacer esto?
Soy totalmente nuevo en virtualenv, asà que hay una buena posibilidad de que esta sea una pregunta realmente estúpida.
7 answers
Yo uso pip freeze
para obtener los paquetes que necesito en un requirements.txt
archivo y añadir que a mi repositorio. Traté de pensar en una forma de por qué querrÃas almacenar todo el virtualenv, pero no pude.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-02-10 23:29:47
SolÃa hacer lo mismo hasta que comencé a usar bibliotecas que se compilan de manera diferente dependiendo del entorno, como PyCrypto. Mi PyCrypto mac no funcionarÃa en Cygwin no funcionarÃa en Ubuntu.
Administrar el repositorio se convierte en una pesadilla.
De cualquier manera me resultó más fácil administrar el archivo de requisitos de congelación y a de pip que tenerlo todo en git. También es más limpio, ya que puede evitar el spam de confirmación de miles de archivos a medida que se actualizan esas bibliotecas...
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-07-06 02:52:16
Almacenar el directorio virtualenv dentro de git, como has señalado, te permitirá desplegar toda la aplicación simplemente haciendo un clon de git (además de instalar y configurar Apache/mod_wsgi). Un problema potencialmente significativo con este enfoque es que en Linux la ruta completa se codifica en el activate de venv, django-admin.py, easy_install y scripts pip. Esto significa que su virtualenv no funcionará completamente si desea usar una ruta diferente, tal vez para ejecutar varios hosts virtuales en el mismo servidor. Creo que el sitio web puede funcionar con las rutas incorrectas en esos archivos, pero tendrÃa problemas la próxima vez que intente ejecutar pip.
La solución, ya dada, es almacenar suficiente información en git para que durante el deploy puedas crear el virtualenv y hacer las instalaciones pip necesarias. Normalmente las personas ejecutan pip freeze
para obtener la lista y luego la almacenan en un archivo llamado requirements.txt. Se puede cargar con pip install -r requirements.txt
. RyanBrady ya mostró cómo puede encadenar las instrucciones deploy en una sola lÃnea:
# before 15.1.0
virtualenv --no-site-packages --distribute .env &&\
source .env/bin/activate &&\
pip install -r requirements.txt
# after deprecation of some arguments in 15.1.0
virtualenv .env && source .env/bin/activate && pip install -r requirements.txt
Personalmente, acabo de poner estos en un script de shell que corro después de hacer el clon de git o git pull.
Almacenar el directorio virtualenv también hace que sea un poco más complicado manejar actualizaciones pip, ya que tendrá que agregar/eliminar manualmente y confirmar los archivos resultantes de la actualización. Con requisitos.archivo txt, usted acaba de cambiar las lÃneas apropiadas en los requisitos.txt y volver a ejecutar pip install -r requirements.txt
. Como ya se ha señalado, esto también reduce "cometer spam".
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-09-19 05:11:15
Creo que uno de los principales problemas que se producen es que el virtualenv podrÃa no ser utilizable por otras personas. La razón es que siempre usa rutas absolutas. Asà que si virtualenv estaba por ejemplo en /home/lyle/myenv/
asumirá lo mismo para todas las demás personas que usan este repositorio (debe ser exactamente la misma ruta absoluta). No puedes presumir que las personas usan la misma estructura de directorios que tú.
La mejor práctica es que todo el mundo está estableciendo su propio entorno (ya sea con o sin virtualenv) e instalando bibliotecas allÃ. Eso también hace que el código sea más utilizable en diferentes plataformas (Linux / Windows / Mac), también porque virtualenv se instala diferente en cada una de ellas.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2011-07-06 01:57:54
Si sabe en qué sistemas operativos se ejecutará su aplicación, crearÃa un virtualenv para cada sistema e incluirlo en mi repositorio. Luego harÃa que mi aplicación detectara en qué sistema se está ejecutando y usara el virtualenv correspondiente.
El sistema podrÃa identificarse, por ejemplo, utilizando el módulo platform.
De hecho, esto es lo que hago con una aplicación interna que he escrito, y a la que puedo agregar rápidamente un nuevo sistema virtualenv en caso de que es necesario. De esta manera, no tengo que confiar en que pip podrá descargar con éxito el software que requiere mi aplicación. Tampoco tendré que preocuparme por la compilación de, por ejemplo, psycopg2 que uso.
Si no sabe en qué sistema operativo puede ejecutarse su aplicación, probablemente sea mejor usar pip freeze
como se sugiere en otras respuestas aquÃ.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-11-20 14:09:25
Si acabas de configurar development env, usa pip freeze file, caz que limpia el repositorio de git.
Luego, si está realizando una implementación de producción, verifique toda la carpeta venv. Eso hará que su implementación sea más reproducible, no necesitará esos paquetes libxxx-dev y evitará los problemas de Internet.
Asà que hay dos repositorios. Uno para su código fuente principal, que incluye requisitos.txt. Y un repositorio env, que contiene toda la carpeta venv.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-03-11 04:13:22
Utilizo lo que es básicamente La respuesta de David Sickmiller con un poco más de automatización. Creo un archivo (no ejecutable) en el nivel superior de mi proyecto llamado activate
con el siguiente contenido:
[ -n "$BASH_SOURCE" ] \
|| { echo 1>&2 "source (.) this with Bash."; exit 2; }
(
cd "$(dirname "$BASH_SOURCE")"
[ -d .build/virtualenv ] || {
virtualenv .build/virtualenv
. .build/virtualenv/bin/activate
pip install -r requirements.txt
}
)
. "$(dirname "$BASH_SOURCE")/.build/virtualenv/bin/activate"
(Según la respuesta de David, esto asume que estás haciendo un pip freeze > requirements.txt
para mantener tu lista de requisitos actualizada.)
Esto se puede obtener de cualquier directorio de trabajo actual y se activará correctamente, primero configurando el entorno virtual si es necesario. Mi prueba de nivel superior por lo general, el script tiene código en estas lÃneas para que pueda ejecutarse sin que el desarrollador tenga que activarlo primero:
cd "$(dirname "$0")"
[[ $VIRTUAL_ENV = $(pwd -P) ]] || . activate
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-01-17 06:17:38