Python pipenv:部署工作流
我正在考虑从pip&virtualenv切换到pipenv。但是在研究了文档之后,我仍然不知道pipenv的创建者是如何构建部署工作流的 例如,在开发中,我有一个定义环境的Python pipenv:部署工作流,python,pipenv,Python,Pipenv,我正在考虑从pip&virtualenv切换到pipenv。但是在研究了文档之后,我仍然不知道pipenv的创建者是如何构建部署工作流的 例如,在开发中,我有一个定义环境的Pipfile&一个Pipfile.lock。使用要部署的部署脚本 git通过Github拉入生产服务器 pipenv install在部署用户的主目录中创建/刷新环境 但是我需要一个特定目录中的venv,该目录已在systemd或supervisor中配置。例如:command=/home/ubuntu/production
Pipfile
&一个Pipfile.lock
。使用要部署的部署脚本
git通过Github拉入生产服务器
pipenv install
在部署用户的主目录中创建/刷新环境command=/home/ubuntu/production/application\u xy/env/bin/gunicorn模块:app
pipenv在某些位置创建环境,例如
/home/ultimo/.local/share/virtualenvs/application\u xy-jvrv1OSi
使用
pipenv
部署应用程序的预期工作流程是什么?您几乎没有选择
pipenv run
运行gunicorn:
pipenv运行gunicorn模块:应用程序
$PROJECT\u DIR/.env
(或其他$PIPENV\u DOTENV\u LOCATION
)加载环境
PIPENV\u VENV\u。这将使pipenv的virtualenv位于$PROJECT\u DIR/.venv
而不是全局位置
我刚刚切换到
pipenv
进行部署,我的工作流程大致如下(使用管理)。对于一个名为“project”的假想项目,假设将一个正在工作的Pipfile.lock签入源代码管理:
git克隆https://github.com/namespace/project.git /选择/项目
cd/opt/project
git checkout$git\u ref
virtualenv-p“python$pyver”/usr/local/project/$git\u ref
VIRTUAL_ENV=“/usr/local/project/$git_ref”pipenv--python=“/usr/local/project/$git_ref/bin/python”安装--deploy
当Pipfile.lock与Pipfile不匹配时,--deploy
将抛出错误pip
安装项目本身(仅在pip文件中没有该文件时才需要):
/usr/local/project/$git_ref/bin/pip install/opt/project
ln-s/usr/local/project/$git\u ref/usr/local/project/current
/usr/local/project/current/bin/project\u exec--foo--bar
,这就是在中配置的
所有这些都是在将标签推送到远程位置时触发的
由于早期版本的VirtualNVs保持不变,只需将
当前-
符号链接设置回早期版本即可完成回滚。也就是说,如果标记1.5被破坏了,我想回到1.4,我所要做的就是ln-s/usr/local/project/1.4/usr/local/project/current
,然后使用supervisorctl
重新启动应用程序,在与项目相同的目录中创建虚拟环境,设置以下环境变量
这会将依赖项安装到项目内的
.venv
目录。可从PipEnvv2.8.7
获得,我认为PipEnv非常适合管理依赖项,但对于使用它进行自动部署来说,速度太慢、太麻烦,而且仍然有点不稳定
相反,我在目标机器上使用virtualenv(或virtualenvwrapper)和pip
- 在我的构建/开发机器上我使用
创建了一个pipenv lock-r
兼容的文本文件:requirements.txt
$ pipenv lock -r > deploy-requirements.txt
- 在部署时,我在virtualenv中运行:
$ pip install -r deploy-requirements.txt
mkdir .venv
pipenv install
说明:
pipenv
检查项目目录中名为.venv
的子目录。如果找到它,则pipenv将创建一个本地虚拟环境(因为它会自动设置pipenv\u VENV\u IN\u PROJECT=true
)
因此,如果您需要,现在可以通过以下方式激活虚拟环境:
source .venv/bin/activate
或者使用以下内容为gunicorn配置app.conf:
exec /path/to/.venv/bin/gunicorn myapp:app
因此,我一直在遵循此处列出的命令,但我遇到了pipenv使pip不可用的问题,该问题也在链接的命令中列出,但是我在某些地方看到的答案是,在特定的用户alert me@Mr Programs WDYM pipenv下安装pipenv使pip不可用?什么不起作用?或者我明白了。但这并不是特定于pipenv的,而是在包管理器旁边使用
sudo pip install…
来安装python包的一般问题。您应该为某些特定用户安装pipenv
(使用pip安装--user pipenv
)而不是像pip冻结一样?@Mr Programspipenv lock-r
与pip冻结
相反,它为软件包提供256个哈希值,我更喜欢这样,因为我的代码更容易复制。From:“注意:如果您想要锁文件的requirements.txt输出,请运行$pipenv lock-r。这将包括所有哈希(这很好!)。要获得不带哈希的requirements.txt,请使用$pipenv run pip freeze。”如果您解决了这个问题,您介意参考一下吗
exec /path/to/.venv/bin/gunicorn myapp:app