我在考虑把virtualenv的Django web应用程序,我正在我的应用程序的git存储库。这似乎是一个简单的方法来保持部署的简单和容易。有什么理由不让我这么做吗?
当前回答
我认为出现的主要问题之一是virtualenv可能无法被其他人使用。原因是它总是使用绝对路径。因此,如果您的virtualenv是在/home/lyle/myenv/,它将假设所有其他使用此存储库的人都是相同的(它必须是完全相同的绝对路径)。您不能假定人们使用与您相同的目录结构。
更好的做法是每个人都建立自己的环境(无论是否使用virtualenv)并在那里安装库。这也使您的代码在不同的平台(Linux/Windows/Mac)上更可用,还因为virtualenv安装在每个平台上都不同。
其他回答
我以前也这样做,直到我开始使用根据环境不同而编译的库,比如PyCrypto。我的PyCrypto mac无法在Cygwin上运行,也无法在Ubuntu上运行。
管理存储库完全是一场噩梦。
不管怎样,我发现管理pip冻结&一个需求文件都比在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。
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冻结文件,caz,使git回购干净。
然后如果进行生产部署,则签入整个venv文件夹。这将使您的部署更具可重复性,不需要那些libxxx-dev包,并避免互联网问题。
所以有两个回购。一个用于您的主要源代码,其中包括一个requirements.txt。和一个env repo,其中包含整个venv文件夹。
推荐文章
- 如何删除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中创建一个鼻涕虫?