
编译器编程语言开发工具【免费下载链接】rescript-compilerReScript is a robustly typed language that compiles to efficient and human-readable JavaScript.项目地址https://gitcode.com/gh_mirrors/re/rescript-compiler点击查看免费下载导读rewatch是 ReScript 编译器仓库中自研的增量构建工具替代传统bsb其 Features 规范 提供了一套**构建期可选源码build-time optional sources**机制包作者可以在rescript.json中给源码目录打上feature标签由使用者通过命令行或依赖声明决定哪些目录参与编译。本文将以该规范文档为主线结合rewatch/src下的 Rust 实现与 rewatch/tests/features 测试套件完整讲解 feature 的声明、选择、传递与增量清理规则帮助你用这一机制交付带可选后端、实验模块或平台专属代码的库而不会让消费者承担无关源码的编译成本。Features 是什么可选源码目录的构建期开关Features 允许一个包声明其源码树中的可选部分这些部分在构建时可以被包含或排除。典型场景包括发布带多个后端的库如 native / web消费者只编译自己需要的那个内置实验性模块默认不参与构建存放平台专属代码按目标环境筛选。原文档明确强调Features 是rewatch的扩展机制不属于旧版bsb构建配置规范legacy build-configuration spec。也就是说它是在bsb之外由 rewatch 新增的rescript.json字段旧配置完全不受影响。这一约定在源码中同样可见config.rs 的注释写明features是 a new feature of rewatch, and its not part of the rescript.json spec。给源码目录打标签sources中的feature属性在rescript.json的sources数组里任意条目都可以加一个feature属性。该目录仅当该 feature 在当前包处于激活状态时才参与构建{ name: example/lib, sources: [ { dir: src }, { dir: src-native, feature: native }, { dir: src-experimental, feature: experimental } ] }规则如下未打标签的源码目录无feature永远编译无论激活了哪些 feature带标签目录的feature会向下级联cascade到嵌套的subdirs子目录若未声明自己的feature则继承父目录的。级联逻辑在源码中有直接实现config.rs 的Source::set_feature只对feature为None的子树补上父级标签且不会覆盖子目录自己的显式声明对应的单测test_feature_cascades_to_qualified_subdirs与test_feature_cascade_does_not_overwrite_explicit_childconfig.rs分别验证了这两种行为。声明 feature 之间的关系顶层features映射顶层features映射用于声明 feature 名称及可选的含义关系implication——即某个 feature 激活时顺带激活其他 feature{ features: { full: [native, experimental] } }关键点只有当需要「一个 feature 蕴含另一个」时才必须在此声明纯叶子 feature无蕴含关系可以保持未声明状态直接作为源码目录标签使用即可上述配置下请求full会**传递性transitively**激活native与experimental循环关系如a - b - a在构建期会被拒绝并报出清晰错误。循环检测实现在 config.rs 的expand_feature递归展开时维护一个stack一旦发现当前 feature 已在栈中就返回Cycle detected in features map: ...错误并列出循环链路。测试脚本 05-features-cycle-errors.sh 构造了a: [b], b: [a]的配置验证rewatch build --features a会失败且错误信息包含 Cycle detected。另外collect_declared_featuresconfig.rs会把features映射的键、蕴含列表中的值以及所有出现在sources标签里的 feature 名汇总成集合用于计算「未显式限制时默认全部激活」的基线。命令行选择rewatch build --features运行rewatch build或rewatch watch时通过--features参数把编译范围限制到指定集合。不带该参数时每个 feature 都处于激活状态整个源码树全部编译rewatch build # all features active (default) rewatch build --features native # only untagged native rewatch build --features native,full # multiple features; also expands full行为细节CLI 标志只作用于当前包即你正在构建的那个包不会向下流到依赖每个依赖的激活 feature 集合来自其消费者的声明见下一节空值--features 或--features ,会被拒绝省略标志才表示「全部激活」。参数解析在 cli.rs 中实现validate_features_string对空串报错「--features must not be empty. Omit the flag to build with all features active.」并通过value_parser挂到#[arg(long features)]上parsed()会把逗号分隔的原始值切分成 feature 名列表。测试build_features_flag_rejects_empty_string与build_features_flag_strips_whitespacecli.rs验证了空值拒绝与前后空白剔除。rewatch watch同样接受--features测试watch_features_flag_is_parsed且build的 feature 参数会透传给内部 watch 参数features_flag_round_trips_through_build_to_watch_args。限制依赖的 feature对象形式的依赖条目当消费一个使用了 features 的其他 ReScript 包时把dependencies或dev-dependencies中的字符串简写换成对象形式并列出想要激活的 feature{ dependencies: [ plain/dep, { name: example/lib, features: [native] } ] }规则总结简写plain/dep——消费者想要该依赖的所有 feature。这是既有行为未启用 features 的配置不受任何影响带features的对象——消费者把依赖限制在列出的 feature 上以及这些 feature 通过依赖自身features映射传递性蕴含的那些。显式空列表features: []表示「只要未打标签的源码目录不要任何 feature 门控代码」不带features的对象——等价于简写所有 feature 激活。依赖合并语义同一个依赖被多个消费者以不同 feature 集引用时取各请求的并集union。只要任一消费者要求全部 feature该依赖就以全部 feature 构建。Features 永远是**加性additive**的——启用更多 feature 不会移除模块因此并集始终安全。这套合并逻辑在 packages.rs 的compute_active_features中实现其文档注释逐条对应上述规则CLI 缺席时根包取全部声明 feature依赖条目无features字段表示要全部带列表则精确请求随后把所有消费者的请求求并集再交给resolve_active_features做传递性展开。对应单测覆盖了 CLI 缺席取全部、CLI 限制并传递展开、依赖消费方限制、显式空列表test_compute_active_features_honours_explicit_empty_features_listpackages.rs等场景。与其他标志的交互type: dev、--prod与cleantype: dev与--prod和 features 是正交的。一个源码目录可以同时声明type: dev和feature它只在这两个过滤器都通过时才编译不在--prod下且 feature 已激活。rewatch clean忽略--features总是清理每一个feature 门控目录下的全部构建产物与当前激活了哪些 feature 无关——这让clean的行为在任何 feature 组合下都可预期。源码佐证有两处其一packages.rs 的compute_active_features_prod_ignores_dev_dependency_feature_requests测试验证了--prod下不会因为dev-dependencies的简写 全部 feature而把依赖翻成「全部激活」只有非 dev 边的限制生效其二clean.rs 注释明确clean始终作用于全部源码目录集合以便清理掉用户本次构建未启用的 feature 产物。增量构建如何处理 feature 变化关闭某个 feature该 feature 的源码文件从构建视野中移除。下一次rewatch build会看到缩小后的文件集合并通过与处理已删除源文件相同的 diff 机制清理对应的构建产物.mjs、.cmj等。rewatch watch场景rescript.json中features的变更会触发全量重建full rebuild重新计算激活集合并对激活的源码目录重新注册文件监听。而 CLI 的--features标志只在 watcher 启动时求值一次修改它必须重启 watcher。feature 关闭后旧产物被清理的行为有端到端测试验证04-features-toggle-cleans-artifacts.sh 先全量构建出src-experimental/Experimental.mjs再执行rewatch build --features native断言Experimental.mjs已被移除而Native.mjs仍然存在。默认全量构建行为则由 01-features-default-all-active.sh 验证——不带--features时三个源码目录各产出一个.mjs文件。验证 feature 名称宽松的叶子与严格的循环未知的 feature 名出现在 CLI 输入或源码标签中会被当作叶子 feature 接受——它们不会匹配任何东西除非某个源码目录恰好以该名字打标签。对应实现是resolve_active_features对未在映射中的名字直接保留config.rs 的注释unknown feature names are kept in the output — treated as leaf features。顶层features映射中的循环是硬错误hard error错误信息会点名循环参与者即前述expand_feature的Cycle detected报错。完整示例一个带可选后端与实验模块的库综合以上全部机制Features.md 给出的完整配置如下{ name: example/lib, sources: [ { dir: src }, { dir: src-native, feature: native }, { dir: src-web, feature: web }, { dir: src-experimental, feature: experimental } ], features: { all-backends: [native, web] }, dependencies: [ plain/dep, { name: other/heavy, features: [native] } ] }对应的三种构建结果rewatch build在example/lib下——编译所有源码目录other/heavy只以其nativefeature 构建因为消费者只请求了它plain/dep以全部feature 构建rewatch build --features all-backends——编译src、src-native、src-web跳过src-experimentalrewatch build --features experimental——编译src、src-experimental跳过两个后端目录。仓库的测试仓库中有一个可运行的真实样例testrepo/packages/with-features/rescript.json其结构与本例一致src、src-native、src-experimental三个目录features.full蕴含native与experimental产物后缀.mjs配合 rewatch/tests/features 下的 6 个脚本默认全激活、CLI 限制、传递展开、切换清理产物、循环报错、空标志拒绝可以完整复现本文介绍的所有行为。小结Features 为 ReScript 包提供了一套轻量、可传递、纯构建期的可选源码开关在sources上打标签声明可选目录用顶层features映射表达蕴含关系消费者则通过--features或依赖对象形式精确挑选。其核心设计——叶子 feature 无需声明、未知名字宽松接受、循环硬报错、请求取并集且严格加性、clean无视 feature 组合——保证了即使多个消费者以不同 feature 集依赖同一包构建结果也始终安全一致。对库作者而言这意味着实验模块、平台分支和多后端实现可以随库分发却不会强迫每个消费者为其付出编译时间。进一步阅读构建配置全貌见 CompilerConfigurationSpec.md多包仓库场景见 MonorepoSupport.mdfeatures 的 CLI 参数与包级合并逻辑可分别深入 cli.rs 与 packages.rs。赞分享编译器编程语言开发工具【免费下载链接】rescript-compilerReScript is a robustly typed language that compiles to efficient and human-readable JavaScript.项目地址https://gitcode.com/gh_mirrors/re/rescript-compiler点击查看免费下载相关推荐Mr. Data Converter安全考量数据验证与XSS防护最佳方案Mr. Data Converter安全考量数据验证与XSS防护最佳方案 Mr. Data Converter是一款强大的开源工具能够将Excel中的CSV编译器编程语言开发工具ReScript 构建系统 rewatch 的 Monorepo 支持上下文推断、依赖解析与构建范围详解ReScript 构建系统 rewatch 的 Monorepo 支持上下文推断、依赖解析与构建范围详解 本篇技术指南围绕 rewatchReScript编译器编程语言开发工具Blender源码构建系统CMake配置与编译选项详解Blender源码构建系统CMake配置与编译选项详解 你是否曾因复杂的编译选项而对Blender源码望而却步本文将系统解析Blender的CMake构建系图形学3D渲染桌面应用音视频上一篇Wand-Enhancer终极指南3步免费解锁WeMod Pro高级功能完整教程下一篇华为HarmonyOS设备重获Google服务的终极解决方案microG框架完整指南创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考