使用Poetry,Git和Docker的Python开发流程


介绍

本文是我之前编写的使用pipenv,Git和Docker的Python开发流程的姐妹文章。既然Pipenv的开发不是很活跃,我认为在使用Python的项目中有时会使用Poetry。因此,我想使用诗歌重新组织开发流程。

总流量

  • 安装开发环境
  • 项目初始化
  • 码头工人
  • 前提条件

    • Python 3.x
    • 类Unix操作系统

    安装开发环境

    诗歌创作

    在大多数情况下,您可以从操作系统随附的软件包管理器进行安装。

    对于macOS

    1
    $ brew install poetry

    拱Linux

    1
    $ sudo pacman -S python-poetry

    Ubuntu 18.04

    不幸的是,它没有在标准存储库中注册,因此请从官方安装程序进行安装。

    1
    2
    $ sudo apt install python3 python3-pip
    $ curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/get-poetry.py | python3

    安装完成后,将~/.poetry/bin放入PATH。根据您的外壳,将以下设置添加到~/.zshrc~/.bashrc

    ?/ .bashrc

    1
    export PATH=${HOME}/.poetry/bin:${PATH}

    其他工具介绍

    将来我将使用Git和Docker / Docker Compose,因此请做好准备。

    初始化Python项目

    最后,我们将使用诗歌来初始化Python项目。

    创建一个项目

    首先,创建一个适当的目录并将其放入其中。

    1
    2
    $ mkdir sample-app
    $ cd sample-app

    接下来,您可以通过执行poetry init来初始化项目。它是交互式的,所以让我们回答每个问题。系统将询问您是否要在途中安装从属软件包,但是这次我要单独安装它们,因此我将跳过它。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    $ poetry init

    This command will guide you through creating your pyproject.toml config.

    Package name [sample_app]:
    Version [0.1.0]:
    Description []:  Sample App
    Author [Aruneko <[email protected]>, n to skip]:
    License []:  MIT
    Compatible Python versions [^3.7]:

    Would you like to define your main dependencies interactively? (yes/no) [yes] no
    Would you like to define your development dependencies interactively? (yes/no) [yes] no
    Generated file

    [tool.poetry]
    name = "sample_app"
    version = "0.1.0"
    description = "Sample App"
    authors = ["Aruneko <[email protected]>"]
    license = "MIT"

    [tool.poetry.dependencies]
    python = "^3.7"

    [tool.poetry.dev-dependencies]

    [build-system]
    requires = ["poetry>=0.12"]
    build-backend = "poetry.masonry.api"


    Do you confirm generation? (yes/no) [yes]

    退出交互式环境时,pyproject.toml已完成。这样就完成了项目初始化。

    1
    2
    $  ls
    pyproject.toml

    诗歌初始设置

    通常,如果添加了以下设置,则在~/Library/Caches/pypoetry/virtualenvs~/.config/poetry下创建的Python虚拟环境将直接在项目根目录下创建一个.venv目录,并在那里管理Python环境。请根据需要设置。

    1
    $ poetry config virtualenvs.in-project true --local

    请注意,此设置在poetry.toml中列出,而不是在pyproject.toml中列出。

    添加包装

    诗歌环境下,使用add添加软件包,例如npm。让我们开发一个使用FastAPI作为示例的应用程序。

    1
    $ poetry add fastapi uvicorn

    使用

    诗歌安装软件包时,当时可以解析的从属软件包以及每个软件包的版本信息都将写入poetry.lock

    仅在开发期间使用的软件包与-D选项以及npm一起安装。例如,让我们安装代码格式化程序black

    1
    $ poetry add -D black

    到目前为止,通过执行命令,您可以看到到目前为止安装的软件包已添加到pyproject.tomltool.poetry.dependenciestool.poetry.dev-dependencies部分中。

    pyproject.toml

    1
    2
    3
    4
    5
    6
    7
    [tool.poetry.dependencies]
    python = "^3.7"
    fastapi = "^0.52.0"
    uvicorn = "^0.11.3"

    [tool.poetry.dev-dependencies]
    black = "^19.10b0"

    从现在开始,请根据需要每次安装软件包。

    Git初始化

    接下来,初始化Git以使用Git管理该项目。首先使用gitignore.io创建一个.gitignore文件。这次,我们将要求您指定Python和virtualenv。如果您需要.gitignore的其他设置,请在此处进行编辑。

    一旦拥有

    .gitignore,初始化您的Git存储库,大致添加所有文件,然后提交。

    1
    2
    3
    4
    $ curl -o .gitignore https://www.gitignore.io/api/python,virtualenv
    $ git init
    $ git add pyproject.toml poetry.lock poetry.toml .gitignore
    $ git commit -m "Initial Commit"

    如何进入虚拟环境

    使用shell子命令输入

    诗歌创建的Python虚拟环境。如果您忘记进入虚拟环境,则会出现各种问题,例如无法看到您应该安装的软件包,因此请务必仔细检查。要退出,请使用exit命令。

    1
    2
    $ poetry shell
    (.venv)$ exit

    码头工人

    中,当我们完成创建Poetry项目时,我们将最终进行Docker转换。

    正在准备.dockerignore

    对于不需要传输的文件,输入.dockerignore。确保将其写入,尤其是在将.venv文件设置为在项目根目录中创建的情况下。另外,最好不要传输__pycache__目录。

    .dockerignore

    1
    2
    .venv/
    __pycache__/

    Dockerfile准备

    最后,我将编写一个Dockerfile。这次,我将介绍使用多阶段构建的方法。该过程分为上半部分创建requirements.txt和下半部分使用它来创建带有Python应用程序的Docker Image。

    首先需要这样做的原因是,您需要安装Poetry来读取poetry.lock,但是您不需要将Poetry放在放置应用程序的容器中,因此请分开它们。因为我有想要的意图。诗歌具有生成requirements.txt的能力,因此我们将利用它。

    首先,从上半年的解释开始。为了充分利用Docker的缓存策略,我首先安装了Poetry。这样可以省去在每个版本上安装Poetry的麻烦。然后,它仅复制pyproject.tomlpoetry.lock以生成requirements.txt

    接下来是后半部分的说明。从上半年复制生成的requirements.txt,然后使用pip命令安装所有那些软件包。如果这些文件未更改,则将使用缓存自动构建下一层,因此可以防止在每次构建时都提前下载相关软件包的行为。建议使用此配置,因为它可以节省大量的构建时间。安装完成后,传输各种Python脚本并编写要运行的命令,然后完成。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    FROM python:3.8-slim as builder

    WORKDIR /usr/src/app

    RUN pip install poetry

    COPY pyproject.toml poetry.lock ./

    RUN poetry export -f requirements.txt > requirements.txt


    FROM python:3.8-slim

    ENV PYTHONUNBUFFERED=1

    WORKDIR /usr/src/app

    COPY --from=builder /usr/src/app/requirements.txt .

    RUN pip install -r requirements.txt

    COPY . .

    EXPOSE 8000
    CMD [ "uvicorn", "main:app", "--host", "0.0.0.0" ]

    设置Docker Compose也是一个好主意。挂载本地文件进行开发,然后设置自动重新加载设置可能是一个好主意。

    docker-compose.yml

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    version: '3'

    services:
      app:
        build: .
        volumes:
          - ./:/usr/src/app
        ports:
          - "8000:8000"
        command: ["uvicorn", "main:app", "--reload", "--host", "0.0.0.0"]

    常问问题

    如何更新软件包

    可以使用

    poetry update。但是,它不会在pyproject.toml中描述的版本之外进行更新,因此在升级主要版本时请小心。

    如何卸下包装

    您可以使用

    poetry remove PACKAGE_NAME将其删除。

    如果您从中间参与开发

    您可以使用

    poetry install安装整个开发依赖包。

    结论

    到目前为止,我们已经解释了使用Poetry的Python项目的开发流程。我认为Poetry也可以像Pipenv一样使用poetry.lock来消除开发人员之间的版本差异并提供稳定的开发环境。它也遵循PEP商定的格式,因此感觉对未来来说还不错。

    另一方面,给人的印象是,它是针对Python包开发人员而不是Python应用程序的项目管理工具,例如缺少script函数来运行Pipenv可能的单行代码。我经常使用它来运行Lint和测试,但是有此功能。

    作为

    ,诗歌和Pipenv都有优点和缺点。在这一点上,我认为选择适合您的项目的方法是安全的。希望大家都过得愉快。