Разве плохо иметь мой каталог virtualenv в моем git-репозитории?

137

Я подумываю о том, чтобы поместить virtualenv для веб-приложения Django, которое я создаю в моем репозитории для www. Кажется, что это простой способ сохранить простоту и простоту развертывания. Есть ли причина, почему я не должен этого делать?

Я совершенно не знаком с virtualenv, поэтому есть хороший шанс, это действительно глупый вопрос.

Теги:
virtualenv

6 ответов

154
Лучший ответ

Я использую pip freeze, чтобы получить нужные мне пакеты в requirements.txt и добавьте это в мой репозиторий. Я пытался подумать о том, почему вы хотите сохранить весь virtualenv, но я не мог.

  • 0
    Отличное предложение! Я понимаю, что я могу использовать файл require.txt для отслеживания пакетов. Однако причина, по которой я хотел бы сохранить virtualenv в репозитории, заключается в том, чтобы упростить развертывание новых серверов. Если virtualenv содержится внутри приложения, мне не нужно создавать новый virtualenv в новых экземплярах, которые я поднимаю, все, что мне нужно сделать, это извлечь код. Я знаю, что мог бы использовать что-то вроде ткани, чтобы настроить env для меня, но это просто кажется ненужным шагом, если я могу просто сохранить env в своем репо.
  • 65
    Вы можете сохранить ненужное место в репозитории и по-прежнему развертывать его на новом сервере с помощью одной команды: virtualenv --no-site-packages --distribute .env && source .env / bin / activ && pip install -r needs.txt
Показать ещё 8 комментариев
32

Я делал то же самое, пока не начал использовать библиотеки, которые скомпилированы по-разному в зависимости от среды, такой как PyCrypto. Мой PyCrypto mac не будет работать на Cygwin, не будет работать на Ubuntu.

Это становится полным кошмаром для управления репозиторием.

В любом случае мне было проще управлять замораживанием и файлом требований, чем все это в git. Это более чистое, так как вы можете избежать коммит-спама для тысяч файлов, поскольку эти библиотеки обновляются...

  • 0
    Хм. У меня точно не будет проблем с тем, что вещи компилируются по-разному в разных средах. Я думаю, что, вероятно, не стоит этого делать, просто чтобы избежать спама.
  • 0
    @LylePratt: Я думаю, что наоборот: лучше не включать в репозиторий весь virtualenv, чтобы избежать проблем с такими замечательными инструментами, как PyCrypto или PIL.
24

Сохранение каталога virtualenv внутри git, как вы отметили, позволит вам развернуть все приложение, просто сделав клон git (плюс установку и настройку Apache/mod_wsgi). Одной из потенциально значимых проблем с этим подходом является то, что в Linux полный путь становится жестко закодированным в активах venv, django-admin.py, easy_install и pip. Это означает, что ваш virtualenv не будет полностью работать, если вы хотите использовать другой путь, возможно, для запуска нескольких виртуальных хостов на одном сервере. Я думаю, что веб-сайт может работать с неправильными путями в этих файлах, но у вас возникнут проблемы при следующем запуске pip.

Решение, уже заданное, состоит в том, чтобы хранить достаточную информацию в git, чтобы во время развертывания вы могли создать virtualenv и выполнить необходимые установки pip. Обычно люди запускают pip freeze, чтобы получить список, затем сохраните его в файле с именем requirements.txt. Его можно загрузить с помощью pip install -r requirements.txt. RyanBrady уже показал, как вы можете вставлять операторы развертывания в одну строку:

virtualenv --no-site-packages --distribute .env && source .env/bin/activate && pip install -r requirements.txt

Лично я просто помещаю их в оболочку script, которую я запускаю после выполнения git clone или git pull.

Сохранение каталога virtualenv также делает несколько сложнее обрабатывать обновления апгрейдов, так как вам придется вручную добавлять/удалять и фиксировать файлы, связанные с обновлением. В файле requirements.txt вы просто изменяете соответствующие строки в файле требований .txt и повторно запускаете pip install -r requirements.txt. Как уже отмечалось, это также уменьшает "фиксацию спама".

  • 3
    Обратите внимание, что --distribute устарела (по крайней мере, в 15.1.0): --distribute DEPRECATED. Retained only for backward compatibility. This option has no effect.
  • 1
    --no-site-packages устарела и в 15.1.0, так как теперь это значение по умолчанию.
8

Я думаю, что одна из основных проблем, которые возникают, заключается в том, что virtualenv может не использоваться другими людьми. Причина в том, что он всегда использует абсолютный путь. Так что если вы virtualenv были, например, в /home/lyle/myenv/, он будет считать то же самое для всех других людей, использующих этот репозиторий (он должен быть точно таким же абсолютным путем). Вы не можете предполагать, что люди используют ту же структуру каталогов, что и вы.

Лучшая практика заключается в том, что каждый настраивает свою собственную среду (будь то с виртуальным или без нее) и устанавливает там библиотеки. Это также делает код более удобным для использования на разных платформах (Linux/Windows/Mac), также потому, что virtualenv установлен в каждом из них по-разному.

  • 0
    Правильно понять, почему плохая идея сохранять виртуальность в SCM, но стоит рассмотреть что-то вроде предложения @ RJBrady или сценарий bootstrap.py , поскольку наличие некоторых средств для воссоздания одной и той же среды на компьютерах является серьезная необходимость при работе с другими людьми.
  • 0
    Я не совсем уверен, что проблема, которую вы упомянули, будет проблемой именно в моей ситуации. Мое приложение Django содержит файл .wsgi, который определяет, где virtualenv относительно его местоположения (на 2 директории вверх '../../env'). Таким образом, в моем сценарии проблема абсолютного пути не должна негативно влиять на меня ... верно?
Показать ещё 1 комментарий
2

Если вы знаете, в каких операционных системах будет работать ваше приложение, я бы создал один virtualenv для каждой системы и включил его в свой репозиторий. Затем я сделаю свое приложение, чтобы определить, в какой системе он работает, и использовать соответствующий virtualenv.

Система может, например, с помощью модуля platform.

Фактически, это то, что я делаю с внутренним приложением, которое я написал, и к которому я могу быстро добавить новую систему virtualenv в случае необходимости. Таким образом, я не должен полагаться на то, что pip сможет успешно загрузить программное обеспечение, которое требуется моему приложению. Мне также не придется беспокоиться о компиляции, например. psycopg2, который я использую.

Если вы не знаете, в какой операционной системе может работать ваше приложение, вам, вероятно, лучше использовать pip freeze, как предлагается в других ответах здесь.

0

Если вы просто настраиваете разработку env, тогда используйте файл замораживания pip, caz, который очищает репозиторий git.

Затем, если вы делаете развертывание производства, проверьте всю папку venv. Это сделает ваше развертывание более воспроизводимым, а не нуждается в этих пакетах libxxx-dev и избежать проблем с Интернетом.

Итак, есть два репозитория. Один для вашего основного исходного кода, который включает в себя файл требований .txt. И env repo, в котором содержится вся папка venv.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню