Skip to content

Manage Dependencies#

PDMには、プロジェクトと依存関係の管理に役立つ便利なコマンドが多数用意されています。次の例はUbuntu 18.04で実行されますが、Windowsを使用している場合はいくつかの変更が必要です。

Add dependencies#

pdm addの後には1つまたは複数の依存関係を指定できます。依存関係の仕様はPEP 508で説明されています。

以下に例を示します。

1
2
3
4
pdm add requests   # add requests
pdm add requests==2.25.1   # add requests with version constraint
pdm add requests[socks]   # add requests with extra dependency
pdm add "flask>=1.0" flask-sqlalchemy   # add multiple dependencies with different specifiers

PDMでは、-G/--group <name>オプションを指定して追加の依存関係グループを作成することもできます。これらの依存関係は、それぞれプロジェクトファイルの[project.optional-dependencies.<name>]テーブルに追加されます。

パッケージがアップロードされる前でも、optional-dependenciesで他のオプショングループを参照できます。

1
2
3
4
5
6
7
8
[project]
name = "foo"
version = "0.1.0"

[project.optional-dependencies]
socks = ["pysocks"]
jwt = ["pyjwt"]
all = ["foo[socks,jwt]"]

その後、依存関係と従属依存関係が適切に解決され、インストールされます。pdm.lockを表示して、すべての依存関係の解決結果を確認できます。

Local dependencies#

ローカル・パッケージは、そのパスとともに追加できます。パスは、ファイルまたはディレクトリです。

1
2
pdm add ./sub-package
pdm add ./first-1.0.0-py2.py3-none-any.whl

パスは.で始まる必要があります。そうでない場合は、通常の名前付き要件として認識されます。ローカル依存関係は、次のURL形式でpyproject.tomlファイルに書き込まれます。:

1
2
3
4
5
[project]
dependencies = [
    "sub-package @ file:///${PROJECT_ROOT}/sub-package",
    "first @ file:///${PROJECT_ROOT}/first-1.0.0-py2.py3-none-any.whl",
]
Using other build backends

If you are using hatchling instead of the pdm backend, the URLs would be as follows:

pdmバックエンドの代わりにhatchlingを使用している場合、URLは次のようになります。

1
2
sub-package @ {root:uri}/sub-package
first @ {root:uri}/first-1.0.0-py2.py3-none-any.whl
他のバックエンドでは、URL内の相対パスのエンコードがサポートされておらず、代わりに絶対パスが書き込まれます。

URL dependencies#

PDMでは、Webアドレスから直接パッケージをダウンロードしてインストールすることもできます。

例:

1
2
3
4
# Install gzipped package from a plain URL
pdm add "https://github.com/numpy/numpy/releases/download/v1.20.0/numpy-1.20.0.tar.gz"
# Install wheel from a plain URL
pdm add "https://github.com/explosion/spacy-models/releases/download/en_core_web_trf-3.5.0/en_core_web_trf-3.5.0-py3-none-any.whl"

VCS dependencies#

gitリポジトリのURLまたは他のバージョン管理システムからインストールすることもできます。サポートされているのは次のとおりです。:

  • Git: git
  • Mercurial: hg
  • Subversion: svn
  • Bazaar: bzr

The URL should be like: {vcs}+{url}@{rev}

URLは次のようになります。{vcs}+{url}@{rev}

例:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
# Install pip repo on tag `22.0`
pdm add "git+https://github.com/pypa/pip.git@22.0"
# Provide credentials in the URL
pdm add "git+https://username:password@github.com/username/private-repo.git@master"
# Give a name to the dependency
pdm add "pip @ git+https://github.com/pypa/pip.git@22.0"
# Or use the #egg fragment
pdm add "git+https://github.com/pypa/pip.git@22.0#egg=pip"
# Install from a subdirectory
pdm add "git+https://github.com/owner/repo.git@master#egg=pkg&subdirectory=subpackage"

gitでsshスキームを使用するには、https://をssh://git@に置き換えます。

例:

1
pdm add "wheel @ git+ssh://git@github.com/pypa/wheel.git@main"

Hide credentials in the URL#

You can hide the credentials in the URL by using the ${ENV_VAR} variable syntax:

${ENV_VAR}変数の構文を使用すると、URL内の資格情報を非表示にできます。:

1
2
3
4
[project]
dependencies = [
  "mypackage @ git+http://${VCS_USER}:${VCS_PASSWD}@test.git.com/test/mypackage.git@master"
]

これらの変数は、プロジェクトのインストール時に環境変数から読み込まれます。

Add development only dependencies#

Added in version 1.5.0

PDM also supports defining groups of dependencies that are useful for development, e.g. some for testing and others for linting. We usually don't want these dependencies appear in the distribution's metadata so using optional-dependencies is probably not a good idea. We can define them as development dependencies:

PDMは、開発に役立つ依存関係のグループの定義もサポートしています。たとえば、テスト用のものとリンティング用のものがあります。通常、これらの依存関係をディストリビューションのメタデータに表示したくないので、optional-dependenciesを使用することはお勧めできません。これらを開発依存関係として定義できます。

1
pdm add -dG test pytest

This will result in a pyproject.toml as following:

1
2
[tool.pdm.dev-dependencies]
test = ["pytest"]

You can have several groups of development only dependencies. Unlike optional-dependencies, they won't appear in the package distribution metadata such as PKG-INFO or METADATA. The package index won't be aware of these dependencies. The schema is similar to that of optional-dependencies, except that it is in tool.pdm table.

開発専用の依存関係のグループを複数持つことができます。optional-dependenciesとは異なり、これらはPKG-INFOMETADATAなどのパッケージ配布メタデータには表示されません。パッケージインデックスはこれらの依存関係を認識しません。スキーマは、tool.pdmテーブルにあることを除いて、optional-dependenciesと似ています。

1
2
3
4
5
6
7
[tool.pdm.dev-dependencies]
lint = [
    "flake8",
    "black"
]
test = ["pytest", "pytest-cov"]
doc = ["mkdocs"]

下位互換性のために、-dまたは--devのみが指定されている場合、デフォルトで依存関係は[tool.pdm.dev-dependencies]の下のdevグループに移動します。

Note

[tool.pdm.dev-dependencies][project.optional-dependencies]の両方に同じグループ名を使用してはなりません。

Editable dependencies#

Local directoriesVCS dependencieseditable modeに設置できます。pipに精通している場合は、pip install -e <package>のようになります。 編集可能なパッケージは、開発依存関係でのみ許可されます:

Note

Editable installs are only allowed in the dev dependency group. Other groups, including the default, will fail with a [PdmUsageError].

編集可能なインストールは、dev依存関係グループでのみ許可されます。デフォルトを含む他のグループは、[PdmUsageError]で失敗します。

1
2
3
4
5
6
# A relative path to the directory
pdm add -e ./sub-package --dev
# A file URL to a local directory
pdm add -e file:///path/to/sub-package --dev
# A VCS URL
pdm add -e git+https://github.com/pallets/click.git@main#egg=click --dev

Save version specifiers#

If the package is given without a version specifier like pdm add requests. PDM provides three different behaviors of what version specifier is saved for the dependency, which is given by --save-<strategy>(Assume 2.21.0 is the latest version that can be found for the dependency):

パッケージがpdm add requestsのようなバージョン指定子なしで指定された場合、PDMは、依存関係に対して保存されるバージョン指定子の3つの異なる動作を提供します。これは、--save-<strategy>によって指定されます(2.21.0が依存関係に対して検出される最新バージョンであると仮定します)。

  • minimum: Save the minimum version specifier: >=2.21.0 (default).
  • compatible: Save the compatible version specifier: >=2.21.0,<3.0.0.
  • exact: Save the exact version specifier: ==2.21.0.
  • wildcard: Don't constrain version and leave the specifier to be wildcard: *.

  • minimum:最小バージョン指定子 >=2.21.0(デフォルト)を保存します。

  • compatible:互換性のあるバージョン指定子(>=2.21.0,<3.0.0)を保存します。
  • exact:正確なバージョン指定子==2.21.0`を保存します。
  • wildcard:versionを制約せず、指定子をwildcard:*のままにします。

Add prereleases#

One can give --pre/--prerelease option to pdm add so that prereleases are allowed to be pinned for the given packages.

pdm add--pre --prereleaseオプションを与えると、指定されたパッケージのプレリリースを固定することができます。

Update existing dependencies#

ロック・ファイル内のすべての依存関係を更新するには、次のようにします。:

1
pdm update

To update the specified package(s):

1
pdm update requests

複数の依存関係グループを更新するには、次の手順に従います。:

1
pdm update -G security -G http

または、カンマ区切りのリストを使用します。:

1
pdm update -G "security,http"

指定したグループ内の特定のパッケージを更新するには、次の手順に従います。:

1
pdm update -G security cryptography

グループが指定されていない場合、PDMはデフォルトの依存セットで要件を検索し、見つからない場合はエラーが発生します。

開発依存関係内のパッケージを更新するには、次の手順に従います。:

1
2
3
4
# Update all default + dev-dependencies
pdm update -d
# Update a package in the specified group of dev-dependencies
pdm update -dG test pytest

About update strategy#

Similarly, PDM also provides 3 different behaviors of updating dependencies and sub-dependencies,which is given by --update-<strategy> option:

同様に、PDMは依存関係と従属関係を更新する3つの異なる動作も提供しており、これは--update-<strategy>オプションで指定されます。

-reuse:コマンドラインで指定されたものを除き、ロックされたすべての依存関係を保持します(デフォルト)。 -reuse-installed:作業セットにインストールされているバージョンの再利用を試みます。これは、コマンドラインで要求されたパッケージにも影響します。 -eager:コマンドラインで新しいバージョンのパッケージとその再帰的な従属関係をロックし、他の従属関係はそのままにしておきます。 -all:すべての依存関係と従属依存関係を更新します。

Update packages to the versions that break the version specifiers#

-u/--unconstrainedを指定して、PDMにpyproject.tomlのバージョン指定子を無視するように指示することができます。これはyarn upgrade -L/--latestコマンドと同様に機能します。さらに、pdm update--pre/--prereleaseオプションもサポートしています。

Remove existing dependencies#

プロジェクトファイルとライブラリディレクトリから既存の依存関係を削除するには、次の手順に従います。:

1
2
3
4
5
6
# Remove requests from the default dependencies
pdm remove requests
# Remove h11 from the 'web' group of optional-dependencies
pdm remove -G web h11
# Remove pytest-cov from the `test` group of dev-dependencies
pdm remove -dG test pytest-cov

List outdated packages and the latest versions#

Added in version 2.13.0

古いパッケージと最新バージョンを一覧表示するには、次の手順に従います。:

1
pdm outdated

globパターンを渡して、表示するパッケージをフィルタすることができます。:

1
pdm outdated requests* flask*

Select a subset of dependency groups to install#

次のような依存関係を持つプロジェクトがあるとします。:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
[project]  # This is production dependencies
dependencies = ["requests"]

[project.optional-dependencies]  # This is optional dependencies
extra1 = ["flask"]
extra2 = ["django"]

[tool.pdm.dev-dependencies]  # This is dev dependencies
dev1 = ["pytest"]
dev2 = ["mkdocs"]
Command What it does Comments
pdm install install all groups locked in the lockfile
pdm install -G extra1 install prod deps, dev deps, and "extra1" optional group
pdm install -G dev1 install prod deps and only "dev1" dev group
pdm install -G:all install prod deps, dev deps and "extra1", "extra2" optional groups
pdm install -G extra1 -G dev1 install prod deps, "extra1" optional group and only "dev1" dev group
pdm install --prod install prod only
pdm install --prod -G extra1 install prod deps and "extra1" optional
pdm install --prod -G dev1 Fail, --prod can't be given with dev dependencies Leave the --prod option

--prodが渡されず、-Gでdevグループが指定されていない限り、すべての**開発依存関係が含まれます。

さらに、ルートプロジェクトをインストールしたくない場合は、--no-selfオプションを追加し、すべてのパッケージを編集不可能なバージョンでインストールしたい場合は--no-editableを使用できます。

また、pdm lockコマンドをこれらのオプションとともに使用して、ロックファイルの[metadata]テーブルに記録される指定されたグループのみをロックすることもできます。--group/--prod/--dev/--no-defaultオプションが指定されていない場合、pdm syncおよびpdm updateはロックファイル内のグループを使用して動作します。ただし、ロックファイルに含まれていないグループがコマンドの引数として指定された場合、PDMはエラーを発生させます。

Dependency Overrides#

特定のパッケージのどのバージョンもすべての制約を満たさない場合、解決は失敗します。この場合、依存関係のオーバーライドを持つ特定のバージョンのパッケージを使用するようリゾルバに指示できます。

オーバーライドは、パッケージが宣言しているよりも新しいバージョンのパッケージと依存関係に互換性があることをユーザーが知っていても、その互換性を宣言するようにパッケージが更新されていない場合に便利な最後の手段です。

例えば、推移的な依存関係がpydantic>=1.0,<2.0と宣言されていても、ユーザがそのパッケージがpydantic>=2.0と互換性があることを知っている場合、ユーザは宣言された依存関係をpydantic>=2.0,<3でオーバーライドして、リゾルバが継続できるようにすることができます。

PDMでオーバーライドを指定するには、次の2つの方法があります。

In the project file#

Added in version 1.12.0

オーバーライドは、[tool.pdm.resolution.overrides]テーブルの下のpyproject.tomlファイルで指定できます。

1
2
3
4
[tool.pdm.resolution.overrides]
asgiref = "3.2.10"  # exact version
urllib3 = ">=1.26.2"  # version range
pytz = "https://mypypi.org/packages/pytz-2020.9-py3-none-any.whl"  # absolute URL

表の各エントリは、パッケージ名とバージョン指定子です。バージョン指定子には、バージョン範囲、正確なバージョンまたは絶対URLを指定できます。

Via CLI option#

Added in version 2.17.0

PDMでは、要件ファイルからの依存オーバーライドの読み取りもサポートされています。このファイルはpip(--constraint constraints.txt)の拘束ファイルと同様に機能し、構文は要件ファイルと同じです。

1
2
3
4
5
6
7
requests==2.20.0
django==1.11.8
certifi==2018.11.17
chardet==3.0.4
idna==2.7
pytz==2019.3
urllib3==1.23

オーバーライドファイルを使用すると、組織内の複数のプロジェクトで共有できる一元化された場所に依存関係を簡単に保存できます。

pdm installpdm lockpdm addなど、解決を実行するさまざまなPDMコマンドに拘束ファイルを渡すことができます。

1
pdm lock --override constraints.txt

このオプションは複数回指定できます。

オーバーライドファイルは、例えば--override http://example.com/constraints.txtのようなURLで提供することもできます。これにより、組織はリモートサーバにファイルを保存して提供することができます。

Show what packages are installed#

pip listと同様に、packagesディレクトリにインストールされているすべてのパッケージを一覧表示できます。:

1
pdm list

Include and exclude groups#

デフォルトでは、作業セットにインストールされているすべてのパッケージが一覧表示されます。どのグループを一覧表示するかは--include/--excludeオプションで指定でき、includeexcludeよりも優先順位が高くなります。

1
2
pdm list --include dev
pdm list --exclude test

特別なグループ:subがあります。これを含めると、すべての推移的な依存関係も表示されます。これはデフォルトで含まれています。

You can also pass --resolve to pdm list, which will show the packages resolved in pdm.lock, rather than installed in the working set.

--resolvepdm listに渡すこともできます。これにより、作業セットにインストールされているのではなく、pdm.lockで解決されたパッケージが表示されます。

Change the output fields and format#

デフォルトでは、名前、バージョン、場所がリスト出力に表示されます。さらに多くのフィールドを表示したり、--fieldsオプションでフィールドの順序を指定したりできます。

1
pdm list --fields name,licenses,version

For all supported fields, please refer to the CLI reference.

サポートされるすべてのフィールドについては、CLI referenceを参照してください。

また、デフォルトのテーブル出力以外の出力形式を指定することもできます。サポートされている形式とオプションは--csv--json--markdownおよび--freezeです。

Show the dependency tree#

または、次の方法で依存関係ツリーを表示します。:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
$ pdm list --tree
tempenv 0.0.0
└── click 7.0 [ required: <7.0.0,>=6.7 ]
black 19.10b0
├── appdirs 1.4.3 [ required: Any ]
├── attrs 19.3.0 [ required: >=18.1.0 ]
├── click 7.0 [ required: >=6.5 ]
├── pathspec 0.7.0 [ required: <1,>=0.6 ]
├── regex 2020.2.20 [ required: Any ]
├── toml 0.10.0 [ required: >=0.9.4 ]
└── typed-ast 1.4.1 [ required: >=1.4.0 ]
bump2version 1.0.0

--fieldsオプションは--treeでは動作しないことに注意してください。

Filter packages by patterns#

pdm listにパターンを渡すことで、表示するパッケージを制限することもできます。:

1
pdm list flask-* requests-*
Be careful with the shell expansion

ほとんどのシェルでは、現在のディレクトリの下に一致するファイルがある場合、ワイルドカード*が展開されます。予期しない結果を避けるために、パターンを一重引用符で囲むことができます:pdm list'flask-*''requests-*'

--treeモードでは、一致したパッケージのサブツリーのみが表示されます。これは、特定のパッケージが必要な理由を示すpnpm whyと同じ目的を達成するために使用できます。

1
2
3
4
$ pdm list --tree --reverse certifi
certifi 2023.7.22
└── requests 2.31.0 [ requires: >=2017.4.17 ]
    └── cachecontrol[filecache] 0.13.1 [ requires: >=2.16.0 ]

Manage global project#

Sometimes users may want to keep track of the dependencies of global Python interpreter as well.

グローバルPythonインタプリタの依存関係も追跡したい場合があります。PDMでは、ほとんどのサブコマンドでサポートされている-g/--globalオプションを使用して簡単に追跡できます。

このオプションが渡された場合、<CONFIG_ROOT>/global-projectがプロジェクトディレクトリとして使用されます。これは、pyproject.tomlが自動的に作成され、ビルド機能をサポートしないことを除いて、通常のプロジェクトとほとんど同じです。このアイデアはHaskellのstackから引用されている。

ただし、stackとは異なり、デフォルトでは、ローカルプロジェクトが見つからない場合、PDMはグローバルプロジェクトを自動的に使用しません。パッケージが間違った場所に移動するとあまり好ましくないので、ユーザーは明示的に-g/--globalを渡してアクティブにする必要があります。ただし、PDMもユーザーに決定を委ね、configglobal_project.fallbacktrueに設定します。

デフォルトでは、pdmが暗黙的にグローバルプロジェクトを使用する場合、次のメッセージが出力されます:Project is not found, fallback to the global project。このメッセージを無効にするには、configglobal_project.fallback_verbosefalseに設定します。

グローバルプロジェクトで<CONFIG_ROOT>/global-project以外の別のプロジェクトファイルを追跡したい場合は、-p/--project <path>オプションでプロジェクトパスを指定できます。特に--global --project.を渡すと、PDMは現在のプロジェクトの依存関係をグローバルPythonにインストールします。

Warning

グローバルプロジェクトを使用する場合は、removeコマンドとsync --clean/--pureコマンドに注意してください。これは、システムPythonにインストールされているパッケージが削除される可能性があるためです。