我在考虑把virtualenv的Django web应用程序,我正在我的应用程序的git存储库。这似乎是一个简单的方法来保持部署的简单和容易。有什么理由不让我这么做吗?
当前回答
在回购中包含任何依赖于环境的组件或设置并不是一个好主意,因为使用回购的关键方面之一可能是与其他开发人员共享它。下面是我如何在Windows PC(比如Win10)上设置我的开发环境。
Open Pycharm and on the first page, choose to check out the project from your Source Control System (in my case, I am using github) In Pycharm, navigate to settings and choose "Project Interpreter" and choose the option to add a new virtual environment , you can call it "venv". Choose the base python interpreter which is located at C:\Users{user}\AppData\Local\Programs\Python\Python36 (make sure you choose the appropriate version of Python based on what you have installed) Note that Pycharm will create the new virtual environment and copy python binaries and required libraries under your venv folder inside your project folder. Let Pycharm complete its scanning as it needs to rebuild/refresh your project skeleton exclude venv folder from your git interactions (add venv\ to .gitignore file in your project folder)
好处:如果你想让人们很容易(好吧,几乎很容易)安装你的软件所需的所有库,你可以使用
pip freeze > requirements.txt
并将该指令放在git中,以便人们可以使用以下命令一次性下载所有所需的库。
pip install -r requirements.txt
其他回答
我用的基本上是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 (quiet)选项,在python3不可用时使用python,等等。
然后,它可以从任何当前工作目录中获取,并将正确激活,如果需要,首先设置虚拟环境。我的顶级测试脚本通常有这样的代码,所以它可以在不需要开发人员激活的情况下运行:
cd "$(dirname "$0")"
[[ $VIRTUAL_ENV = $(pwd -P) ]] || . ./activate
源。/activate,而不是activate,在这里很重要,因为后者会在找到当前目录中的activate之前找到您路径中的任何其他activate。
我认为最好的是将虚拟环境安装在存储库文件夹中的路径中,也许更好的是使用专用于环境的子目录(我在强制在存储库根文件夹中安装虚拟环境时意外删除了我的整个项目,很好,我将项目保存在Github的最新版本中)。
无论是自动安装程序还是文档都应该将virtualenv路径指示为相对路径,这样在与其他人共享项目时就不会遇到问题。关于包,使用的包保存在pip freeze -r requirements.txt中。
我以前也这样做,直到我开始使用根据环境不同而编译的库,比如PyCrypto。我的PyCrypto mac无法在Cygwin上运行,也无法在Ubuntu上运行。
管理存储库完全是一场噩梦。
不管怎样,我发现管理pip冻结&一个需求文件都比在git中更容易。它也更干净,因为你可以避免在这些库更新时提交数千个文件的垃圾邮件……
Storing the virtualenv directory inside git will, as you noted, allow you to deploy the whole app by just doing a git clone (plus installing and configuring Apache/mod_wsgi). One potentially significant issue with this approach is that on Linux the full path gets hard-coded in the venv's activate, django-admin.py, easy_install, and pip scripts. This means your virtualenv won't entirely work if you want to use a different path, perhaps to run multiple virtual hosts on the same server. I think the website may actually work with the paths wrong in those files, but you would have problems the next time you tried to run 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克隆或git拉之后运行的shell脚本中。
存储virtualenv目录还使处理pip升级变得有点棘手,因为您必须手动添加/删除和提交升级产生的文件。对于requirements.txt文件,只需更改requirements.txt中的适当行,然后重新运行pip install -r requirements.txt。如前所述,这也减少了“提交垃圾邮件”。
我使用pip freeze将我需要的包添加到requirements.txt文件中,并将其添加到我的存储库中。我试图想出一种方法来解释为什么要存储整个virtualenv,但我找不到。
推荐文章
- 如何删除Python中的前导空白?
- python中的assertEquals和assertEqual
- 如何保持Python打印不添加换行符或空格?
- 为什么Python的无穷散列中有π的数字?
- Python 3.7数据类中的类继承
- 如何在PyTorch中初始化权重?
- 计数唯一的值在一列熊猫数据框架像在Qlik?
- 使用Pandas将列转换为行
- 从matplotlib中的颜色映射中获取单个颜色
- 将Pandas或Numpy Nan替换为None以用于MysqlDB
- 使用pandas对同一列进行多个聚合
- 使用Python解析HTML
- django MultiValueDictKeyError错误,我如何处理它
- 如何在for循环期间修改列表条目?
- 我如何在Django中创建一个鼻涕虫?