生命周期和钩子
与任何 Python deliverable 一样,您的项目将经历 Python 项目生命周期的不同阶段,PDM 提供命令来执行这些阶段的预期任务。
它还提供了附加到这些步骤的钩子,允许:
内置命令目前分为 3 组:
您很可能需要在安装和发布阶段之间执行一些循环任务(内务管理、检测、测试……),这就是为什么 PDM 允许您使用用户脚本定义自己的任务/阶段。
为了提供充分的灵活性,PDM 允许按需跳过一些挂钩和任务。
初始化
初始化阶段应该在项目生命周期中只发生一次,通过运行 pdm init
命令来初始化现有项目(提示填充 pyproject.toml
文件)。
它们会触发以下钩子:
flowchart LR
subgraph pdm-init [pdm init]
direction LR
post-init{{Emit post_init}}
init --> post-init
end
依赖管理
依赖关系管理是开发人员能够工作和执行以下工作所必需的:
所有这些步骤都可以直接使用以下命令:
pdm lock
: execute the lock
task
pdm sync
: execute the sync
task
pdm install
: execute the sync
task, preceded from lock
if required
pdm add
: add a dependency requirement, re-lock and then sync
pdm remove
: remove a dependency requirement, re-lock and then sync
pdm update
: re-lock dependencies from their latest versions and then sync
会触发如下钩子:
flowchart LR
subgraph pdm-install [pdm install]
direction LR
subgraph pdm-lock [pdm lock]
direction TB
pre-lock{{Emit pre_lock}}
post-lock{{Emit post_lock}}
pre-lock --> lock --> post-lock
end
subgraph pdm-sync [pdm sync]
direction TB
pre-install{{Emit pre_install}}
post-install{{Emit post_install}}
pre-install --> sync --> post-install
end
pdm-lock --> pdm-sync
end
切换 Python 版本
这是依赖项管理中的特殊情况:您可以使用 pdm use
切换当前 Python 版本,它将使用新的 Python 解释器发出 post_use
信号。
flowchart LR
subgraph pdm-use [pdm use]
direction LR
post-use{{Emit post_use}}
use --> post-use
end
发布
一旦准备好发布的包/库,将需要发布任务:
会触发:
flowchart LR
subgraph pdm-publish [pdm publish]
direction LR
pre-publish{{Emit pre_publish}}
post-publish{{Emit post_publish}}
subgraph pdm-build [pdm build]
pre-build{{Emit pre_build}}
post-build{{Emit post_build}}
pre-build --> build --> post-build
end
%% subgraph pdm-upload [pdm upload]
%% pre-upload{{Emit pre_upload}}
%% post-upload{{Emit post_upload}}
%% pre-upload --> upload --> post-upload
%% end
pre-publish --> pdm-build --> upload --> post-publish
end
执行将在第一次失败时停止,包括钩子。
用户脚本
用户脚本 部分中有详细说明,但你应该知道:
给定以下 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{{Emit pre_run}}
post-run{{Emit post_run}}
subgraph run-test [test task]
direction TB
pre-script{{Emit pre_script}}
post-script{{Emit post_script}}
pre-test[Execute pre_test]
post-test[Execute post_test]
test[Execute 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{{Emit pre_run}}
post-run{{Emit post_run}}
subgraph run-composite [composite task]
direction TB
pre-script-composite{{Emit pre_script}}
post-script-composite{{Emit post_script}}
pre-composite[Execute pre_composite]
post-composite[Execute post_composite]
subgraph run-test [test task]
direction TB
pre-script-test{{Emit pre_script}}
post-script-test{{Emit post_script}}
pre-test[Execute pre_test]
post-test[Execute 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{{Emit post_run}}
subgraph run-composite [composite task]
direction TB
post-script-composite{{Emit post_script}}
post-composite[Execute post_composite]
subgraph run-test [test task]
direction TB
post-script-test{{Emit post_script}}
test --> post-script-test
end
run-test --> post-composite --> post-script-composite
end
run-composite --> post-run
end