依存関係の指定

依存関係の指定 #

プロジェクトの依存関係は、依存関係の種類やインストールに必要なオプションの制約に応じて、さまざまな形式で指定できます。

バージョンの制約 #

キャレット要件 #

キャレット要件は、指定されたバージョンへのSemVer互換のアップデートを許可します。アップデートが許可されるのは、新しいバージョン番号が、メジャー、マイナー、パッチのグループ化で左端のゼロ以外の桁を変更しない場合です。たとえば、以前にpoetry add requests@^2.13.0を実行し、ライブラリを更新したくてpoetry update requestsを実行した場合、poetryは利用可能な場合はバージョン2.14.0に更新しますが、3.0.0には更新しません。代わりに、バージョン文字列を^0.1.13と指定した場合、poetryは0.1.14に更新しますが、0.2.0には更新しません。0.0.xは、他のバージョンとは互換性がないと見なされます。

キャレット要件のその他の例と、それらで許可されるバージョンを以下に示します。

要件 許可されるバージョン
^1.2.3 >=1.2.3 <2.0.0
^1.2 >=1.2.0 <2.0.0
^1 >=1.0.0 <2.0.0
^0.2.3 >=0.2.3 <0.3.0
^0.0.3 >=0.0.3 <0.0.4
^0.0 >=0.0.0 <0.1.0
^0 >=0.0.0 <1.0.0

チルダ要件 #

チルダ要件は、更新が可能な最小バージョンを指定します。メジャー、マイナー、パッチバージョン、またはメジャーとマイナーバージョンのみを指定すると、パッチレベルの変更のみが許可されます。メジャーバージョンのみを指定すると、マイナーレベルとパッチレベルの変更が許可されます。

~1.2.3はチルダ要件の例です。

要件 許可されるバージョン
~1.2.3 >=1.2.3 <1.3.0
~1.2 >=1.2.0 <1.3.0
~1 >=1.0.0 <2.0.0

ワイルドカード要件 #

ワイルドカード要件では、ワイルドカードが配置されている最新バージョン(依存関係によって異なります)が許可されます。

*1.*1.2.*はワイルドカード要件の例です。

要件 許可されるバージョン
* >=0.0.0
1.* >=1.0.0 <2.0.0
1.2.* >=1.2.0 <1.3.0

不等号要件 #

不等号要件を使用すると、依存するバージョン範囲または正確なバージョンを手動で指定できます。

不等号要件の例を次に示します。

>= 1.2.0
> 1
< 2
!= 1.2.3

複数要件 #

複数のバージョン要件は、コンマで区切ることもできます(例:>= 1.2, < 1.5)。

厳密な要件 #

パッケージの正確なバージョンを指定できます。

1.2.3は、正確なバージョン指定の例です。

これにより、Poetryはこのバージョンのみをインストールするように指示されます。他の依存関係が異なるバージョンを必要とする場合、ソルバーは最終的に失敗し、インストールまたは更新の手順を中断します。

正確なバージョンは、PEP 440に従って==でも指定できます。

==1.2.3はこれの例です。

@演算子の使用 #

poetry addで依存関係を追加するときに、@演算子を使用できます。これは==構文と同様に理解されますが、pyproject.tomlで有効な指定子を先頭に付けることもできます。例:

poetry add django@^4.0.0

上記は、pyproject.tomlの次のエントリに変換されます。

Django = "^4.0.0"

特別なキーワードlatestは、@演算子でも理解されます。

poetry add django@latest

上記は、djangoの最新リリースが4.0.5であると仮定すると、pyproject.tomlの次のエントリに変換されます。

Django = "^4.0.5"

Extras #

Extrasと@は、予想どおりに組み合わせることができます(package[extra]@version)。

poetry add django[bcrypt]@^4.0.0

git依存関係 #

gitリポジトリにあるライブラリに依存するには、指定する必要がある最小限の情報は、gitキーを持つリポジトリの場所です。

[tool.poetry.dependencies]
requests = { git = "https://github.com/requests/requests.git" }

他の情報を指定していないため、Poetryはmainブランチの最新のコミットを使用してプロジェクトをビルドすることを意図していると想定します。

gitキーをbranchキーと組み合わせて、別のブランチを使用できます。または、revまたはtagを使用して、依存関係を特定のコミットハッシュまたはタグ付き参照にそれぞれ固定します。例:

[tool.poetry.dependencies]
# Get the latest revision on the branch named "next"
requests = { git = "https://github.com/kennethreitz/requests.git", branch = "next" }
# Get a revision by its commit hash
flask = { git = "https://github.com/pallets/flask.git", rev = "38eb5d3b" }
# Get a revision by its tag
numpy = { git = "https://github.com/numpy/numpy.git", tag = "v0.13.2" }

インストールするパッケージがVCSリポジトリのサブディレクトリにある場合は、pipが提供するものと同様に、subdirectoryオプションを使用できます。

[tool.poetry.dependencies]
# Install a package named `subdir_package` from a folder called `subdir` within the repository
subdir_package = { git = "https://github.com/myorg/mypackage_with_subdirs.git", subdirectory = "subdir" }

対応するadd呼び出し

poetry add "git+https://github.com/myorg/mypackage_with_subdirs.git#subdirectory=subdir"

たとえば、プライベートリポジトリの場合にSSH接続を使用するには、次の構文例を使用します。

[tool.poetry.dependencies]
requests = { git = "git@github.com:requests/requests.git" }

GitリポジトリでHTTP基本認証を使用するには、リポジトリのクレデンシャルが構成されている方法と同様に、クレデンシャルを構成できます。

poetry config repositories.git-org-project https://github.com/org/project.git
poetry config http-basic.git-org-project username token
poetry add git+https://github.com/org/project.git
注意

Poetry 1.2リリースでは、使用されるデフォルトのgitクライアントはDulwichです。

gitcredentialsが使用されている場合、レガシーシステムのgitクライアントの実装にフォールバックします。このフォールバックは、gitcredentialsヘルパーがネイティブでより適切にサポートされる将来のリリースで削除されます。

Poetry 1.2以前に機能していたデフォルトの実装で問題が発生した場合は、シェルサブプロセスコールを介してシステムgitクライアントの使用を明示的に構成することをお勧めします。

poetry config experimental.system-git-client true

ただし、そうすると、システムgitクライアントの使用が原因で発生した1.2より前のバージョンに存在したバグが表面化することに注意してください。

path依存関係 #

ローカルディレクトリまたはファイルにあるライブラリに依存するには、pathプロパティを使用できます。

[tool.poetry.dependencies]
# directory
my-package = { path = "../my-package/", develop = false }

# file
my-package = { path = "../my-package/dist/my-package-0.1.0.tar.gz" }
注意
poetry 1.1より前では、ディレクトリパスの依存関係はデフォルトで編集可能モードでインストールされていました。すべてのpoetryバージョンで動作が同じであることを確認するために、develop属性を明示的に設定する必要があります。

url依存関係 #

リモートアーカイブにあるライブラリに依存するには、urlプロパティを使用できます。

[tool.poetry.dependencies]
# directory
my-package = { url = "https://example.com/my-package-0.1.0.tar.gz" }

対応するadd呼び出し

poetry add https://example.com/my-package-0.1.0.tar.gz

依存関係のextras #

ここに示されているように、依存関係のPEP-508 Extrasを指定できます。

[tool.poetry.dependencies]
gunicorn = { version = "^20.1", extras = ["gevent"] }
注意
これらは依存関係に対して定義された追加機能をアクティブ化します。プロジェクトの追加機能のオプションの依存関係を構成するには、extrasを参照してください。

source依存関係 #

代替リポジトリからパッケージに依存するには、sourceプロパティを使用できます。

[[tool.poetry.source]]
name = "foo"
url = "https://foo.bar/simple/"
priority = "supplemental"

[tool.poetry.dependencies]
my-cool-package = { version = "*", source = "foo" }

対応するadd呼び出し

poetry add my-cool-package --source foo
注意
この例では、fooが正しく構成されていることを期待します。詳細については、プライベートリポジトリの使用を参照してください。

Pythonで制限された依存関係 #

特定のPythonバージョンでのみ依存関係をインストールする必要があることを指定することもできます。

[tool.poetry.dependencies]
tomli = { version = "^2.0.1", python = "<3.11" }
[tool.poetry.dependencies]
pathlib2 = { version = "^2.2", python = "^3.2" }

環境マーカーの使用 #

依存関係にさらに複雑なインストール条件が必要な場合、Poetryはmarkersプロパティを介して環境マーカーをサポートしています。

[tool.poetry.dependencies]
pathlib2 = { version = "^2.2", markers = "python_version <= '3.4' or sys_platform == 'win32'" }

複数の制約を持つ依存関係 #

場合によっては、依存関係の一つが、ターゲットのPythonバージョンによって異なるバージョンの範囲を持つことがあります。

たとえば、Python 3.6-3.7ではバージョン1.9まで、Python 3.8以降ではバージョン2.0からのみ互換性があるパッケージfooに依存しているとしましょう。その場合、次のように宣言します。

[tool.poetry.dependencies]
foo = [
    {version = "<=1.9", python = ">=3.6,<3.8"},
    {version = "^2.0", python = ">=3.8"}
]
注意
制約は、異なる要件(pythonなど)を持た**なければなりません**。そうでない場合、依存関係を解決する際にエラーが発生します。

git/url/path依存関係とソースリポジトリの組み合わせ #

直接オリジン(git/url/path)依存関係は、相互に排他的なマーカーが使用されている場合でも、ソースを明示的に指定していない依存関係の要件を満たすことができます。たとえば、次の例では、urlパッケージも2番目の要件に対する有効な解決策となります。

foo = [
    { platform = "darwin", url = "https://example.com/example-1.0-py3-none-any.whl" },
    { platform = "linux", version = "^1.0" },
]

代わりに、特定の条件(つまり、特定のプラットフォーム/アーキテクチャでPyPIで利用できないコンパイル済みパッケージ)に対して直接オリジンの依存関係を使用し、他の場合にはソースリポジトリにフォールバックしたい場合があります。この場合、依存関係が別のsourceによって満たされることを明示的に要求する必要があります。例:

foo = [
    { platform = "darwin", url = "https://example.com/foo-1.0.0-py3-none-macosx_11_0_arm64.whl" },
    { platform = "linux", version = "^1.0", source = "pypi" },
]

拡張された依存関係の指定構文 #

より複雑な依存関係の指定の場合、非常に長く読みにくい行になる場合があります。このような場合、「インラインテーブル」構文から「標準テーブル」構文に切り替えることができます。

これが役立つ可能性のある例を次に示します。

[tool.poetry.group.dev.dependencies]
black = {version = "19.10b0", allow-prereleases = true, python = "^3.7", markers = "platform_python_implementation == 'CPython'"}

1行にすると、これは把握するのが大変です。これを少し扱いやすくするために、次のことができます。

[tool.poetry.group.dev.dependencies.black]
version = "19.10b0"
allow-prereleases = true
python = "^3.7"
markers = "platform_python_implementation == 'CPython'"

同じ情報がまだ存在し、最終的にはまったく同じ指定を提供します。単に複数行に分割され、少し読みやすくなっているだけです。