dotnet/runtime 中构建 WebAssembly 库:Wasm 工具链缓存机制、子集构建命令与配置要点
dotnet/runtime 中构建 WebAssembly 库Wasm 工具链缓存机制、子集构建命令与配置要点【免费下载链接】runtime.NET is a cross-platform runtime for cloud, mobile, desktop, and IoT apps.项目地址: https://gitcode.com/GitHub_Trending/runtime6/runtime本文围绕 dotnet/runtime 仓库的 WebAssembly 库构建指南 展开完整覆盖 Emscripten/WASI SDK 等外部工具的按需下载与共享缓存机制、针对浏览器目标-os browser的 Mono 运行时与托管库构建子集命令、单库构建方式以及 Debug 构建的日志行为。读完本文后你可以独立完成 Mono WASM 运行时、System.Private.CoreLib、库的 native 组件的构建并正确管理跨分支、跨 worktree 的工具链缓存。前置条件与适用前提开始构建前请先阅读 构建要求文档了解你的操作系统对应的构建依赖。需要特别说明的是目前不需要额外安装任何构建依赖就可以开始 WebAssembly 构建——Emscripten 会在构建过程中自动下载并安装到共享缓存下文详述。针对特定平台的完整构建方式见 Mono browser README。本文档面向在 runtime 或 libraries 层面做开发的场景理解配置configuration概念前建议先阅读配置说明。Wasm 工具链的按需供应与共享缓存WebAssembly 构建与测试工作流依赖一批外部工具Emscripten SDK、WASI SDK、wasmtime、Chrome、chromedriver、Firefox、geckodriver 和 V8。这些工具按需下载到仓库主检出main checkout下的共享缓存中目录布局如下main checkout/.dotnet/wasm-tools/tool/version-host rid/ # 工具本体 main checkout/.dotnet/wasm-tools/tool/version-host rid.complete # 可用后写入的哨兵文件由于版本号是缓存路径的一部分这一设计天然带来两个好处升级版本等于新增一个缓存条目不会静默复用旧工具在不同分支间切换各自 pin 了不同版本时两个版本都会被复用无需重新下载。缓存锚定在主检出而非工作目录缓存锚定在主检出而不是各个工作目录因此同一个 clone 的所有 git worktree 共享同一份缓存——不需要按 worktree 重复下载同时删除仓库时缓存也会被一并删除。缓存还位于artifacts/之外所以不会被clean清理掉。这一机制在 WasmToolCache.props 中实现从源码结构看可以确认几个细节缓存目录由WasmToolCacheDir属性决定host RID$(HostOS)-$(BuildArchitecture)参与缓存条目命名因此同一版本的 x64/arm64 工具包可以共存主检出的解析是纯文件 I/O 完成的读取.git文件若内容形如gitdir: main/.git/worktrees/name则提取主检出前缀作为缓存锚点相对路径的 gitdir 或非 git 检出则回退到当前仓库根最后兜底到$(ArtifactsDir)/wasm-tools。注释中说明采用这种方式是为了廉价到每个项目都可以评估且与原生侧脚本保持一致下载用的临时解压目录WasmToolDownloadDir放在artifacts下因为它是一次性临时空间。版本 pin 文件各工具的版本由以下文件锁定当前仓库中的实际取值工具版本文件当前版本Emscriptensrc/mono/browser/emscripten-version.txt6.0.2WASI SDKeng/wasm/wasi-sdk-version.txt33.0wasmtimesrc/mono/wasi/wasmtime-version.txt45.0.0浏览器与 JS 引擎eng/testing/BrowserVersions.props—这些 txt 文件是唯一事实来源MSBuild 侧由 WasmToolCache.props 读取原生构建侧eng/native/configurecompiler.cmake与eng/native/gen-buildsys.*也会直接读这些文本文件因为 CMake/脚本无法求值 MSBuild 属性。手动供应与清理只供应 Emscripten、不构建其他内容./build.sh -s provision.emsdk -os browser删除当前检出已经不再引用的缓存条目./build.sh -s clean.wasmtools追加/p:PruneAllWasmToolstrue则清空整个缓存。清理逻辑实现在 PruneWasmToolCache.proj 中它通过 glob 缓存目录下所有*.complete哨兵文件确定在用条目再与当前检出的版本清单Emscripten、WASI SDK、wasmtime 以及有条件定义的 Chrome/chromedriver、V8、Firefox/geckodriver 哨兵做差集删除哨兵与对应工具目录。相关环境变量设置DOTNET_WASM_TOOL_CACHE_DIR可以移动缓存位置——例如放到用户全局的~/.dotnet/wasm-tools让多个无关 clone 共享或指向 CI agent 的持久缓存目录设置EMSDK_PATH或WASI_SDK_PATH对对应 SDK 仍然优先于缓存生效WASMTIME_PATH不被支持目前把构建指向本地 wasmtime 已被禁用对应上游 issue #101528文中不做外链此处仅作追踪编号说明。另外注意 src/mono/browser/README.md 中的一个 Windows 陷阱EMSDK 初始化隐式依赖 Python。若首次构建尝试时系统未装 Python自动供应会失败并留下无效状态的缓存条目之后补装 Python需要手动删除main checkout/.dotnet/wasm-tools/emscripten/下对应的条目再重新构建。该目录还有一个独立的make provision-wasm目标它安装的是可打补丁的上游 emsdk 克隆到src/mono/browser/emsdk与共享缓存完全独立只有需要修改 emscripten 本身时才需要。重要注意事项不要混合 runtime 与 library 的配置当前不支持为 runtime 和 libraries 分别指定不同配置把 Release 的-runtimeConfiguration与 Debug 的-libraryConfiguration或-configuration混用以及单线程/多线程配置的混搭都不行。请只使用-configuration选项并取值Debug或Release不要分别指定-runtimeConfiguration和-libraryConfiguration。此限制由上游 issue #42553 跟踪。构建 Mono 的 System.Private.CoreLib 或运行时如果你在开发 Mono 的核心部分通常需要构建 Mono 运行时和 System.Private.CoreLib。构建两者./build.sh mono -os browser -c Debug|Release只构建 System.Private.CoreLib不含 Mono 运行时使用Mono.CoreLib子集./build.sh mono.corelib -os browser -c Debug|Release只构建 Mono 运行时不含 System.Private.CoreLib使用Mono.Runtime子集./build.sh mono.runtime -os browser -c Debug|Release同时构建 Mono/System.Private.CoreLib 与托管库./build.sh monolibs -os browser -c Debug|Release构建 WebAssembly 运行时文件Mono.WasmRuntime 子集WebAssembly 的实现文件在库源码构建之后生成并输出到 artifacts 目录。如果你只需要重新编译这些模块构建Mono.WasmRuntime子集即可./build.sh mono.wasmruntime -os browser -c Debug|Release这里有一条原文档强调的重建纪律代码改动后用build.sh重建时即使改动只涉及 Mono也必须保证mono.wasmruntime与libs.pretest两个子集都被包含否则 artifacts 中的目录不会被更新libs.pretest的作用见下一节。更新 in-tree 运行时包libs.pretest 子集如果不跑完整的Libs子集可以用Libs.PreTest子集把更新后的 runtime/corelib 二进制拷贝到运行测试所用的运行时包runtime pack中./build.sh libs.pretest -os browser -c Debug|Release只构建库的 native 组件库构建中包含一部分原生代码包括对 libc、openssl、gssapi 和 zlib 的 shim垫片。构建系统用 CMake 生成 Makefile、以 clang 编译并借助 git 生成部分版本信息。只构建这些组件./build.sh libs.native -os browser -c Debug|Release构建单个库指定要构建的项目即可构建个别库。原文档给出的两个示例路径请替换为你本地的仓库全路径构建某库如 System.Net.Http的全部项目包括测试./build.sh -os browser -c Release --projects full-repository-path/src/libraries/System.Net.Http/System.Net.Http.slnx只构建某库的源码工程./build.sh -os browser -c Release --projects full-repository-path/src/libraries/System.Net.Http/src/System.Net.Http.csproj更完整的--projects用法与参数位置要求-f、-c等选项需放在目录参数之后可参考 libraries 构建文档。Debug 构建的默认行为Debug构建会默认设置以下环境变量理解它们有助于看懂构建后的控制台输出1. 开启调试与日志输出其中 GC 信息会被打印到控制台MONO_LOG_LEVELdebug MONO_LOG_MASKgc典型输出示例L: GC_MAJOR_SWEEP: major size: 752K in use: 39K L: GC_MAJOR: (user request) time 3.00ms, stw 3.00ms los size: 0K in use: 0K2. 将System.Diagnostics.Debug的输出重定向到stderr在浏览器环境中显示到控制台。原文档引用的设置代码// Setting this env var allows Diagnostic.Debug to write to stderr. In a browser environment this // output will be sent to the console. Right now this is the only way to emit debug logging from // corlib assemblies. monoeg_g_setenv (DOTNET_DebugWriteToStdErr, 1, 0);即DOTNET_DebugWriteToStdErr1是 corlib 程序集内部目前唯一可以发出调试日志的通道。更新 Docker 镜像中的 Emscripten 版本CI 使用的 Docker 镜像中 Emscripten 版本的更新流程在dotnet-buildtools-prereqs-docker仓库src/azurelinux目录中更新当前 WebAssembly 镜像定义里的 Emscripten 版本。当前启用的 WebAssembly 镜像清单由该仓库 Azure Linux 目录下的manifest.json跟踪提交包含 Dockerfile 改动的 PR等待镜像发布流程完成镜像发布后到dotnet/versions仓库对应的 image-info 文件image-info.dotnet-dotnet-buildtools-prereqs-docker-main.json中查找新 tag回到本仓库更新其中的 WebAssembly 镜像引用涉及 eng/pipelines/helix-platforms.yml 与eng/pipelines/libraries/helix-queues-setup.yml两个文件用更新后的镜像引用提交 PR。注意此流程只影响 CI 镜像不影响本地开发——本地构建的 Emscripten 走的是上文所述的共享缓存版本由 emscripten-version.txt 锁定。测试库库测试JS 引擎 v8/SpiderMonkey/JavaScriptCore 与浏览器 Chrome 两种方式的运行方法见 Mono browser README 的 Libraries tests 一节其中 macOS 下以make run-tests-v8-lib_name形式按引擎选择运行浏览器测试依赖 chromedriver 与 Google Chrome。小结本文档给出的 WebAssembly 库构建路径可以归纳为一条主线所有外部工具由共享缓存自动供应版本 pin 在若干 txt/props 文件中缓存按版本 host RID组织并锚定主检出构建命令统一是./build.sh subset -os browser -c Debug|Release的形式按需选择mono、mono.corelib、mono.runtime、mono.wasmruntime、libs.pretest、libs.native等子集并始终遵守runtime 与 library 配置不可混合这一约束。相关实现证据集中在 eng/wasm/WasmToolCache.props、eng/wasm/PruneWasmToolCache.proj 与 eng/wasm/wasm-tool-cache.sh可供进一步深入阅读。【免费下载链接】runtime.NET is a cross-platform runtime for cloud, mobile, desktop, and IoT apps.项目地址: https://gitcode.com/GitHub_Trending/runtime6/runtime创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

相关新闻

PTO Tile Lib 编译流程全解析:从 C++ intrinsic 源码到 CPU 仿真 / NPU 多后端构建产物

PTO Tile Lib 编译流程全解析:从 C++ intrinsic 源码到 CPU 仿真 / NPU 多后端构建产物

PTO Tile Lib 编译流程全解析:从 C intrinsic 源码到 CPU 仿真 / NPU 多后端构建产物 【免费下载链接】pto-isa Parallel Tile Operation (PTO) is a virtual instruction set architecture designed by Ascend CANN, focusing on tile-level operations. This repo…

2026/9/19 22:00:53 阅读更多 →
Matter Power Source 集群在 CodeDriven 数据模型下的模板化实现与集成指南

Matter Power Source 集群在 CodeDriven 数据模型下的模板化实现与集成指南

Matter Power Source 集群在 CodeDriven 数据模型下的模板化实现与集成指南 【免费下载链接】connectedhomeip Matter (formerly Project CHIP) creates more connections between more objects, simplifying development for manufacturers and increasing compatibility for …

2026/9/19 22:00:53 阅读更多 →
三维物体检测三大技术路线全解析:激光雷达、相机与多模态融合

三维物体检测三大技术路线全解析:激光雷达、相机与多模态融合

1. 为什么这篇综述值得每一个做感知的人逐页精读做自动驾驶感知这行的朋友应该都有体会,最近两三年三维物体检测的论文数量几乎是爆炸式增长,光arXiv上每天新挂出来的相关预印本就能刷好几页。但问题也随之而来:方向太散、术语不统一、数据集…

2026/9/19 21:59:52 阅读更多 →

最新新闻

googleapis 代码生成器源码剖析:从 Discovery JSON 到 600+ API 客户端的自动化原理

googleapis 代码生成器源码剖析:从 Discovery JSON 到 600+ API 客户端的自动化原理

googleapis 代码生成器源码剖析:从 Discovery JSON 到 600 API 客户端的自动化原理 【免费下载链接】google-api-nodejs-client Googles officially supported Node.js client library for accessing Google APIs. Support for authorization and authentication wi…

2026/9/19 22:41:13 阅读更多 →
基于S7-200 PLC与RFID的小区车辆智能出入管理系统设计

基于S7-200 PLC与RFID的小区车辆智能出入管理系统设计

简介:这份文档是一篇完整的本科毕业设计论文,主题为小区车辆进出智能管理系统设计,适合自动化、电气工程及其自动化专业的学生参考,尤其是需要完成PLC或智能控制类课题的毕业生。系统方案以可编程逻辑控制器(PLC&#…

2026/9/19 22:41:13 阅读更多 →
Podman `--env-host` 深入解析:将宿主机环境变量注入容器的机制、优先级与 Quadlet 配置

Podman `--env-host` 深入解析:将宿主机环境变量注入容器的机制、优先级与 Quadlet 配置

Podman --env-host 深入解析:将宿主机环境变量注入容器的机制、优先级与 Quadlet 配置 【免费下载链接】podman Podman: A tool for managing OCI containers and pods. 项目地址: https://gitcode.com/gh_mirrors/po/podman --env-host 是 Podman 在 podman…

2026/9/19 22:41:13 阅读更多 →
CANN ops-transformer 融合门控 Delta 网络解码算子 FusedGdnDecode:功能原理与 aclnn/torch 双接口实战指南

CANN ops-transformer 融合门控 Delta 网络解码算子 FusedGdnDecode:功能原理与 aclnn/torch 双接口实战指南

CANN ops-transformer 融合门控 Delta 网络解码算子 FusedGdnDecode:功能原理与 aclnn/torch 双接口实战指南 【免费下载链接】ops-transformer 本项目是CANN提供的transformer类大模型算子库,实现网络在NPU上加速计算。 项目地址: https://gitcode.co…

2026/9/19 22:41:13 阅读更多 →
CANN PyPTO Pro SIMT 编程范式:线程架构、SIMT 函数与抽象硬件详解

CANN PyPTO Pro SIMT 编程范式:线程架构、SIMT 函数与抽象硬件详解

CANN PyPTO Pro SIMT 编程范式:线程架构、SIMT 函数与抽象硬件详解 【免费下载链接】pypto PyPTO(发音: pai p-t-o):Parallel Tensor/Tile Operation编程范式。 项目地址: https://gitcode.com/cann/pypto SIMT&#xff08…

2026/9/19 22:41:13 阅读更多 →
PTO TPARTMIN 指令全解析:CANN pto-isa 中基于有效区域(valid region)的逐元素最小值选择

PTO TPARTMIN 指令全解析:CANN pto-isa 中基于有效区域(valid region)的逐元素最小值选择

PTO TPARTMIN 指令全解析:CANN pto-isa 中基于有效区域(valid region)的逐元素最小值选择 【免费下载链接】pto-isa Parallel Tile Operation (PTO) is a virtual instruction set architecture designed by Ascend CANN, focusing on tile-l…

2026/9/19 22:40:13 阅读更多 →

日新闻

BP神经网络时序预测:滑窗长度与多窗口平均策略

BP神经网络时序预测:滑窗长度与多窗口平均策略

简介:面向机器学习、深度学习与数据建模学习者的一份完整研究文献,聚焦BP神经网络在农业产量预测中的应用。文档以1980—2018年全国棉花产量为样本,系统讲解数据归一化处理、激活函数原理、多层神经网络结构搭建及训练流程,展示敏…

2026/9/19 0:00:30 阅读更多 →
Transformer训练实时监控实战:基于MindSpore的损失曲线可视化方案

Transformer训练实时监控实战:基于MindSpore的损失曲线可视化方案

上个月调一个Deformable DETR模型,在单卡上要跑将近两天。第二天早上我下意识打开终端翻日志,发现loss从凌晨两点就开始往上爬,一路从0.8涨到1.35,整整六个小时没人发现。那六个小时的训练不仅白跑,还霸占着卡——等于…

2026/9/19 0:00:30 阅读更多 →
OpenCloud 中的 Go 类型安全转换库 spf13/cast:从零值回退到泛型 API 的完整实战指南

OpenCloud 中的 Go 类型安全转换库 spf13/cast:从零值回退到泛型 API 的完整实战指南

OpenCloud 中的 Go 类型安全转换库 spf13/cast:从零值回退到泛型 API 的完整实战指南 【免费下载链接】opencloud 🌤️ OpenCloud is the open source platform for file management, sharing and collaboration. Simple and sovereign. 项目地址: htt…

2026/9/19 0:00:30 阅读更多 →

周新闻

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验

AI SDK Harness 依赖更新指南:掌握 harness 包 SDK 依赖的升级、桥接同步与一致性校验 【免费下载链接】ai The AI Toolkit for TypeScript. From the creators of Next.js, the AI SDK is a free open-source library for building AI-powered applications and ag…

2026/9/19 3:59:36 阅读更多 →
Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化

Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化

Refine v5 Ant Design NumberField 组件实战:基于 Intl 的本地化数字格式化 【免费下载链接】refine A React Framework for building internal tools, admin panels, dashboards & B2B apps with unmatched flexibility. 项目地址: https://gitcode.com/GitH…

2026/9/19 3:53:08 阅读更多 →
Flutter应用改名全指南:从Android到iOS的配置与工具实践

Flutter应用改名全指南:从Android到iOS的配置与工具实践

刚接一个外包项目时,甲方要求把工程里临时用的应用名改成正式产品名。我本来觉得“改名”这种小事,打开配置文件改一行不就完了?结果真动手才发现,Flutter项目里“应用名称”根本不是一处配置,而是一整套散落在 Androi…

2026/9/19 4:02:43 阅读更多 →

月新闻

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能

持续集成 流水线自动化与 声明式交付 实践:原型怎样变成可用功能分类:[AI/大模型]细分主题:AI 增强型 CI/CD 流水线自动化与 GitOps 实践:Agent 工作流、工具调用与任务拆解:从原型到生产的验收清单很多团队在尝试用大…

2026/9/16 22:31:27 阅读更多 →
容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场

容器编排 生产环境运维与排障实战:复盘记录怎样真正派上用场分类:[工程技术]细分主题:Kubernetes 生产环境运维与排障实战:可复制的项目复盘模板与决策记录大部分团队的事故复盘报告,最后都变成了躺在 Confluence 或钉…

2026/9/19 17:50:38 阅读更多 →
容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步

容器 容器化技术与镜像安全管理:核心链路应该先拆哪一步分类:[工程技术]细分主题:Docker 容器化技术与镜像安全管理:核心链路的逐步实现与关键代码取舍面对一个积累了五六年历史包袱的单体架构应用(包含 Web 接口、后台…

2026/9/16 22:32:59 阅读更多 →