pipenv:部署工作流程

时间:2018-02-01 16:17:44

标签: python pipenv

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

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

  1. git pull通过Github到生产服务器
  2. pipenv install创建/刷新部署用户的主目录中的环境
  3. 但是我需要在特定的目录中使用一个已经在systemd或supervisor中配置的venv。例如:command=/home/ubuntu/production/application_xy/env/bin/gunicorn module:app

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

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

5 个答案:

答案 0 :(得分:9)

你有几个选择。

  1. 您可以通过pipenv run gunicorn module:app

    运行您的gunicorn

    $PROJECT_DIR/.env

  2. 这会产生轻微的开销,但还具有加载$PIPENV_DOTENV_LOCATION(或其他PIPENV_VENV_IN_PROJECT)环境的优势。

    1. 您可以设置$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)); 而不是全球位置。

    2. 您可以使用现有的virtualenv并从中运行pipenv。如果Pipenv从一个人身上跑出来,他就不会试图创造自己的虚拟世界。

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

答案 1 :(得分:9)

我刚刚切换到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

    当Pipfile.lock与Pipfile不匹配时,--deploy将抛出错误。

  6. 使用virtualenv' pip安装项目本身(仅在Pip文件中已经存在时才有必要):

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

  7. 将符号链接设置为新的安装目录:

    ln -s /usr/local/project/$git_ref /usr/local/project/current

  8. 我的应用程序可以调用,例如使用/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

获得