我正在考虑将virtualenv用于我在git存储库中创建的Django Web应用程序中。这似乎是使部署变得如此简单的一种简单方法。我为什么不应该这样做?
我正在考虑将virtualenv用于我在git存储库中创建的Django Web应用程序中。这似乎是使部署变得如此简单的一种简单方法。我为什么不应该这样做?
Answers:
我通常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已经展示了如何在一行中将deploy语句字符串化:
# 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上运行。
管理存储库已成为一场噩梦。
无论哪种方式,我都发现管理点子冻结和需求文件比将其全部保存在git中更容易。它也更加干净,因为随着这些库的更新,您可以避免提交数千个文件的垃圾邮件...
我认为出现的主要问题之一是virtualenv可能无法被其他人使用。原因是它始终使用绝对路径。因此,例如,如果您使用virtualenv,/home/lyle/myenv/
它将对使用此存储库的所有其他用户都假设相同(其绝对路径必须完全相同)。您不能假定人们使用与您相同的目录结构。
更好的做法是每个人都在建立自己的环境(无论是否带有virtualenv)并在其中安装库。这也使您的代码在不同平台(Linux / Windows / Mac)上的可用性更高,这也是因为在每个平台上都不同地安装了virtualenv。
manage.py
),则肯定会遇到问题。
我使用的基本上是David Sickmiller的答案,并且自动化程度更高。我在项目的顶层创建一个(不可执行的)文件,其名称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
以使您的需求列表保持最新。)
以上给出了总体思路;实际的激活脚本(文档),我通常使用是有点更复杂,提供了-q
(安静)选项,使用python
时python3
不可用等。
然后,可以从任何当前工作目录中获取该资源并将其正确激活,必要时首先设置虚拟环境。我的顶级测试脚本通常包含以下几行代码,因此无需开发人员先激活即可运行它:
cd "$(dirname "$0")"
[[ $VIRTUAL_ENV = $(pwd -P) ]] || . ./activate
这里的Sourcing ./activate
(而不是activate
)很重要,因为后者会activate
在您的路径中找到其他任何路径,然后再在当前目录中找到其他路径。
[[ $_ != $0 ]] || { echo 1>&2 "source (.) this script with Bash."; exit 2; }
检测脚本是否正在执行,而不是在执行脚本
在回购协议中包含任何与环境相关的组件或设置作为使用回购协议的关键方面之一不是一个好主意,也许是与其他开发人员共享它。这是在Windows PC(例如Win10)上设置开发环境的方式。
打开Pycharm,然后在第一页上,选择从您的源代码管理系统中检出项目(在我的情况下,我正在使用github)
在Pycharm中,导航至设置,然后选择“项目解释器”,然后选择添加新虚拟环境的选项,您可以将其称为“ venv”。
选择位于C:\ Users {user} \ AppData \ Local \ Programs \ Python \ Python36的基本python解释器(请确保根据安装的内容选择适当的Python版本)
请注意,Pycharm将创建新的虚拟环境,并在项目文件夹内的venv文件夹下复制python二进制文件和所需的库。
让Pycharm完成其扫描,因为它需要重建/刷新项目框架
从git交互中排除venv文件夹(将venv \添加到项目文件夹中的.gitignore文件)
奖励:如果您希望人们轻松(很好,几乎很容易)安装软件所需的所有库,则可以使用
pip freeze > requirements.txt
并将说明放在git上,以便人们可以使用以下命令立即下载所有必需的库。
pip install -r requirements.txt
我认为最好的办法是在存储库文件夹内的路径中安装虚拟环境,最好使用专用于该环境的子目录(当我在存储库根目录中强制安装虚拟环境时,我意外删除了我的整个项目)文件夹,好是我已将项目保存在最新版本的Github中)。
自动安装程序或文档都应将virtualenv路径指示为相对路径,这样,与他人共享项目时,您就不会遇到问题。关于软件包,使用的软件包应通过保存pip freeze -r requirements.txt
。