Poetry 简化Python依赖项管理和打包

诗歌:Python的依赖项管理

POLITY可帮助您声明、管理和安装Python项目的依赖项,确保您随时随地都拥有正确的堆栈

支持Python 2.7和3.5+

注意事项:在下一个功能版本(1.2)中将不再支持Python 2.7和3.5。您应该考虑将Python版本更新为支持的版本

这个complete documentation可在official website

安装

POLITY提供了一个自定义安装程序,该安装程序将安装poetry与您系统的睡觉隔离

osx/linux/bashonwindows安装说明

curl -sSL https://raw.githubusercontent.com/python-poetry/poetry/master/install-poetry.py | python -

Windows PowerShell安装说明

(Invoke-WebRequest -Uri https://raw.githubusercontent.com/python-poetry/poetry/master/install-poetry.py -UseBasicParsing).Content | python -

警告:上一次get-poetry.py安装程序现在已弃用,如果您当前正在使用它,则应迁移到新的、受支持的install-poetry.py安装程序

安装程序将安装poetry诗歌的工具bin目录。此位置取决于您的系统:

  • $HOME/.local/bin对于Unix
  • %APPDATA%\Python\Scripts在Windows上

如果此目录不在您的PATH,您需要手动添加,如果您想要用简单的poetry

或者,您可以使用完整路径来poetry使用它

一旦安装了Poetry,您就可以执行以下操作:

poetry --version

如果你看到类似这样的东西Poetry (version 1.2.0)那么您就可以使用诗歌了。如果您认为“诗歌”不适合您,您可以通过使用以下命令再次运行安装程序将其从系统中完全删除--uninstall选项,或通过将POETRY_UNINSTALL环境变量,然后执行安装程序

python install-poetry.py --uninstall
POETRY_UNINSTALL=1 python install-poetry.py

默认情况下,“诗歌”安装到用户特定于平台的主目录中。如果您希望更改此设置,您可以定义POETRY_HOME环境变量:

POETRY_HOME=/etc/poetry python install-poetry.py

如果要安装预发行版本,可以通过传递--preview选项以执行以下操作install-poetry.py或使用POETRY_PREVIEW环境变量:

python install-poetry.py --preview
POETRY_PREVIEW=1 python install-poetry.py

同样,如果要安装特定版本,可以使用--version选项或POETRY_VERSION环境变量:

python install-poetry.py --version 1.2.0
POETRY_VERSION=1.2.0 python install-poetry.py

您还可以为git存储库通过使用--git选项:

python install-poetry.py --git https://github.com/python-poetry/poetry.git@master

注意事项:请注意,安装程序不支持Python<3.6

正在更新poetry

将诗歌更新到最新的稳定版本非常简单,只需调用self update命令

警告:使用现已弃用的软件安装的诗歌版本get-poetry.py安装程序将无法使用此命令更新到1.2版或更高版本。迁移到使用install-poetry.py安装程序或pipx

poetry self update

如果要安装预发行版本,可以使用--preview选项

poetry self update --preview

最后,如果要安装特定版本,可以将其作为参数传递给self update

poetry self update 1.2.0

启用Bash、Fish或Zsh的制表符完成

poetry支持为Bash、Fish和Zsh生成完成脚本。看见poetry help completions获取完整的详细信息,但要点很简单,只需使用以下选项之一:

# Bash poetry completions bash > /etc/bash_completion.d/poetry.bash-completion # Bash (Homebrew) poetry completions bash > $(brew --prefix)/etc/bash_completion.d/poetry.bash-completion # Fish poetry completions fish > ~/.config/fish/completions/poetry.fish # Fish (Homebrew) poetry completions fish > (brew --prefix)/share/fish/vendor_completions.d/poetry.fish # Zsh poetry completions zsh > ~/.zfunc/_poetry # Zsh (Homebrew) poetry completions zsh > $(brew --prefix)/share/zsh/site-functions/_poetry # Zsh (Oh-My-Zsh) mkdir $ZSH_CUSTOM/plugins/poetry poetry completions zsh > $ZSH_CUSTOM/plugins/poetry/_poetry # Zsh (prezto) poetry completions zsh > ~/.zprezto/modules/completion/external/src/_poetry

注:您可能需要重新启动shell才能使更改生效

zsh,则必须在您的~/.zshrc在此之前compinit(不适用于自制安装):

fpath+=~/.zfunc

引言

poetry是一个处理依赖项安装以及构建和打包Python包的工具。它只需要一个文件就可以完成所有这些任务:新的、standardizedpyproject.toml

换句话说,诗歌使用pyproject.toml替换setup.pyrequirements.txtsetup.cfgMANIFEST.in和新添加的Pipfile

tool.poetry] name = "my-package" version = "0.1.0" description = "The description of the package" license = "MIT" authors = [ "Sébastien Eustace <sebastien@eustace.io>" ] readme = 'README.md' # Markdown files are supported repository = "https://github.com/python-poetry/poetry" homepage = "https://github.com/python-poetry/poetry" keywords = ['packaging', 'poetry'] [tool.poetry.dependencies] python = "~2.7 || ^3.2" # Compatible python versions must be declared here toml = "^0.9" # Dependencies with extras requests = { version = "^2.13", extras = [ "security" ] } # Python specific dependencies with prereleases allowed pathlib2 = { version = "^2.2", python = "~2.7", allow-prereleases = true } # Git dependencies cleo = { git = "https://github.com/sdispater/cleo.git", branch = "master" } # Optional dependencies (extras) pendulum = { version = "^1.4", optional = true } [tool.poetry.dev-dependencies] pytest = "^3.0" pytest-cov = "^2.4" [tool.poetry.scripts] my-script = 'my_package:main'

这里有一些我们可以注意到的事情:

  • 它将试图强制执行semantic versioning作为版本命名的最佳实践
  • 您可以指定自述文件、包含文件和排除文件:不能更多MANIFEST.inpoetry还将使用VCS忽略文件(如.gitignore)以填充exclude部分
  • 可以指定关键字(最多5个),并将其作为包装站点上的标签
  • 依赖关系部分支持脱字符、代字号、通配符、不等式和多个要求
  • 您必须指定软件包兼容的Python版本

poetry还将检测您是否在Virtualenv中,并相应地安装软件包。所以,poetry可以在全球范围内安装并在任何地方使用

poetry还附带一个完整的依赖项解析库

为什么?

Python中的打包系统和依赖项管理相当复杂,对于新手来说很难理解。即使对于经验丰富的开发人员来说,创建Python项目中所需的所有文件有时也可能很麻烦:setup.pyrequirements.txtsetup.cfgMANIFEST.in和新添加的Pipfile

因此,我想要一个工具,它可以将所有操作都限制在单个配置文件中来完成:依赖项管理、打包和发布

它需要从其他语言中存在的工具中获得灵感,比如composer(PHP)或cargo(生锈)

最后,我开始poetry为Python社区带来另一个详尽的依赖解析器Conda’s

那皮佩诺夫呢?

简而言之:我不喜欢它提供的CLI,也不喜欢它做出的一些决定,我认为我们可以做出更好、更直观的决定。这里有几件我不喜欢的东西

依赖项解析

依赖项解析不稳定,即使有解决方案也会失败。让我们举个例子:

pipenv install oslo.utils==1.4.0

将失败,并显示此错误:

Could not find a version that matches pbr!=0.7,!=2.1.0,<1.0,>=0.6,>=2.0.0

而诗会给你提供一套合适的套餐:

poetry add oslo.utils=1.4.0

结果是:

  - Installing pytz (2018.3)
  - Installing netifaces (0.10.6)
  - Installing netaddr (0.7.19)
  - Installing oslo.i18n (2.1.0)
  - Installing iso8601 (0.1.12)
  - Installing six (1.11.0)
  - Installing babel (2.5.3)
  - Installing pbr (0.11.1)
  - Installing oslo.utils (1.4.0)

这要归功于诗歌核心的高效依赖解析器

以下是这里具体发生的情况的细目:

oslo.utils (1.4.0)取决于:

  • pbr (>=0.6,!=0.7,<1.0)
  • Babel (>=1.3)
  • six (>=1.9.0)
  • iso8601 (>=0.1.9)
  • oslo.i18n (>=1.3.0)
  • netaddr (>=0.7.12)
  • netifaces (>=0.10.4)

我们感兴趣的是pbr (>=0.6,!=0.7,<1.0)

在这一点上,诗歌将选择pbr==0.11.1哪个是与约束匹配的最新版本

接下来,它将尝试选择oslo.i18n==3.20.0哪个是匹配的最新版本oslo.i18n (>=1.3.0)

但是,此版本要求pbr (!=2.1.0,>=2.0.0)这与不兼容pbr==0.11.1,所以poetry将尝试查找一个版本的oslo.i18n那是令人满意的pbr (>=0.6,!=0.7,<1.0)

通过分析oslo.i18n,它会找到oslo.i18n==2.1.0这就需要pbr (>=0.11,<2.0)在这一点上,决议的睡觉是直截了当的,因为不再有冲突

资源