22

我正在考虑从 pip & virtualenv 切换到 pipenv。但是在研究了文档之后,我仍然对 pipenv 的创建者如何构建部署工作流程感到茫然。

例如,在开发中,我有一个Pipfile& aPipfile.lock来定义环境。使用我要部署的部署脚本

  1. git pull通过 Github 到生产服务器
  2. pipenv install在部署用户的主目录中创建/刷新环境

但是我需要一个特定目录中的 venv,该目录已经在 systemd 或 supervisor 中配置。例如:command=/home/ubuntu/production/application_xy/env/bin/gunicorn module:app

pipenv 在某个位置创建环境,例如 /home/ultimo/.local/share/virtualenvs/application_xy-jvrv1OSi

部署应用程序的预期工作流程是什么pipenv

4

5 回答 5

23

你在那里几乎没有选择。

  1. 您可以通过以下方式运行您的 gunicorn pipenv run

    pipenv run gunicorn module:app

这会产生轻微的开销,但也具有从$PROJECT_DIR/.env(或其他$PIPENV_DOTENV_LOCATION)加载环境的优点。

  1. 您可以设置PIPENV_VENV_IN_PROJECT环境变量。这将保留 pipenv 的 virtualenv$PROJECT_DIR/.venv而不是全局位置。

  2. 您可以使用现有的 virtualenv 并从中运行 pipenv。如果 Pipenv 从一个运行,它不会尝试创建自己的 virtualenv。

  3. 你可以使用奇怪的 pipenv 创建的 virtualenv 路径。

于 2018-02-08T23:45:21.097 回答
12

我刚刚切换到pipenv部署,我的工作流程大致如下(使用ansible管理)。对于一个名为“project”的虚构项目,假设将工作的 Pipfile.lock 签入源代码管理:

  1. 克隆 git 存储库:

    git clone https://github.com/namespace/project.git /opt/project

  2. 切换到那个目录

    cd /opt/project

  3. 查看目标引用(分支、标签、...):

    git checkout $git_ref

  4. 使用目标 Python 版本(3.6、2.7 等)在某处创建一个 virtualenv:

    virtualenv -p"python$pyver" /usr/local/project/$git_ref

  5. 在该 virtualenv 的上下文中调用 pipenv,因此它不会安装自己的:

    VIRTUAL_ENV="/usr/local/project/$git_ref" pipenv --python="/usr/local/project/$git_ref/bin/python" install --deploy

    --deployPipfile.lock 与 Pipfile 不匹配时,将引发错误。

  6. 使用 virtualenv 安装项目本身pip(仅当它不在 Pipfile 中时才需要):

    /usr/local/project/$git_ref/bin/pip install /opt/project

  7. 设置指向新安装目录的符号链接:

    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

于 2018-03-20T15:37:46.767 回答
6

我认为 pipenv 非常适合管理依赖项,但是太慢、太麻烦而且对于使用它进行自动部署仍然有点不稳定。

相反,我在目标机器上使用 virtualenv(或 virtualenvwrapper)和 pip。

  • 在我的构建/开发机器上,我使用以下命令创建了一个requirements.txt兼容的文本文件pipenv lock -r

      $ pipenv lock -r > deploy-requirements.txt
    
  • 部署时,在 virtualenv 中我运行:

      $ pip install -r deploy-requirements.txt
    
于 2018-10-02T18:37:57.067 回答
4

要在与项目相同的目录中创建虚拟环境,请设置以下环境变量doc

PIPENV_VENV_IN_PROJECT=true

这会将依赖项安装到.venv项目内的目录中。可从 PipEnv 获得v2.8.7

于 2018-08-24T07:49:58.747 回答
4

只需这样做:

mkdir .venv
pipenv install

解释:

pipenv检查您的项目目录中是否有一个名为.venv. 如果找到它,则pipenv 创建一个本地虚拟环境(因为它会自动设置PIPENV_VENV_IN_PROJECT=true

所以现在如果你愿意,你可以通过以下方式激活虚拟环境:

source .venv/bin/activate

或者为 gunicorn 配置 app.conf,如下所示:

exec /path/to/.venv/bin/gunicorn myapp:app
于 2019-09-12T20:06:06.083 回答