Wing 编译快照解析:cloud.Bucket 的 list 行为与 tf-aws Terraform 输出
编程语言编译器云原生语言运行时【免费下载链接】wingA programming language for the cloud ☁️ A unified programming model, combining infrastructure and runtime code into one language ⚡项目地址https://gitcode.com/gh_mirrors/wi/wing点击查看免费下载本文以 Wing 仓库中的编译快照文件bucket_list.test.w_compile_tf-aws.md为主体逐段解读一个cloud.Bucket对象存储示例从 Wing 源码到tf-aws平台 Terraform JSON 的完整编译映射过程你既能看懂快照中每个 Terraform 资源S3 桶、CORS 配置、静态对象是如何由 Wing 代码生成的也能了解 Hangar 测试框架如何自动生成并校验这类快照。读完后你可以独立阅读任意test_corpus下的*_compile_tf-aws.md快照并复现对应的编译流程。快照文件的定位与生成机制快照文件位于 tools/hangar/snapshots/test_corpus/sdk_tests/bucket/bucket_list.test.w_compile_tf-aws.md其文件名遵循 Hangar 工具的固定命名规则源文件.test.w_compile_平台.md即对源程序 tests/sdk_tests/bucket/bucket_list.test.w 执行compile -t tf-aws后把编译产物主要是main.tf.json固化为 Markdown 快照。生成流程可以从源码确认tools/hangar/src/generate_tests.ts 会扫描tests/sdk_tests、tests/valid等目录下的所有.w文件为每个文件生成一个 vitest 测试其中固定包含两条用例wing compile -t tf-aws调用compileTest和wing test -t sim调用testTesttools/hangar/src/generated_test_targets.ts 中的compileTest负责实际执行它先删除旧的target输出目录运行wing compile然后读取target/name.tfaws/main.tf.json经sanitize_json_paths清洗路径后连同.wing目录中的preflight.、inflight.等文件一起通过createMarkdownSnapshot写入本文开头的快照文件对应文件名规则bucket_list.test.w_compile_tf-aws.md。因此快照中只呈现了main.tf.json一个章节说明该程序的编译产物中需要快照的核心内容就是这份 Terraform JSON本例中 sdk_tests 目录的生成配置includeJavaScriptInSnapshots为false不收录 JS 产物。源 Wing 程序preflight 与 inflight 的分工快照对应的源程序 tests/sdk_tests/bucket/bucket_list.test.w 全文如下bring cloud; let b new cloud.Bucket(); b.addObject(file3.txt, Baz); test list { let jsonObj1 Json { key1: value1 }; assert(b.list().length 1); b.putJson(file1.json, jsonObj1); b.put(file2.txt, Bar); b.put(random, Buz); let objs b.list(); let objs2 b.list(file); assert(objs.contains(file1.json)); assert(objs.contains(file2.txt)); assert(objs.contains(file3.txt)); assert(objs.contains(random)); assert(objs2.contains(file1.json)); assert(objs2.contains(file2.txt)); assert(objs2.contains(file3.txt)); assert(!objs2.contains(random)); assert(objs.length 4); assert(objs2.length 3); }程序结构体现了 Wing 的 preflight/inflight 双阶段模型preflight 阶段部署期new cloud.Bucket()在应用树上实例化一个桶构造b.addObject(file3.txt, Baz)声明一个部署时上传的静态对象。这两句会直接影响 Terraform 输出后文逐一映射。inflight 阶段运行/测试期test list { ... }闭包在 Wing 模拟器中执行验证list()与list(file)前缀过滤的语义——先断言桶内只有预置的file3.txt再写入file1.json、file2.txt、random三个对象最后校验全量列举返回 4 个 key、前缀file列举返回 3 个 key 且不含random。inflight 闭包不会生成任何 Terraform 资源这正是快照中看不到put/putJson/list相关资源的原因。list接口的契约定义在 SDK 抽象类 packages/winglang/sdk/src/cloud/bucket.ts 中第 553-559 行/** * Retrieve existing objects keys from the bucket. * param prefix Limits the response to keys that begin with the specified prefix. * returns a list of keys or an empty array if the bucket is empty. * inflight */ list(prefix?: string): Promisestring[];prefix参数将响应限定为以该前缀开头的 key桶为空时返回空数组——与源程序中objs2的行为断言一一对应。在模拟器一侧packages/winglang/sdk/src/target-sim/bucket.inflight.ts 的实现是遍历内存中的_metadata键集合按key.startsWith(prefix)过滤即前缀匹配是纯字符串前缀语义不做路径分段如file也会匹配到filex这类 key。快照中的 main.tf.json 逐段解读快照固化的main.tf.json全文如下完整内容见 快照文件{ //: { metadata: { backend: local, stackName: root }, outputs: {} }, provider: { aws: [ {} ] }, resource: { aws_s3_bucket: { Bucket: { //: { metadata: { path: root/Default/Default/Bucket/Default, uniqueId: Bucket } }, bucket_prefix: bucket-c88fdc5f-, force_destroy: false } }, aws_s3_bucket_cors_configuration: { Bucket_CorsConfiguration-1357ca3a_A4CCA40A: { //: { metadata: { path: root/Default/Default/Bucket/CorsConfiguration-1357ca3a, uniqueId: Bucket_CorsConfiguration-1357ca3a_A4CCA40A } }, bucket: ${aws_s3_bucket.Bucket.id}, cors_rule: [ { allowed_headers: [*], allowed_methods: [GET, POST, PUT, DELETE, HEAD], allowed_origins: [*], expose_headers: [], max_age_seconds: 0 } ] } }, aws_s3_object: { Bucket_S3Object-file3txt_6AB69768: { //: { metadata: { path: root/Default/Default/Bucket/S3Object-file3.txt, uniqueId: Bucket_S3Object-file3txt_6AB69768 } }, bucket: ${aws_s3_bucket.Bucket.bucket}, content: Baz, key: file3.txt } } } }以下按资源逐一映射回 Wing 源码与 SDK 实现。aws_s3_bucket桶本体与默认参数new cloud.Bucket()未传任何构造参数编译为bucket_prefix: bucket-c88fdc5f-Wing 不暴露桶名而是生成bucket-哈希前缀-前缀让 AWS 自动补全随机后缀避免命名冲突force_destroy: false对应 SDK 中 packages/winglang/sdk/src/cloud/bucket.ts 的BucketProps.forceDestroy属性注释标明default false即桶非空时不允许直接销毁。源程序未传参故取默认值。资源上的//注释块是 Wing 编译期注入的构造树元数据path记录该构造在应用树中的完整路径root/Default/Default/Bucket/DefaultuniqueId是编译产物的稳定标识用于跨编译结果的资源追踪。aws_s3_bucket_cors_configuration默认 CORS 规则源程序没有任何addCorsRule调用但快照中出现了 CORS 资源。原因在 SDK 的默认配置常量 packages/winglang/sdk/src/cloud/bucket.tsexport const DEFAULT_BUCKET_CORS_CONFIGURATION: BucketCorsOptions { allowedHeaders: [*], allowedOrigins: [*], allowedMethods: [ HttpMethod.GET, HttpMethod.POST, HttpMethod.PUT, HttpMethod.DELETE, HttpMethod.HEAD, ], exposeHeaders: [], maxAge: Duration.fromSeconds(0), };BucketProps.cors默认值为true见同文件 84 行属性注释因此new cloud.Bucket()会自动附加这条全放行的默认 CORS 规则。快照中cors_rule的字段与常量逐一对应allowed_headers: [*]、allowed_origins: [*]、五种 HTTP 方法、expose_headers: []、max_age_seconds: 0。若希望关闭可在构造时传cors: false若希望自定义则通过corsOptions覆盖。aws_s3_objectaddObject 生成的部署期对象b.addObject(file3.txt, Baz)编译为aws_s3_object: { Bucket_S3Object-file3txt_6AB69768: { bucket: ${aws_s3_bucket.Bucket.bucket}, content: Baz, key: file3.txt } }content与key直接来自addObject(key, body)两个实参bucket字段通过 Terraform 引用${aws_s3_bucket.Bucket.bucket}关联到前面声明的桶。从源码结构看其生成路径是 packages/winglang/platform-awscdk/src/bucket.ts 中的addObject实现AWS CDK 平台上它调用BucketDeployment构造以Source.data(key, body)作为部署源在tf-awscdktf平台上则最终物化为快照中的aws_s3_object资源。同一实现还体现了多次addObject复用同一个BucketDeployment的细节第一次调用创建BucketDeployment后续调用走addSource追加源对象。这里也解释了快照资源数量的边界源程序 inflight 闭包中的putJson/put/list属于运行期操作BucketInflightMethods枚举中定义的LIST、PUT、PUT_JSON等见 packages/winglang/sdk/src/cloud/bucket.ts它们由模拟器的 inflight 客户端执行不产生部署期基础设施因此不会出现在main.tf.json里。如何在本地查看与复现该快照是 Hangar 端到端测试套件的一部分入口说明见 tools/hangar/README.md。若想在本地观察同样的编译产物只需在仓库的 Node 环境就绪后对任意含cloud.Bucket的 Wing 入口文件执行wing compile -t tf-aws输出会落在target/程序名.tfaws/main.tf.json。Hangar 的compileTest正是对每个.w测试文件自动化了这一动作并把main.tf.json经sanitize_json_paths处理见 tools/hangar/src/utils.ts 中的同名工具与.wing目录下的 inflight/preflight 产物固化为快照供后续回归比对一旦 SDK 或平台的默认行为例如默认 CORS、force_destroy取值发生变化对应快照会失效从而在 CI 中显式暴露出这类基础设施语义变更。小结这篇快照以极小的规模完整示范了 Wing 代码即基础设施 的编译映射规则Wing 源码tf-aws 输出语义来源new cloud.Bucket()aws_s3_bucketbucket_prefix、force_destroy: falseBucketProps默认值packages/winglang/sdk/src/cloud/bucket.ts无显式 CORS 配置aws_s3_bucket_cors_configurationDEFAULT_BUCKET_CORS_CONFIGURATION与cors: true默认开启b.addObject(file3.txt, Baz)aws_s3_objectcontent: Baz、key: file3.txtaddObject的 preflight 契约packages/winglang/sdk/src/cloud/bucket.tstest list { ... }闭包无对应资源inflight 行为由模拟器执行packages/winglang/sdk/src/target-sim/bucket.inflight.ts掌握了这套preflight 声明 → Terraform 资源、inflight 调用 → 运行时行为的对应关系后阅读tests/sdk_tests目录下其余 20 余个 bucket 快照如同目录下的put、cors、events等.md快照就只需要关注具体 API 的差异了。赞分享编程语言编译器云原生语言运行时【免费下载链接】wingA programming language for the cloud ☁️ A unified programming model, combining infrastructure and runtime code into one language ⚡项目地址https://gitcode.com/gh_mirrors/wi/wing点击查看免费下载相关推荐Wing 中 cloud.Bucket 如何编译为 AWS Terraform从 Hangar 快照测试 aws-bucket 到 main.tf.json 的完整链路Wing 中 cloud.Bucket 如何编译为 AWS Terraform从 Hangar 快照测试 aws bucket 到 main.tf.json编程语言编译器云原生语言运行时Wing 编译快照解析cloud.Bucket.addObject 如何生成 Terraform S3 资源tf-aws 平台Wing 编译快照解析cloud.Bucket.addObject 如何生成 Terraform S3 资源tf aws 平台 本文以 Wing 仓库中的编程语言编译器云原生语言运行时Wing 的 cloud.Api 在 tf-aws 目标下的编译产物深入解读 aws-api.test.w 的 Terraform 快照Wing 的 cloud.Api 在 tf aws 目标下的编译产物深入解读 aws api.test.w 的 Terraform 快照 Wing 语言把基础编程语言编译器云原生语言运行时创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考