Неплохо ли иметь каталог virtualenv внутри моего репозитория git?

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

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

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

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

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

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

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

Решение, уже заданное, состоит в том, чтобы хранить достаточную информацию в git, чтобы во время развертывания вы могли создавать виртуальные виртуальные машины и выполнять необходимые установки пачки. Как правило, люди 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 

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

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

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

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

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

Например, система может быть идентифицирована с использованием модуля платформы .

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

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

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

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

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