Wing 语言本地模块导入实战:`bring “./file.w“` 语法、编译产物与 Hangar 测试快照验证
编程语言编译器云原生语言运行时【免费下载链接】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 语言The Wing Programming Language本仓库为 wing 的镜像仓库的本地模块导入机制展开以仓库测试套件 Hangar 生成的 bring_local.test.w_test_sim.md 快照为核心线索结合测试源码 bring_local.test.w 与对应编译快照 bring_local.test.w_compile_tf-aws.md讲解如何在 Wing 中通过bring引入同项目内的.w文件模块、跨文件复用 class/struct/enum/interface 等类型并剖析wing test在 sim 平台上的执行与快照生成原理。读完本文你将掌握 Wing 本地模块的导入语法、可见性规则、extern与子模块的使用方式以及如何阅读和验证 Hangar 测试快照。一、快照文档是什么一条测试通过记录bring_local.test.w_test_sim.md是 Hangar 测试工具链为tests/valid/bring_local.test.w生成的sim 平台测试快照其正文只有一段stdout.logpass ─ bring_local.test.wsim » root/Default/test:add data to store pass ─ bring_local.test.wsim » root/Default/test:greet Tests 2 passed (2) Snapshots 1 skipped Test Files 1 passed (1) Duration DURATION这短短几行输出揭示了三个关键信息文件命名规范*.test.w是 Wing 的入口测试文件详见 generated_test_targets.ts 中的isEntrypointFile判定*.test.w、*.main.w、main.w均被视为入口文件只有入口文件才允许包含test块_test_sim表示测试目标为sim模拟器平台与此对应的编译目标为_compile_tf-aws。测试用例该文件定义了test:add data to store与test:greet两个用例root/Default/是 Wing 应用树application tree中测试资源std.Test在模拟器中的构造路径。结果摘要Tests 2 passed (2)表明两个测试全部通过Snapshots 1 skipped说明该快照未做其他快照比对Duration DURATION是 Hangar 在生成快照时对运行时长的脱敏占位符。二、测试源码全景本地模块导入的典型用法快照背后的被测程序是 bring_local.test.w其开头集中展示了 Wing 本地模块导入的几种形态bring ./store.w as file1; bring ./subdir/subfile.w as file2; bring ./subdir/empty.w as file3; bring math; bring expect;bring ./store.w as file1;以相对路径导入同目录下的.w文件并以file1作为命名空间别名。这是 Wing 本地模块导入的核心语法路径相对于当前文件解析扩展名.w可以省略。bring ./subdir/subfile.w as file2;支持导入子目录中的文件说明模块可以是任意层级的相对路径。bring ./subdir/empty.w as file3;即使目标文件是空文件empty.w 内容为空也能正常导入空模块是合法模块。bring math;、bring expect;导入内置标准库模块math、expect不需要路径。依据官方语言参考 05-language-reference.md 的 Module System 章节bring表达式只允许出现在文件顶部、任何其他代码之前注释除外并且是 Wing 中唯一允许跨文件导入函数、类与变量的语法。本地文件导入的具体写法为bring ./my-module.w as myModule;同时支持以目录为模块导入——模块将包含该目录下所有文件中公开的类型子目录则按对应名称暴露bring ./my-module as myModule; new myModule.submodule.MyClass(); // 来自 ./my-module/submodule/my-class.w三、跨文件复用class、struct、enum、interface 与同名类bring_local.test.w的剩余部分逐一验证了本地模块导入后可以复用的类型3.1 实例化其他文件的类let store new file1.Store(); let q new file2.Q(); expect.equal(file2.Q.preflightGreet(foo), Hello foo);file1.Store来自 store.w 中定义的pub class Store其构造器内部创建了一个cloud.Bucket并通过cloud.OnDeploy在部署时写入初始化数据file2.Q来自 subfile.w静态方法preflightGreet由extern实现。3.2 其他文件的 struct、enum、interfacelet s file1.Point { x: 1, y: 2 }; // struct let c file1.Color.BLUE; // enum assert(c ! file1.Color.RED); class Triangle impl file1.Shape { // interface pub area(): num { return 1; } }对应地store.w 用pub声明了enum ColorRED/GREEN/BLUE、struct Pointx: num; y: num;和interface Shapearea(): num;。这里验证了本地模块可以完整导出枚举、结构体与接口且接口可以被入口文件中的类实现——这是 Wing 类型系统中模块间交互的重要能力。3.3 同名类的隔离// classes can have the same name as classes in other modules class Util {}store.w 中同样定义了pub class Util而入口文件也定义了class Util。由于模块以命名空间file1隔离二者互不冲突。编译快照印证了这一点bring_local.test.w_compile_tf-aws.md 中入口文件的Util定义在preflight.cjs内而 store.w 的Util则位于独立的preflight.store-2.cjs产物中。3.4 extern用 TypeScript 实现本地模块方法file2.Q所在的 subfile.w 展示了extern修饰符的用法bring math; pub class Q { pub extern ./util.ts static inflight greet(name: str): str; pub extern ./util.ts static preflightGreet(name: str): str; }extern javascript module path可挂载到类的方法声明上指示该方法由相对路径的 JavaScript/TypeScript 模块实现语言参考见 05-language-reference.md。实现文件 util.ts 通过util.extern类型声明保证与 Wing 侧签名一致import type extern from ./util.extern; export const greet: extern[greet] async (name) { return Hello name; } export const preflightGreet: extern[preflightGreet] (name) { return Hello name; }编译快照中的 inflight.Q-2.cjs 显示该方法最终被编译为require(../../../subdir/util.ts)greet的调用即运行时通过 Node 的require加载外部 TS 模块。四、测试用例与编译产物从 Wing 源码到可执行代码4.1 两个测试用例test add data to store { store.store(foo); } test greet { expect.equal(file2.Q.greet(bar), Hello bar); }add data to store在 inflight 环境调用store.store(foo)将数据写入 Store 内部的 Bucket。greet调用file2.Q.greet(bar)extern 实现的 inflight 静态方法并用expect.equal断言结果为Hello bar。4.2 inflight 闭包的编译结果测试块会被编译为 inflight 闭包见编译快照中的 inflight.$Closure1-3.cjs 与 inflight.$Closure2-3.cjsmodule.exports function({ $store }) { class $Closure1 { async handle() { (await $store.store(foo)); } } return $Closure1; }module.exports function({ $expect_Util, $file2_Q }) { class $Closure2 { async handle() { (await $expect_Util.equal((await $file2_Q.greet(bar)), Hello bar)); } } return $Closure2; }闭包以工厂函数接收 lift 上来的对象引用$store、$file2_Q、$expect_Util体现了 Wing 的lift 机制——preflight 对象被显式提升到 inflight 作用域后才能在运行时访问。4.3 Store 类及其 AWS 资源preflight.store-2.cjs 是 store.w 的编译产物Store构造器内部new cloud.Bucket()与cloud.OnDeploy均被实例化为真实构造树节点。而 main.tf.json 则展示了 tf-aws 目标下的 Terraform JSON 产物——一个aws_s3_bucketStore 的 Bucket、一个aws_lambda_functionOnDeploy 的部署函数runtimenodejs20.x、架构arm64、超时 60 秒以及配套的 IAM 角色、CloudWatch 日志组等资源。这说明即使测试本身运行在 sim 平台Wing 仍然能为同一源码产出完整的云基础设施定义。4.4 入口文件的 preflight 组装preflight.cjs 展示了本地模块在编译产物中的加载方式const file1 $helpers.bringJs(${__dirname}/preflight.store-2.cjs, $preflightTypesMap); const file2 $helpers.bringJs(${__dirname}/preflight.subfile-3.cjs, $preflightTypesMap); const file3 $helpers.bringJs(${__dirname}/preflight.empty-1.cjs, $preflightTypesMap);每个被bring的本地.w文件都会被编译为独立的preflight.name-n.cjs模块再通过 SDK 的bringJs帮助函数加载。其实现位于 packages/winglang/sdk/src/helpers.ts除了执行require还会把被导入模块的$preflightTypesMap合并进当前模块的类型映射从而让编译器生成的类型解析如globalThis.$ClassFactory.new(examples-valid.Store, file1.Store, this, Store)在运行时可用。这正是本地模块导入在运行时层面的落地方式。五、快照如何生成Hangar 的测试流水线bring_local.test.w_test_sim.md由工具链 Hangar 自动生成相关源码位于 generated_test_targets.ts测试快照testTestL86-L122以[sim]为平台、[test]为参数运行wing test将WING_HIDE_CONTAINER_LOGS1注入环境把 stdout 写入fileMap[stdout.log]再调用createMarkdownSnapshot生成*_test_sim.md。这就是本文开头那段 stdout 快照的来源。编译快照compileTestL12-L84以[tf-aws]为平台运行wing compile收集target/name.tfaws/.wing目录下匹配preflight.、inflight.、extern/、proc、.Struct.js前缀的文件以及main.tf.json统一生成*_compile_tf-aws.md。快照还包含禁止绝对路径 require的校验L69-L71确保产物可移植。因此test_corpus下同一测试名对应的_test_sim.md与_compile_tf-aws.md是一对互补证据前者证明行为正确性后者证明基础设施产物符合预期。六、本地模块导入的更多形态归一化、目录与别名除了bring_local.test.w仓库中还有一组围绕bring的专项测试可作为扩展阅读路径归一化bring_local_normalization.test.w 验证同一个文件通过不同相对路径如./subdir/bar.w与./bar.w、./baz.w与../baz.w导入时Wing 能正确解析为同一个模块不会产生重复定义。目录导入bring_local_dir.test.w 验证bring ./subdir2 as subdir;的目录级导入——目录下所有文件公开类型平铺子目录类型通过subdir.inner.Widget访问。命名别名bring_alias.test.w 验证内置模块也可用as起别名bring fs as stdFs;同一模块多次以不同别名导入不冲突。七、小结与上手路径从快照bring_local.test.w_test_sim.md出发可以完整还原 Wing 本地模块导入的闭环语法bring ./path/to/file.w as ns;导入相对路径模块bring dir;导入目录bring mod;导入内置库详见 语言参考 · Module System。可见性被导入文件中的类型须以pub声明如 store.w 中的pub class / pub enum / pub struct / pub interface导入后经命名空间隔离访问同名类互不干扰。编译与运行每个本地模块编译为独立preflight.*.cjs经 bringJs 加载并合并类型映射extern方法在运行时通过require调用外部 JS/TS 实现。验证wing testsim 平台与wing compiletf-aws 平台由 Hangar 自动执行并产出 Markdown 快照作为行为与产物的回归基准。如果你想在本地复现这一验证过程可在安装 Wing CLI 后于tests/valid目录执行wing test bring_local.test.wsim 运行与wing compile bring_local.test.w -t tf-aws生成 Terraform 产物再对照 bring_local.test.w_test_sim.md 与 bring_local.test.w_compile_tf-aws.md 两份快照核对输出。赞分享编程语言编译器云原生语言运行时【免费下载链接】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 语言「bring 非入口模块并继承其类」能力解析从 hangar 快照测试到编译产物验证Wing 语言「bring 非入口模块并继承其类」能力解析从 hangar 快照测试到编译产物验证 导读 本文围绕 Wing 开源仓库中一份 hangar 快编程语言编译器云原生语言运行时Wing 语言 expect 标准库断言 API 全解析从 hangar 快照看编译产物与测试验证Wing 语言 expect 标准库断言 API 全解析从 hangar 快照看编译产物与测试验证 本文围绕 Wing 开源仓库中的 expect 标准库模块编程语言编译器云原生语言运行时Wing 语言本地模块 bring 机制深度解析以 bring_local 测试编译产物为切入点Wing 语言本地模块 bring 机制深度解析以 bring_local 测试编译产物为切入点 本篇技术指南围绕 Wing 语言Winglang的 本地编程语言编译器云原生语言运行时上一篇ulw-plan CLEAR 意图路径解析oh-my-openagent 中如何以最少提问产出决策完备的工作计划下一篇90DaysOfDevOps 实战在 Windows 上配置 Go 开发环境并完成 Hello WorldDay 8创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

LQR一阶倒立摆完整实战:建模、仿真调参与实物部署闭环

LQR一阶倒立摆完整实战:建模、仿真调参与实物部署闭环

简介:这是一份面向控制理论与自动化初学者的LQR一阶倒立摆MATLAB源码包,聚焦倒立摆系统建模、非线性线性化与LQR最优控制器设计问题。压缩包共5个文件,以4个.m脚本和1个.asv辅助脚本为主,整体仅3KB;其中演示脚本提供完…

2026/10/15 11:53:42 阅读更多 →
行为型设计模式实战:备忘录、观察者、状态、策略、模板方法与访问者

行为型设计模式实战:备忘录、观察者、状态、策略、模板方法与访问者

1. 行为型模式的整体版图与下半场定位行为型模式在二十三种经典设计模式里占了十一个席位,是整个模式体系中最庞大也最贴近业务逻辑的一类。上半场我们聊过了责任链、命令、解释器、迭代器和中介者这五个,它们更多聚焦在“请求如何传递”“对象如何遍历”…

2026/10/16 12:40:53 阅读更多 →
微信支付API v3接入实战:签名验签与回调处理全流程案例

微信支付API v3接入实战:签名验签与回调处理全流程案例

微信支付 API v3 的接入,是不少后端和全栈开发者在做交易类项目时绕不开的一道坎。相比早期的 v2 版本,v3 在安全模型上做了一次彻底的重构,签名机制、证书体系、回调验签逻辑全都换了新玩法。很多人第一次上手时,照着文档一步步走…

2026/10/15 11:52:41 阅读更多 →

最新新闻

MATLAB EMD工具箱实战:从经验模态分解到HHT时频分析

MATLAB EMD工具箱实战:从经验模态分解到HHT时频分析

简介:Matlab EMD经验模态分解工具箱,面向信号处理、故障诊断与振动分析领域的研究人员与工程师,用于对非线性、非平稳信号做自适应分解并提取有物理意义的本征模态函数分量。压缩包共38个文件,其中10个m脚本承担核心算法与在线/局…

2026/10/16 19:42:22 阅读更多 →
教务管理系统源码解析:技术选型、数据库设计与二次开发避坑指南

教务管理系统源码解析:技术选型、数据库设计与二次开发避坑指南

简介:这是一套面向计算机专业学生与Java Web开发者的教务管理系统完整源码,适合作为课程设计、毕业设计或企业级项目练手参考,帮助理解教育管理信息化的业务逻辑与技术落地。资源包共746个文件,约5.46MB,涵盖html、css…

2026/10/16 19:42:22 阅读更多 →
E7-2 AXOS everyPON 数据服务实施:从订户模板到策略映射实战指南

E7-2 AXOS everyPON 数据服务实施:从订户模板到策略映射实战指南

简介:Calix E7-2 AXOS everyPON数据服务实施课程的官方介绍文档,面向负责二层数据服务部署的技术员、网络运营者、规划师与工程师。资源包内仅含1个PDF文件,容量74KB,以精炼篇幅浓缩了4小时讲师授课的核心内容:E7-2 AX…

2026/10/16 19:42:22 阅读更多 →
gemma-skills新手必读:Google官方两大技能如何让AI Agent具备Gemma开发与微调能力

gemma-skills新手必读:Google官方两大技能如何让AI Agent具备Gemma开发与微调能力

【免费下载链接】gemma-skills Skills for the Gemma and model/agent interactions 项目地址: https://gitcode.com/gh_mirrors/ge/gemma-skills 点击查看 免费下载 如果你是刚接触 Gemma 模型的新手,gemma-skills 会是一个绝佳的起点。这是 Google 官…

2026/10/16 19:41:22 阅读更多 →
DeepSeek-V3-W4A8-Pruing权重文件怎么读?safetensors三分片结构与index索引完全解析

DeepSeek-V3-W4A8-Pruing权重文件怎么读?safetensors三分片结构与index索引完全解析

【免费下载链接】DeepSeek-V3-W4A8-Pruing 项目地址: https://ai.gitcode.com/hf_mirrors/vllm-ascend/DeepSeek-V3-W4A8-Pruing 点击查看 免费下载 初次接触 DeepSeek-V3-W4A8-Pruing 模型仓库时,面对 3 个 safetensors 分片文件、一个 578KB 的 index…

2026/10/16 19:41:22 阅读更多 →
整车控制器开发源代码:模块划分、状态机设计与工程落地

整车控制器开发源代码:模块划分、状态机设计与工程落地

简介:整车控制器(VCU)开发源代码包主要面向电动汽车与混合动力汽车控制系统的开发者、算法工程师及嵌入式软件研究者,用于解决VCU底层驱动、控制策略、状态机管理与故障处理等核心开发问题。包内文件共88个,以C源文件、…

2026/10/16 19:40:21 阅读更多 →

日新闻

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

个人 AI Agent 平台接入 TaoToken:统一 Key 与 API 通道的配置大纲

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 0:00:05 阅读更多 →
信号与系统频域分析作业解题指南

信号与系统频域分析作业解题指南

1. 作业背景与核心要求解析信号与系统作为电子信息类专业的核心基础课,其作业设计往往直接关联课程的核心知识框架。2026年春季第六次作业的布置,通常对应着课程进展到频域分析的关键阶段。根据常规教学进度推测,本次作业可能涉及以下核心内容…

2026/10/16 0:00:05 阅读更多 →
Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

Django MVT实战:从零构建图书借阅系统,彻底搞懂Model-View-Template分层

1. 从一个"四不像"的练手项目说起如果你已经看完了Django的官方教程前几章,跟着敲完了投票应用,大概会有一种"我好像会了,又好像什么都不会"的割裂感。教程里每个知识点都是拆开的——这一章讲模型,下一章讲视…

2026/10/16 0:00:05 阅读更多 →

周新闻

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

流感时间序列预测实战:ARIMA/LSTM全流程拆解与避坑指南

简介:基于 ARIMA、LSTM、Transformer 等模型的流感时间序列预测 Python 源码,面向计算机相关专业课程设计与期末大作业学生,以及项目实战学习者。内容覆盖预处理、平稳性检验、定阶、残差分析、多模型对比预测的完整时序建模流程,…

2026/10/15 16:18:54 阅读更多 →
影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别

影刀RPA新手教程:键盘模拟输入实战——输入文本与模拟按键的区别 做影刀RPA自动化,十个新手有八个栽在"往输入框里填东西"这件事上:要么填不进去,要么填了一半,要么直接把原来内容追加在后面。这背后的根因&…

2026/10/15 19:41:51 阅读更多 →
影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容

影刀RPA新手教程:阅文起点小说数据采集实战——书籍信息与章节内容 1. 认识影刀:什么场景该用RPA采小说数据 起点中文网的页面结构相对稳定——分类榜单、书籍详情、章节内容三块独立页面,跳转链路清晰。这种场景非常适合影刀自动化&#x…

2026/10/16 15:04:24 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/15 0:14:36 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 3:49:43 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/16 14:23:36 阅读更多 →