生命周期和钩子
作为任何 Python 可交付成果,您的项目将经历 Python 项目生命周期的不同阶段,PDM 提供命令来执行这些阶段所期望的任务。
它还提供了附加到这些步骤的钩子,允许:
- 插件监听相同名称的[pdm.signals][pdm.signals]信号。
- 开发人员定义同名的自定义脚本。
此外,在调用任何命令之前,都会发出 pre_invoke 信号,允许插件事先修改项目或选项。
内置命令当前分为 3 组:
您可能需要在安装和发布阶段之间执行一些经常性任务(家务管理、代码检查、测试…), 这就是为什么 PDM 允许您使用 用户脚本 定义自己的任务/阶段。
为了提供完全的灵活性,PDM 允许根据需求跳过一些钩子和任务。
初始化
初始化阶段应在项目生命周期中仅发生一次,通过运行 pdm init 命令来初始化现有项目(提示填写 pyproject.toml 文件)。
它们触发以下钩子:
- [
post_init][pdm.signals.post_init]
flowchart LRsubgraph pdm-init [pdm init]direction LRpost-init{{触发 post_init}}init --> post-initend
依赖管理
依赖管理对于开发人员能够工作并执行以下操作是必需的:
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 LRsubgraph pdm-install [pdm install]direction LRsubgraph pdm-lock [pdm lock]direction TBpre-lock{{触发 pre_lock}}post-lock{{触发 post_lock}}pre-lock --> lock --> post-lockendsubgraph pdm-sync [pdm sync]direction TBpre-install{{触发 pre_install}}post-install{{触发 post_install}}pre-install --> sync --> post-installendpdm-lock --> pdm-syncend
切换 Python 版本
这是依赖管理中的一个特殊情况:
你可以使用 pdm use 切换当前 Python 版本
它将发出带有新 Python 解释器的 [post_use][pdm.signals.post_use] 信号。
flowchart LRsubgraph pdm-use [pdm use]direction LRpost-use{{触发 post_use}}use --> post-useend
发布
一旦您准备好发布您的包/库,您将需要发布任务:
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 LRsubgraph pdm-publish [pdm publish]direction LRpre-publish{{触发 pre_publish}}post-publish{{触发 post_publish}}subgraph pdm-build [pdm build]pre-build{{触发 pre_build}}post-build{{触发 post_build}}pre-build --> build --> post-buildend%% subgraph pdm-upload [pdm upload]%% pre-upload{{触发 pre_upload}}%% post-upload{{触发 post_upload}}%% pre-upload --> upload --> post-upload%% endpre-publish --> pdm-build --> upload --> post-publishend
执行将在第一次失败时停止,包括钩子。
用户脚本
用户脚本在它们自己的部分中有详细说明,但您应该知道:
- 每个用户脚本可以定义一个
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 LRsubgraph pdm-run-test [pdm run test]direction LRpre-run{{触发 pre_run}}post-run{{触发 post_run}}subgraph run-test [test task]direction TBpre-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-scriptendpre-run --> run-test --> post-runend
而 pdm run composite 将具有以下:
flowchart LRsubgraph pdm-run-composite [pdm run composite]direction LRpre-run{{触发 pre_run}}post-run{{触发 post_run}}subgraph run-composite [composite task]direction TBpre-script-composite{{触发 pre_script}}post-script-composite{{触发 post_script}}pre-composite[执行 pre_composite]post-composite[执行 post_composite]subgraph run-test [test task]direction TBpre-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-testendpre-script-composite --> pre-composite --> run-test --> post-composite --> post-script-compositeendpre-run --> run-composite --> post-runend
跳过
可以使用 --skip 选项控制任何内置命令以及自定义用户脚本运行的任务和钩子。
它接受一个逗号分隔的钩子/任务名称列表来跳过,
以及预定义的 :all、:pre 和 :post 快捷方式,
分别跳过所有钩子、所有 pre_* 钩子和所有 post_* 钩子。
您也可以在 PDM_SKIP_HOOKS 环境变量中提供跳过列表,
但一旦提供了 --skip 参数,它将被覆盖。
给定前面的脚本块,运行 pdm run --skip=:pre,post_test composite 将产生以下简化的生命周期:
flowchart LRsubgraph pdm-run-composite [pdm run composite]direction LRpost-run{{触发 post_run}}subgraph run-composite [composite task]direction TBpost-script-composite{{触发 post_script}}post-composite[执行 post_composite]subgraph run-test [test task]direction TBpost-script-test{{触发 post_script}}test --> post-script-testendrun-test --> post-composite --> post-script-compositeendrun-composite --> post-runend
