生命周期和钩子
作为任何 Python 可交付成果,您的项目将经历 Python 项目生命周期的不同阶段,PDM 提供命令来执行这些阶段所期望的任务。
它还提供了附加到这些步骤的钩子,允许:
- 插件监听相同名称的[pdm.signals][pdm.signals]信号。
- 开发人员定义同名的自定义脚本。
此外,在调用任何命令之前,都会发出 pre_invoke
信号,允许插件事先修改项目或选项。
内置命令当前分为 3 组:
您可能需要在安装和发布阶段之间执行一些经常性任务(家务管理、代码检查、测试…), 这就是为什么 PDM 允许您使用 用户脚本 定义自己的任务/阶段。
为了提供完全的灵活性,PDM 允许根据需求跳过一些钩子和任务。
初始化
初始化阶段应在项目生命周期中仅发生一次,通过运行 pdm init
命令来初始化现有项目(提示填写 pyproject.toml
文件)。
它们触发以下钩子:
- [
post_init
][pdm.signals.post_init]
flowchart LR
subgraph pdm-init [pdm init]
direction LR
post-init{{触发 post_init}}
init --> post-init
end
依赖管理
依赖管理对于开发人员能够工作并执行以下操作是必需的:
lock
: 从pyproject.toml
依赖项计算锁定文件。sync
: 从锁定文件同步(添加/删除/更新)PEP582 包,并以可编辑方式安装当前项目。add
: 添加依赖项remove
: 移除依赖项
所有这些步骤都可以直接使用以下命令:
pdm lock
: 执行lock
任务pdm sync
: 执行sync
任务pdm install
: 执行sync
任务,在需要时由lock
前置执行pdm add
: 添加依赖要求,重新锁定然后同步pdm remove
: 移除依赖要求,重新锁定然后同步pdm update
: 从最新版本重新锁定依赖项然后同步
它们触发以下钩子:
- [
pre_install
][pdm.signals.pre_install] - [
post_install
][pdm.signals.post_install] - [
pre_lock
][pdm.signals.pre_lock] - [
post_lock
][pdm.signals.post_lock]
flowchart LR
subgraph pdm-install [pdm install]
direction LR
subgraph pdm-lock [pdm lock]
direction TB
pre-lock{{触发 pre_lock}}
post-lock{{触发 post_lock}}
pre-lock --> lock --> post-lock
end
subgraph pdm-sync [pdm sync]
direction TB
pre-install{{触发 pre_install}}
post-install{{触发 post_install}}
pre-install --> sync --> post-install
end
pdm-lock --> pdm-sync
end
切换 Python 版本
这是依赖管理中的一个特殊情况:
你可以使用 pdm use
切换当前 Python 版本
它将发出带有新 Python 解释器的 [post_use
][pdm.signals.post_use] 信号。
flowchart LR
subgraph pdm-use [pdm use]
direction LR
post-use{{触发 post_use}}
use --> post-use
end
发布
一旦您准备好发布您的包/库,您将需要发布任务:
build
: 构建/编译需要的资产,并将所有内容打包成 Python 包(sdist,wheel)upload
: 将包上传/发布到远程 PyPI 索引
所有这些步骤都可以通过以下命令获得:
它们触发以下钩子:
- [
pre_publish
][pdm.signals.pre_publish] - [
post_publish
][pdm.signals.post_publish] - [
pre_build
][pdm.signals.pre_build] - [
post_build
][pdm.signals.post_build]
flowchart LR
subgraph pdm-publish [pdm publish]
direction LR
pre-publish{{触发 pre_publish}}
post-publish{{触发 post_publish}}
subgraph pdm-build [pdm build]
pre-build{{触发 pre_build}}
post-build{{触发 post_build}}
pre-build --> build --> post-build
end
%% subgraph pdm-upload [pdm upload]
%% pre-upload{{触发 pre_upload}}
%% post-upload{{触发 post_upload}}
%% pre-upload --> upload --> post-upload
%% end
pre-publish --> pdm-build --> upload --> post-publish
end
执行将在第一次失败时停止,包括钩子。
用户脚本
用户脚本在它们自己的部分中有详细说明,但您应该知道:
- 每个用户脚本可以定义一个
pre_*
和post_*
脚本,包括复合脚本。 - 每次
run
执行将触发 [pre_run
][pdm.signals.pre_run] 和 [post_run
][pdm.signals.post_run] 钩子 - 每次脚本执行将触发 [
pre_script
][pdm.signals.pre_script] 和 [post_script
][pdm.signals.post_script] 钩子
给定以下 scripts
定义:
[tool.pdm.scripts]
pre_script = ""
post_script = ""
pre_test = ""
post_test = ""
test = ""
pre_composite = ""
post_composite = ""
composite = {composite = ["test"]}
一个 pdm run test
将具有以下生命周期:
flowchart LR
subgraph pdm-run-test [pdm run test]
direction LR
pre-run{{触发 pre_run}}
post-run{{触发 post_run}}
subgraph run-test [test task]
direction TB
pre-script{{触发 pre_script}}
post-script{{触发 post_script}}
pre-test[执行 pre_test]
post-test[执行 post_test]
test[执行 test]
pre-script --> pre-test --> test --> post-test --> post-script
end
pre-run --> run-test --> post-run
end
而 pdm run composite
将具有以下:
flowchart LR
subgraph pdm-run-composite [pdm run composite]
direction LR
pre-run{{触发 pre_run}}
post-run{{触发 post_run}}
subgraph run-composite [composite task]
direction TB
pre-script-composite{{触发 pre_script}}
post-script-composite{{触发 post_script}}
pre-composite[执行 pre_composite]
post-composite[执行 post_composite]
subgraph run-test [test task]
direction TB
pre-script-test{{触发 pre_script}}
post-script-test{{触发 post_script}}
pre-test[执行 pre_test]
post-test[执行 post_test]
pre-script-test --> pre-test --> test --> post-test --> post-script-test
end
pre-script-composite --> pre-composite --> run-test --> post-composite --> post-script-composite
end
pre-run --> run-composite --> post-run
end
跳过
可以使用 --skip
选项控制任何内置命令以及自定义用户脚本运行的任务和钩子。
它接受一个逗号分隔的钩子/任务名称列表来跳过,
以及预定义的 :all
、:pre
和 :post
快捷方式,
分别跳过所有钩子、所有 pre_*
钩子和所有 post_*
钩子。
您也可以在 PDM_SKIP_HOOKS
环境变量中提供跳过列表,
但一旦提供了 --skip
参数,它将被覆盖。
给定前面的脚本块,运行 pdm run --skip=:pre,post_test composite
将产生以下简化的生命周期:
flowchart LR
subgraph pdm-run-composite [pdm run composite]
direction LR
post-run{{触发 post_run}}
subgraph run-composite [composite task]
direction TB
post-script-composite{{触发 post_script}}
post-composite[执行 post_composite]
subgraph run-test [test task]
direction TB
post-script-test{{触发 post_script}}
test --> post-script-test
end
run-test --> post-composite --> post-script-composite
end
run-composite --> post-run
end