Python 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

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

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

  • git通过Github拉入生产服务器
  • pipenv install
    在部署用户的主目录中创建/刷新环境
  • 但是我需要一个特定目录中的venv,该目录已在systemd或supervisor中配置。例如:
    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
    而不是全局位置

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

  • 您可以使用古怪的pipenv创建的virtualenv路径


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

  • 克隆git存储库:

    git克隆https://github.com/namespace/project.git /选择/项目

  • 换到那个目录

    cd/opt/project

  • 检查目标引用(分支、标记等):

    git checkout$git\u ref

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

    virtualenv-p“python$pyver”/usr/local/project/$git\u ref

  • 在该virtualenv的上下文中调用pipenv,这样它就不会安装自己的:

    VIRTUAL_ENV=“/usr/local/project/$git_ref”pipenv--python=“/usr/local/project/$git_ref/bin/python”安装--deploy

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

  • 使用virtualenv的
    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
    目录。可从PipEnv
    v2.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 Programs
    pipenv lock-r
    pip冻结
    相反,它为软件包提供256个哈希值,我更喜欢这样,因为我的代码更容易复制。From:“注意:如果您想要锁文件的requirements.txt输出,请运行$pipenv lock-r。这将包括所有哈希(这很好!)。要获得不带哈希的requirements.txt,请使用$pipenv run pip freeze。”如果您解决了这个问题,您介意参考一下吗
    exec /path/to/.venv/bin/gunicorn myapp:app