-installed`: 尝试重用工作集中已安装的版本。这也会影响命令行中请求的包

  • eager: 尝试锁定命令行中包及其递归子依赖项的更新版本,并保留其他依赖项不变。
  • all: 更新所有依赖项和子依赖项。

更新包到违反版本规范符的版本

可以给 PDM 一个 -u/--unconstrained 选项,让它忽略 pyproject.toml 中的版本规范符。 这类似于 yarn upgrade -L/--latest 命令。此外, pdm update 也支持 --pre/--prerelease 选项。

删除现有依赖

从项目文件和库目录中删除现有依赖:

  1. # 从默认依赖中删除 requests
  2. pdm remove requests
  3. # 从可选依赖的 'web' 组中删除 h11
  4. pdm remove -G web h11
  5. # 从开发依赖的 `test` 组中删除 pytest-cov
  6. pdm remove -dG test pytest-cov

列出过时的包和最新版本

+++ 2.13.0

列出过时的包和最新版本:

  1. pdm outdated

你可以传递全局模式来过滤要显示的包:

  1. pdm outdated requests* flask*

选择要安装的依赖组的一个子集

假设我们有一个包含以下依赖的项目:

  1. [project] # 这是生产依赖
  2. dependencies = ["requests"]
  3. [project.optional-dependencies] # 这是可选依赖
  4. extra1 = ["flask"]
  5. extra2 = ["django"]
  6. [tool.pdm.dev-dependencies] # 这是开发依赖
  7. dev1 = ["pytest"]
  8. dev2 = ["mkdocs"]
命令 它的作用 注释
pdm install 安装锁文件中锁定的所有组
pdm install -G extra1 安装生产依赖、开发依赖和 “extra1” 可选组
pdm install -G dev1 仅安装 “dev1” 开发组
pdm install -G:all 安装生产依赖、开发依赖和 “extra1”、”extra2” 可选组
pdm install -G extra1 -G dev1 安装生产依赖、”extra1” 可选组和仅 “dev1” 开发组
pdm install --prod 仅安装生产环境
pdm install --prod -G extra1 安装生产依赖和 “extra1” 可选
pdm install --prod -G dev1 失败,--prod 不能与开发依赖一起使用 留下 --prod 选项

只要没有传递 --prod 并且 -G 没有指定任何开发组,所有 开发依赖就会被包括在内。

此外,如果你不希望根项目被安装,可以添加 --no-self 选项,而 --no-editable 可以在你希望所有包都以非可编辑版本安装时使用。

你也可以使用 pdm lock 命令与这些选项一起锁定仅指定的组,这将记录在锁文件的 [metadata] 表中。如果没有指定 --group/--prod/--dev/--no-default 选项,pdm syncpdm update 将使用锁文件中的组进行操作。然而,如果命令中给出了锁文件中未包含的任何组,PDM 将引发错误。

显示已安装的包

类似于 pip list,你可以列出在包目录中安装的所有包:

  1. pdm list

包括和排除组

默认情况下,将列出工作集中安装的所有包。你可以通过 --include/--exclude 选项指定要列出哪些组, 并且 include 的优先级高于 exclude

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

有一个特殊的组 :sub,当它被包括时,也会显示所有间接依赖。默认情况下它是被包括的。

你也可以传递 --resolvepdm list,它将显示在 pdm.lock 中解析的包,而不是安装在工作集中的包。

更改输出字段和格式

默认情况下,列表输出将显示名称、许可证和位置,你可以通过 --fields 选项查看更多字段或指定字段的顺序:

  1. pdm list --fields name,licenses,version

有关所有支持的字段,请参阅 CLI 参考

此外,你可以指定除默认表格输出之外的输出格式。支持的格式和选项有 --csv--json--markdown--freeze

显示依赖树

或者通过以下命令显示依赖树:

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

注意 --fields 选项不适用于 --tree

按模式过滤包

你也可以通过向 pdm list 传递模式来限制要显示的包:

  1. pdm list flask-* requests-*

??? 警告 “注意 shell 扩展” 在大多数 shell 中,通配符 * 会在当前目录下有匹配文件时被扩展。 为了避免得到意想不到的结果,你可以用单引号包装模式:pdm list 'flask-*' 'requests-*'

--tree 模式下,仅会显示匹配包的子树。这可以用来达到与 pnpm why 相同的目的,即显示特定包为何需要。

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

管理全局项目

有时用户可能想要跟踪全局 Python 解释器的依赖项。 使用 PDM 通过大多数子命令支持的 -g/--global 选项,可以很容易地做到这一点。

如果传递了该选项,<CONFIG_ROOT>/global-project 将被用作项目目录,它几乎与普通项目相同,只是 pyproject.toml 会为你自动创建 并且它不支持构建特性。这个想法来自 Haskell 的 stack

然而,与 stack 不同,PDM 默认情况下如果找不到本地项目,不会自动使用全局项目。 用户应该明确传递 -g/--global 来激活它,因为如果包进入了错误的地方,这是不太令人愉快的。 但 PDM 也把决定权留给用户,只需将配置 global_project.fallback 设置为 true

默认情况下,当 pdm 隐式使用全局项目时,会打印以下消息:Project is not found, fallback to the global project。 要禁用此消息,将配置 global_project.fallback_verbose 设置为 false

如果你想让全局项目跟踪另一个项目文件,而不是 <CONFIG_ROOT>/global-project, 你可以通过 -p/--project <path> 选项提供项目路径。 特别是如果你传递 --global --project ., PDM 将把当前项目的依赖项安装到全局 Python 中。

警告 当使用全局项目时,要小心使用 removesync --clean/--pure 命令,因为它可能会移除在系统 Python 中安装的包。