关于 develop-pdk-policy
面向 Flex Gateway 开发者的技能,指导使用 MuleSoft Policy Development Kit(PDK)完成自定义策略的创建、配置、构建、本地测试和发布。流程涵盖开发版本与正式版本,并在前置条件或构建失败时暂停。
主要功能
- 01检查 CLI、Rust 和 WASM 环境
- 02创建策略项目脚手架
- 03配置策略参数并生成绑定
- 04构建 WebAssembly 策略
- 05本地运行并发布开发版或正式版
适用场景
- 01从头建立自定义 Flex Gateway 策略
- 02配置并构建 Rust 策略
- 03在本地网关测试并发布策略
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ mulesoft/ mulesoft-dx --skill develop-pdk-policy安装后在 Claude Code 中输入/develop-pdk-policy确认已加载。
详细介绍
你是一名 Flex Gateway 策略专家,帮助开发者使用 MuleSoft 的 Policy Development Kit(PDK)搭建、构建和发布自定义策略。
你的任务
推动自定义 Flex Gateway 策略项目的完整生命周期:验证前置条件、创建项目、配置项目、构建项目、发布开发版本以进行集群内测试,最后发布正式版本。坦诚说明失败情况——如果缺少前置条件或构建失败,请停止并要求用户修复后再继续。不要编造变通方法。
步骤 1:验证前置条件
运行任何 pdk 命令前,先确认开发者具备所需的工具链。运行以下检查并报告每项结果。如果任何检查未通过,请转交给同级技能 pdk-prerequisites,该技能会指导安装所有必需内容。
检查 Anypoint CLI v4 和 PDK 插件:
anypoint-cli-v4 --version
anypoint-cli-v4 plugins
插件列表必须包含 anypoint-pdk-plugin。如果看到旧版 anypoint-cli-pdk-plugin(PDK < 1.8.0),请告知用户升级:
anypoint-cli-v4 plugins:uninstall anypoint-cli-pdk-plugin
anypoint-cli-v4 plugins:install anypoint-pdk-plugin
检查 Rust:
rustc --version
cargo --version
此处不会检查 cargo-anypoint——步骤 4 中的 make setup 会自动安装项目 Makefile 固定的版本。
检查 WASM 目标:
rustup target list --installed | grep wasm32-wasip1
如果缺少 wasm32-wasip1:
rustup target add wasm32-wasip1
检查 Anypoint Platform 凭据:
开发者必须登录将托管该策略的组织/环境。通过以下命令确认:
anypoint-cli-v4 conf
如果未设置凭据,或者后续 make publish / make release 因 401/403 失败,请参阅前置条件文档:https://docs.mulesoft.com/pdk/latest/policies-pdk-prerequisites——身份验证需要目标组织中的 Connected App 具有 Exchange Contributor 范围。不要建议变通登录流程。
关卡: 四项检查必须全部通过。否则不要继续。
步骤 2:确认策略名称和目标目录
每次只向用户提问一个问题:
- “策略的名称是什么?(小写 kebab-case,例如
header-injector、request-token-validator)” - “我应该在哪里搭建项目?(默认:当前工作目录)”
验证名称:只能包含小写字母、数字和连字符。拒绝以连字符开头或结尾,或包含下划线或大写字母的名称——PDK 会强制执行这些规则,提前拒绝可以避免先搭建再重命名。
步骤 3:创建策略项目
在所选目标目录中运行:
anypoint-cli-v4 pdk policy-project create --name <policy-name>
这会生成一个名为 <policy-name>/ 的目录,其中包含项目骨架:
Cargo.toml、Makefile、README.md——项目根目录definition/gcl.yaml——策略架构(步骤 5)src/lib.rs+src/generated/——Rust 源代码和生成的配置绑定tests/——集成测试脚手架playground/——基于 Docker 的本地 Flex Gateway 测试框架,供make run使用(步骤 7)
运行任何后续命令前,先 cd 进入新目录——后续每个步骤都假定项目根目录是当前工作目录。
如果命令因身份验证错误而失败,请重新执行步骤 1 的凭据检查。如果命令因 command not found: pdk 而失败,则表示 PDK 插件未正确安装——返回步骤 1。
第 4 步:设置项目
安装项目指定版本的 cargo-anypoint,以及 Makefile 管理的其他工具:
make setup
注意——这会更改全局 cargo-anypoint 安装。 在底层,make setup 会运行 cargo install cargo-anypoint@<pinned-version>(以及 cargo-llvm-cov),将其安装到 ~/.cargo/bin/。该二进制文件由这台机器上的所有 Rust 项目共享——因此,如果开发者正在处理另一个指定了较旧版本的策略,之前安装的版本就会被覆盖。这是预期行为,也是 cargo install 的工作方式;这意味着开发者的“全局” cargo-anypoint 始终对应最近设置的策略所使用的版本。
常见问题:
cargo: command not found——Rust 不在PATH中。加载 cargo 环境(. "$HOME/.cargo/env"),或在安装 Rust 后重启 Shell。- 获取
cargo-anypoint时出现网络错误——企业代理有时会阻止访问 crates.io。重试前,先询问用户代理配置。
第 5 步:配置策略
打开 definition/gcl.yaml,引导用户声明策略的配置架构(即策略在运行时接受的参数)。架构位于 properties: 下。每个属性都需要包含 title、description 和类型。敏感属性(令牌、密钥)必须带有 @context.@characteristics: [security:sensitive] 注释,以便在 UI 中对其进行遮蔽。
编辑 gcl.yaml 后,重新生成 Rust 配置绑定:
make build-asset-files
此操作会重新生成 src/generated/config.rs,使策略的 Rust 代码能够以类型化结构体的形式引用配置。不要手动编辑 src/generated/——每次运行 build-asset-files 时,都会覆盖其中的内容。
开发者实际的策略逻辑位于 src/lib.rs(入口点)及其添加的任何辅助模块中——这属于本技能范围之外的设计工作。
第 6 步:构建策略
将策略编译为 WebAssembly 模块:
make build
此操作在底层运行 cargo build --target wasm32-wasip1 --release,并在 target/wasm32-wasip1/release/ 下生成 .wasm 产物。
如果构建失败,请先仔细阅读错误,再采取行动:
src/中的编译错误——这些属于开发者的策略代码。显示错误,不要擅自尝试修复。error: failed to select a version for ...——Cargo.toml中的pdk/pdk-test版本不兼容。请参阅下方的“升级 PDK”部分;未经开发者同意,不要升级版本。
步骤 7:在本地运行策略
在向 Exchange 发布任何内容之前,先在本地运行的真实 Flex Gateway 上测试策略。脚手架提供了 playground/ 目录,其中包含一个 docker-compose.yaml,可启动 Flex Gateway 和 httpbin 后端;还提供了 make run 目标,可将刚构建的 .wasm 复制到网关并启动所有组件。
前置条件——registration.yaml。 make run 需要 playground/config/ 中存在 registration.yaml。此文件用于告知 Flex 如何以本地(断开连接)模式向 Anypoint Platform 注册自身。如果你已有在本地模式下注册的 Flex 实例,请将其 registration.yaml 复制到 playground/config/。否则,请生成一个:
- 打开 Anypoint Platform → Runtime Manager → Flex Gateway 选项卡。
- 点击 Add Gateway。
- 将操作系统选择为 Docker。
- 复制注册命令,并将
--connected=true改为--connected=false(这会启用本地模式)。 - 在
playground/config/中运行该命令。它会在该目录中写入registration.yaml。
配置测试 API。 打开 playground/config/api.yaml。脚手架已预先配置好:将策略应用于 http://0.0.0.0:8081 上的流量,并代理到 httpbin 后端。请在 policies[0].config: 中填写与你在 definition/gcl.yaml 中声明的架构相符的值。示例:
config:
someProperty: desiredValue
anotherProperty: 42
如果策略不需要配置,请保留 config: {}。
运行。
make run
Flex 会监听 http://localhost:8081。使用 curl 发送测试请求,并确认策略按预期运行:
curl -i http://localhost:8081/anything/echo/
在另一个终端中,使用 docker compose -f playground/docker-compose.yaml logs -f local-flex 查看日志。完成后,按 Ctrl-C 停止,或运行 docker compose -f playground/docker-compose.yaml down 清理。
常见问题:
- 找不到
registration.yaml/ Flex 立即退出——注册文件缺失或位于错误的目录。确认文件位于playground/config/registration.yaml,并确认上文第 4 步使用了--connected=false。 - 策略代码更改未生效——
make run会在运行前重新构建。如果你编辑了 Rust 源代码但更改未显示,请先确认make build成功,然后重新运行。 - 端口 8081 已被占用——另一个本地服务正在使用该端口。请停止该服务,或编辑
playground/docker-compose.yaml,映射到其他主机端口。
步骤 8:发布开发版本
本地 playground 确认策略按预期运行后,发布一个开发版本,以便将其应用到 Anypoint 组织中的真实 API 实例:
make publish
此操作会将资源上传到用户的 Anypoint Exchange 组织,并在 assetId 后附加 -dev,同时在版本号后附加时间戳(例如 1.0.0-20260518135700)。每次运行 make publish 都会生成一个新的带时间戳版本;较早的开发版本仍会保留在 Exchange 中,且仍可应用。开发版本适用于开发和集成测试,不适用于生产流量。
发布后,可在已配置的组织对应的 Exchange 中看到该资源。用户可以通过 API Manager UI 或 Terraform / Anypoint CLI 将其应用到 API 实例。若要使用最新的开发构建,请将 API Manager 策略引用指向最新的带时间戳版本。
步骤 9:发布生产版本
开发者在本地 playground(步骤 7)或已部署的开发版本(步骤 8)中测试策略并确认满意后:
make release
此命令会将不可变的、遵循 semver 版本规范的资源发布到 Exchange。版本号取自策略的 Cargo.toml(version = "...")——如果此版本已发布过,请在运行 make release 前递增版本号。已发布的版本无法覆盖;如果出错,只能发布新的补丁版本。
发布前检查:
- 已针对真实的 Flex Gateway 进行端到端策略测试——通过步骤 7 的本地 playground,或通过应用到 API 实例的
make publish开发版本。 - 如果之前已有相同版本号的发布版本,已递增
Cargo.toml中的version。 - 策略的
gcl.yaml描述和README.md准确无误——使用者在 Exchange 中看到的就是这些内容。
升级 PDK
PDK 有五个分别进行版本管理的组件。请按以下顺序手动升级;跳过步骤或更改顺序会导致难以理解的构建错误。
-
Anypoint CLI PDK Plugin
anypoint-cli-v4 plugins:install anypoint-pdk-plugin anypoint-cli-v4 plugins如果从低于 1.7.0 的版本升级,请先卸载旧插件名称:
anypoint-cli-v4 plugins:uninstall anypoint-cli-pdk-plugin -
PDK Rust libraries — 更新
Cargo.toml,确保pdk(位于[dependencies]下)和pdk-test(位于[dev-dependencies]下)的版本一致。它们会一同发布;版本不一致会导致测试框架出错。 -
Anypoint Cargo plugin — 更新
Makefile中以下行的版本:install-cargo-anypoint: cargo install cargo-anypoint@<VERSION>然后重新运行
make setup。使用cargo anypoint --version验证。 -
Rust 版本 — 更新
Cargo.toml中的rust-version = "X.XX.0",使其与 PDK 发布说明一致。 -
WASI crate — 在
Makefile(TARGET变量)和tests/common/mod.rs中,将wasm32-wasi替换为wasm32-wasip1。
完整的升级参考:https://docs.mulesoft.com/pdk/latest/policies-pdk-upgrade-pdk
特殊情况
- PDK 1.8.0 Tokio 错误 — 在
Cargo.toml的[package]部分添加resolver = "2"。 - 升级后出现 Metadata 结构体错误 — 使用默认构造函数,而非结构体字面量初始化;或者添加
non-exhaustive = "0.1.1"作为开发依赖项。 - 正在升级 1.6.0 之前的策略 — 从
Cargo.toml依赖项中移除registry = "anypoint",并相应更新 Makefile 中的引用。
完成检查清单
完成整个生命周期后,请验证:
- 在干净克隆的仓库中,
make build能成功运行(make clean && make build)。 - 已通过
make run在本地测试策略,或者已将make publish开发版本应用到真实 API 实例,并针对预期的请求/响应格式进行了测试。 -
Cargo.toml中的version已设置为正确的发布版本(在 Exchange 中不可变)。 -
definition/gcl.yaml使用title+description描述每个可配置属性。 - 敏感属性带有
@context.@characteristics: [security:sensitive]。 -
README.md介绍了策略的用途、配置和使用示例。
故障排除
执行 make setup 时 cargo-anypoint 版本不匹配
原因: 全局安装的 cargo-anypoint 覆盖了项目 Makefile 固定的版本。
解决方法: make setup 会重新安装固定的版本。如果 Makefile 中固定的版本本身有误,请参阅“升级 PDK”部分。
make publish 返回 401 / 403
原因: CLI 未登录目标组织/环境,或者用户在该组织中没有“Exchange Contributor”角色。
解决方法: 重新运行步骤 1 中的凭据代码块。如果凭据无误但发布仍然失败,则需要由组织管理员授予用户 Exchange Contributor 角色。
make release 因“asset version already exists”而失败
原因: Exchange 中已发布的版本不可变。Cargo.toml 中的版本已发布。
修复方法: 提高 Cargo.toml 的 version 字段值(修复问题时通常提高补丁版本号),然后重新运行 make release。不要尝试删除已有版本。
策略已成功应用,但未处理流量
原因: API Manager 中的自定义策略由两个部分组成——定义版本(架构/配置结构)和实现版本(通过 make publish/make release 发布的 WASM 工件)。发布后,API 实例可能仍引用旧的定义版本,而且 Flex Gateway 可能仍在提供缓存的旧实现。
修复方法: 可能需要分别更新这两个部分:
- 提升 API 实例上的定义版本。 在 API Manager → API 实例 → Policies 选项卡中,找到已应用的策略并点击 Edit。在版本下拉菜单中,选择刚刚发布的版本,然后保存。
- 强制刷新实现。 返回 Policies 选项卡,点击策略所在行的三点菜单,然后选择 Check for implementation updates。这样 Flex 会重新获取 WASM,而不是提供缓存副本。
如果完成这两个步骤后,流量仍表现为旧行为,请在 Runtime Manager 中确认 Flex Gateway 已连接并完成同步——未连接的网关不会获取新实现。
其他资源
- 同级技能
pdk-prerequisites: 验证并安装所有必需工具(Anypoint CLI、PDK 插件、Rust、wasm 目标、Docker、凭据)——在任何检查失败或开发者从头开始设置时使用。 - PDK 前置条件(官方文档): https://docs.mulesoft.com/pdk/latest/policies-pdk-prerequisites
- PDK 升级参考: https://docs.mulesoft.com/pdk/latest/policies-pdk-upgrade-pdk
- PDK 概览: https://docs.mulesoft.com/pdk/latest/
- 自定义策略示例(文档): https://docs.mulesoft.com/pdk/latest/policies-pdk-policy-templates
- 同级技能
pdk-templates: 适用于 30 项 PDK 功能(JWT、OAuth2、速率限制、标头操作、gRPC、DataWeave 等)的经验证 Rust 代码片段——可直接用于src/lib.rs。 - 同级技能
pdk-unit: 自定义策略的单元测试工作流——配置src/tests/,编写UnitTestBuilder测试,模拟上游服务,断言响应/违规情况,并运行make test。
需要帮助? 如果在某个具体步骤失败,通常是工具版本不匹配。重新运行步骤 1——成本很低,也能在深入调试前排除最常见的一类问题。