深入 cdk-constructs 构建原理:jsii 多语言支持与 cdkdx 打包完整流程
深入 cdk-constructs 构建原理:jsii 多语言支持与 cdkdx 打包完整流程
【免费下载链接】cdk-constructsA collection of higher-level reusable cdk constructs项目地址: https://gitcode.com/gh_mirrors/cd/cdk-constructs
cdk-constructs 是一个由 26 个高级可复用 CDK 构造(Construct)组成的 Lerna 单仓库项目:源码全部用 TypeScript 编写,通过jsii编译出多语言支持(Python 等),再用cdkdx工具链一键完成构建、测试、打包与发布,最终同时分发到 npm 和 PyPI。本文面向新手,用最少代码带你走通这套「一份源码、多语言发布」的完整构建流程。
项目一览:Lerna 单仓库管理 26 个 Construct
项目根目录用 lerna.json 声明了仓库结构:
useWorkspaces: true+ package.json 中的workspaces同时纳管packages/*(26 个库)与examples/*(21 个示例应用);version: "independent":每个包独立版本号,互不牵连;publish.allowBranch: "master":只允许从 master 分支发布,保证产物可追溯;ignoreChanges忽略__tests__与__fixtures__的变更,测试代码改动不会触发发版。
仓库内置的构造覆盖静态网站、WordPress 部署、CodePipeline 的 Slack 审批、S3 杀毒扫描等高频场景。以cdk-codepipeline-slack为例,它把 CodePipeline 状态变化渲染成 Slack 交互卡片:
配置审批所需的 OAuth 权限时,构造会引导你按下方界面勾选作用域:
jsii 多语言支持:一份 TypeScript 如何变成 Python 包
打开任意一个包的 package.json,都能找到同构的jsii配置块,它是多语言支持的核心:
"jsii": { "outdir": "dist", "tsc": { "outDir": "lib", "rootDir": "src" }, "excludeTypescript": ["src/lambdas", "src/**/__tests__"], "targets": { "python": { "distName": "cloudcomponents.cdk-deletable-bucket", "module": "cloudcomponents.cdk_deletable_bucket" } } }各字段的作用一览:
| 配置 | 含义 |
|---|---|
outdir: dist | jsii-pacmak 生成的各语言产物(含 Python wheel)输出目录 |
tsc.outDir: lib | 编译后的 JS 与类型声明输出到lib/ |
excludeTypescript | Lambda 函数源码和测试不参与 jsii 编译 |
targets.python | 声明 Python 发布名,包名与模块名一一对应 |
jsii 编译时会把整个包编译成一份.jsii程序集文件(JSON 格式的元数据),记录类、方法、属性、类型签名。files: ["lib", ".jsii"]表明这份程序集随包一起发布到 npm——Python 用户pip install后,jsii 运行时就能据此动态生成 Python API,实现「TypeScript 一次编写、多语言调用」。
配合两个细节:externals: ["aws-sdk"]将 AWS SDK 标记为外部依赖(它本身非 jsii 兼容),dependencies与peerDependencies成对声明同一批@aws-cdk/*依赖——这是 jsii 的硬性要求,保证各语言安装时版本一致。
cdkdx 打包流程:build → test → package → release
每个包的scripts都把活交给 cdkdx 这个构建工具(它封装了 jsii、jsii-pacmak、jest、eslint、docgen):
cdkdx build # tsc 编译 + jsii 检查 + 生成 .jsii cdkdx test # jest 单测 + 快照测试 cdkdx lint # eslint 代码规范检查 cdkdx package # jsii-pacmak 生成 Python 等语言产物到 dist/ cdkdx docgen # 从 .jsii 程序集生成 API.md 参考文档 cdkdx release npm / pypi # 分别发布到 npm 与 PyPI在仓库根目录 package.json 中,这些脚本通过lerna run ... --scope @cloudcomponents/*对所有包批量执行:
yarn bootstrap # lerna bootstrap,安装全部工作区依赖 yarn build # 26 个包依次执行 cdkdx build yarn test # cdkdx test 全量测试 yarn package # 生成各语言产物 yarn release:npm # 发布到 npm yarn release:pypi# 发布到 PyPI产物与源码的边界由 .gitignore 清晰划分:lib/、dist/、.jsii、tsconfig.json全部是构建产物,不入库。构建还会顺带生成 API.md 这类参考文档,以及lambda-file-sizes.json——后者由 cdkdx 持续监控 Lambda 打包体积,防止冷启动退化。
最终效果:Python 项目里pip install cloudcomponents.cdk-static-website,TypeScript 项目里npm install @cloudcomponents/cdk-static-website,同一份代码两种用法:
新手上手:最快体验步骤
- 克隆仓库:
git clone https://link.gitcode.com/i/3bd881e7649afa37c6fd4879a95283ad- 根目录执行
yarn && yarn bootstrap安装依赖; yarn build全量构建,yarn test查看 26 个包的快照测试;- 打开 examples/static-website-example,它的 cdk.json 用
cdkdx node src/static-website-app.ts启动应用,可参考其 static-website-stack.ts 学习构造的实际用法。
小结
cdk-constructs 的构建体系可以浓缩为一条链路:Lerna 管仓库 → jsii 定义多语言 ABI → cdkdx 串起编译/测试/打包/文档 → npm 与 PyPI 双渠道发布。理解了这套流程,你也能用同样的方式,把自己团队的 CDK 构造发布成多语言共享库。
【免费下载链接】cdk-constructsA collection of higher-level reusable cdk constructs项目地址: https://gitcode.com/gh_mirrors/cd/cdk-constructs
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
