【发布时间】:2011-09-29 06:15:17
【问题描述】:
我正在考虑将我正在制作的 Django Web 应用程序的 virtualenv 放入该应用程序的 git 存储库中。这似乎是一种保持部署简单易行的简单方法。我有什么理由不应该这样做吗?
【问题讨论】:
标签: python django virtualenv
我正在考虑将我正在制作的 Django Web 应用程序的 virtualenv 放入该应用程序的 git 存储库中。这似乎是一种保持部署简单易行的简单方法。我有什么理由不应该这样做吗?
【问题讨论】:
标签: python django virtualenv
我使用pip freeze 将我需要的包放入requirements.txt 文件并将其添加到我的存储库中。我试图想出一种方法来解释为什么要存储整个 virtualenv,但我不能。
【讨论】:
pip install mysql-python,在 64 位机器上,然后有人用 32 位机器尝试使用它,它将无法工作。与许多 Python 模块一样,它使用 C 模块来提高性能。我想 Windows->Linux 也不行。
pip freeze 来做这件事了。问题是在您的强制升级重新部署期间,没有人为此付费,对于中间升级(“最佳实践”维护)也没有人付费。
--distribute 和--setuptools 选项现在是无操作的。 (分发,这是 setuptools 的一个分支,很久以前就合并了)。 --no-site-packages 已弃用,现在是默认行为
如您所述,将 virtualenv 目录存储在 git 中将允许您通过执行 git clone(以及安装和配置 Apache/mod_wsgi)来部署整个应用程序。这种方法的一个潜在重要问题是,在 Linux 上,完整路径被硬编码在 venv 的 activate、django-admin.py、easy_install 和 pip 脚本中。这意味着如果您想使用不同的路径,您的 virtualenv 将无法完全工作,也许是在同一台服务器上运行多个虚拟主机。我认为该网站实际上可能会使用这些文件中的错误路径,但下次尝试运行 pip 时会遇到问题。
已经给出的解决方案是在 git 中存储足够的信息,以便在部署期间您可以创建 virtualenv 并进行必要的 pip 安装。通常人们会运行pip freeze 来获取列表,然后将其存储在名为 requirements.txt 的文件中。它可以加载pip install -r requirements.txt。 RyanBrady 已经展示了如何将部署语句串在一行中:
# 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
就我个人而言,我只是将它们放在我执行 git clone 或 git pull 后运行的 shell 脚本中。
存储 virtualenv 目录也使得处理 pip 升级有点棘手,因为您必须手动添加/删除和提交升级产生的文件。使用 requirements.txt 文件,您只需更改 requirements.txt 中的相应行并重新运行pip install -r requirements.txt。如前所述,这也减少了“提交垃圾邮件”。
【讨论】:
--distribute DEPRECATED. Retained only for backward compatibility. This option has no effect.
--no-site-packages 在 15.1.0 中也已弃用,因为现在这是默认设置。
在我开始使用根据环境编译不同的库(例如 PyCrypto)之前,我曾经这样做过。我的 PyCrypto mac 无法在 Cygwin 上运行,无法在 Ubuntu 上运行。
管理存储库简直就是一场噩梦。
无论哪种方式,我发现管理 pip freeze 和需求文件比将它们全部放在 git 中更容易。它也更干净,因为随着这些库的更新,您可以避免数千个文件的提交垃圾邮件......
【讨论】:
我认为发生的主要问题之一是 virtualenv 可能无法被其他人使用。原因是它总是使用绝对路径。因此,如果您的 virtualenv 例如在 /home/lyle/myenv/ 中,它将假设所有其他使用此存储库的人都相同(它必须是完全相同的绝对路径)。您不能假设人们使用与您相同的目录结构。
更好的做法是每个人都设置自己的环境(无论是否使用 virtualenv)并在那里安装库。这也使您的代码在不同平台(Linux/Windows/Mac)上更可用,也因为 virtualenv 在每个平台上的安装不同。
【讨论】:
manage.py)你肯定会遇到问题。
在您的存储库中包含任何依赖于环境的组件或设置作为使用存储库的关键方面之一并不是一个好主意,也许是与其他开发人员共享它。以下是我在 Windows PC(比如 Win10)上设置开发环境的方法。
打开 Pycharm 并在第一页上,选择从源代码控制系统中签出项目(在我的情况下,我使用的是 github)
在 Pycharm 中,导航到设置并选择“项目解释器”并选择添加新虚拟环境的选项,您可以将其称为“venv”。
选择位于 C:\Users{user}\AppData\Local\Programs\Python\Python36 的基本 Python 解释器(确保根据您安装的内容选择合适的 Python 版本)
请注意,Pycharm 将创建新的虚拟环境并将 python 二进制文件和所需的库复制到项目文件夹中的 venv 文件夹下。
让 Pycharm 完成扫描,因为它需要重建/刷新您的项目骨架
从您的 git 交互中排除 venv 文件夹(将 venv\ 添加到项目文件夹中的 .gitignore 文件中)
奖励:如果您希望人们轻松(嗯,几乎很容易)安装您的软件所需的所有库,您可以使用
pip freeze > requirements.txt
并将说明放在您的 git 上,以便人们可以使用以下命令一次下载所有必需的库。
pip install -r requirements.txt
【讨论】:
我使用基本上是David Sickmiller's answer 的东西,自动化程度更高。我在名为activate 的项目的顶层创建了一个(不可执行的)文件,其内容如下:
[ -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"
(根据 David 的回答,这假设您正在执行 pip freeze > requirements.txt 以保持您的需求列表是最新的。)
上面给出了大致的思路;我通常使用的实际activate 脚本(documentation)要复杂一些,提供-q(安静)选项,在python3 不可用时使用python,等等。
然后可以从任何当前工作目录获取它,并将正确激活,如果需要,首先设置虚拟环境。我的顶级测试脚本通常包含以下代码,因此无需开发人员先激活即可运行它:
cd "$(dirname "$0")"
[[ $VIRTUAL_ENV = $(pwd -P) ]] || . ./activate
采购./activate,而不是activate,在这里很重要,因为后者会先在您的路径中找到任何其他activate,然后才能在当前目录中找到。
【讨论】:
[[ $_ != $0 ]] || { echo 1>&2 "source (.) this script with Bash."; exit 2; } 以检测脚本是否正在执行而不是 sourced
我认为最好将虚拟环境安装在存储库文件夹内的路径中,使用专用于环境的子目录可能更好(我在强制安装虚拟环境时意外删除了整个项目)存储库根文件夹,很高兴我将项目保存在 Github 中的最新版本中)。
自动安装程序或文档应将 virtualenv 路径指示为相对路径,这样您在与其他人共享项目时就不会遇到问题。关于包,使用的包请保存到pip freeze -r requirements.txt。
【讨论】:
如果你只是设置开发环境,那么使用 pip freeze 文件,caz 使 git repo 干净。
如果进行生产部署,则检查整个 venv 文件夹。这将使您的部署更具可重复性,不需要那些 libxxx-dev 包,并避免互联网问题。
所以有两个回购。一个用于您的主要源代码,其中包括一个 requirements.txt。还有一个 env 存储库,其中包含整个 venv 文件夹。
【讨论】: