我正在考虑从pip& virtualenv到pipenv。但在研究了文档后,我仍然对pipenv的创建者如何构建部署工作流程感到茫然。
例如,在开发过程中,我有一个Pipfile
&定义环境的Pipfile.lock
。使用我想部署的部署脚本
git pull
通过Github到生产服务器pipenv install
创建/刷新部署用户的主目录中的环境但是我需要在特定的目录中使用一个已经在systemd或supervisor中配置的venv。例如:command=/home/ubuntu/production/application_xy/env/bin/gunicorn module:app
pipenv在某些位置创建环境,例如
/home/ultimo/.local/share/virtualenvs/application_xy-jvrv1OSi
使用pipenv
部署应用程序的预期工作流程是什么?
答案 0 :(得分:9)
你有几个选择。
您可以通过pipenv run gunicorn module:app
:
$PROJECT_DIR/.env
这会产生轻微的开销,但还具有加载$PIPENV_DOTENV_LOCATION
(或其他PIPENV_VENV_IN_PROJECT
)环境的优势。
您可以设置$PROJECT_DIR/.venv
环境变量。这将使pipenv的virtualenv保持在Path path = Paths.get("C:\\Users\\hoflerj\\Desktop\\After\\test.txt");
Charset charset = StandardCharsets.UTF_8;
String content = new String(Files.readAllBytes(path), charset);
content = content.replaceAll("2018(.+)", "XXXX");
Files.write(path, content.getBytes(charset));
而不是全球位置。
您可以使用现有的virtualenv并从中运行pipenv。如果Pipenv从一个人身上跑出来,他就不会试图创造自己的虚拟世界。
你可以使用奇怪的pipenv创建的virtualenv路径。
答案 1 :(得分:9)
我刚刚切换到pipenv
进行部署,我的工作流程大致如下(使用ansible进行管理)。对于一个名为" project"的假想项目,假设在源代码控制中检查了一个正在运行的Pipfile.lock:
克隆git存储库:
git clone https://github.com/namespace/project.git /opt/project
转到该目录
cd /opt/project
查看目标参考(分支,标记,......):
git checkout $git_ref
使用目标Python版本(3.6,2.7等)在某处创建virtualenv:
virtualenv -p"python$pyver" /usr/local/project/$git_ref
在virtualenv的上下文中调用pipenv,因此它不会安装自己的:
VIRTUAL_ENV="/usr/local/project/$git_ref" pipenv --python="/usr/local/project/$git_ref/bin/python" install --deploy
当Pipfile.lock与Pipfile不匹配时,--deploy
将抛出错误。
使用virtualenv' pip
安装项目本身(仅在Pip文件中已经存在时才有必要):
/usr/local/project/$git_ref/bin/pip install /opt/project
将符号链接设置为新的安装目录:
ln -s /usr/local/project/$git_ref /usr/local/project/current
我的应用程序可以调用,例如使用/usr/local/project/current/bin/project_exec --foo --bar
,这是supervisor中配置的内容。
将标签推送到遥控器时会触发所有这些。
由于早期版本的virtualenvs保持不变,只需将current-
符号链接设置回早期版本即可完成回滚。即如果标签1.5被破坏,我想回到1.4,我所要做的只是ln -s /usr/local/project/1.4 /usr/local/project/current
并使用supervisorctl
重新启动应用程序。
答案 2 :(得分:2)
我认为pipenv对于管理依赖项非常有用,但是它太慢,麻烦并且对于将其用于自动部署仍然有些不稳定。
相反,我在目标计算机上使用virtualenv(或virtualenvwrapper)和pip。
在我的开发计算机上,我使用requirements.txt
创建了一个pipenv lock -r
兼容的文本文件:
$ pipenv lock -r > deploy-requirements.txt
在虚拟环境中部署时,我运行:
$ pip install -r deploy-requirements.txt
答案 3 :(得分:1)
只需执行以下操作:
mkdir .venv
pipenv install
说明:
pipenv
检查项目目录中是否有名为.venv
的子目录。如果找到它,则 pipenv创建一个本地虚拟环境(因为它会自动设置PIPENV_VENV_IN_PROJECT=true
)
现在,如果需要,您可以使用以下方法激活虚拟环境:
source .venv/bin/activate
或使用以下方式为app.conf配置gunicorn:
exec /path/to/.venv/bin/gunicorn myapp:app
答案 4 :(得分:0)
要在与项目相同的目录中创建虚拟环境,请设置以下环境变量 doc
PIPENV_VENV_IN_PROJECT=true
这会将依赖项安装到项目内的.venv
目录中。可从PipEnv v2.8.7