多米诺
高性能的粗口执行 真实受影响 ——用Oxc解析器对单体进行语义变化检测.
概览
多米诺是TypeScript版本的倒置替换 贸易,为同样的语义分析能力提供了显著更好的性能,这要归功于Rust和Oxc parser.
特征
- 语义变化检测:分析 AST 级别上的实际代码更改,而不仅仅是文件更改
- 交叉参考追踪: 在整个工作空间跟踪符号引用
- 锁定文件更改检测: 检测 npm 、 纱线 、 pnpm 和 bun 锁文件和被影响的痕迹的依赖性版本变化
- 快速氧化解析器: 3-5x 速度快于 TypeScript 的编译器 API
- 工作空间支持:与Nx、Turborepo和通用npm/yarn/pnpm/bun工作空间有关的工程
- 全局无效: 荣誉Nx
namedInputs工作空间根图案(例如.sharedGlobals)和涡轮风波globalDependencies从turbo.json编号 :turbo.jsonc,因此更改为共享根文件标记每个受影响的工程 - 根 tsconfig 变化: 更改工作空间根
tsconfig.base.json由每个工作空间类型处理--root-tsconfig-strategy(节点:rootTsconfigStrategy) (中文(简体) ). 默认,aliases,将更改缩小为compilerOptions.paths单是:使用添加、去除或重新瞄准别名的文件受到影响,无论它们是否导入,require这,import()它、副作用进口或再出口(项目根数中的配置文件和其他非源文件);.git, (中文(简体) ),node_modules并跳过前8个 KiB 不为 UTF-8 的文件,并检查植入工作空间根的工程sourceRoot他们的用法,是可追踪的。 绑定名称的导入像被更改的符号一样被追踪,通过使用该符号的代码;以名称命名的再出口export *进口商从桶中取出每个名称,但桶出口本身的名称除外;如果一个文件到达了别名而无约束力,则可以追踪每一份出口(一个文件只在评论中提及,jest.mock()或者说declare module,被接受的超选). 任何其他更改(另一个编译器选项,baseUrl, (中文(简体) ),extends,一个孩子paths出现或消失extends,不可解析的文件,或带有*而不是跟踪/*影响每个项目.all总是影响每个项目;none将文件与其他根文件一样对待。 A 类namedInputs输入列出文件的条目,无论策略如何,仍然在全球无效 - 模块分辨率: 精确模块分辨率使用oxc resolver(同滚落和Nova)
快速启动
# Run directly with npx (no installation required)
npx @front-ops/domino@latest affected
# Show all projects in the workspace
npx @front-ops/domino@latest affected --all
安装
使用 npx( 建议)
不需要安装! 运行:
npx @front-ops/domino@latest affected
二进制安装
如果您喜欢使用独立的二进制 :
# Clone and build from source
git clone [email protected]:frontops-dev/domino.git
cd domino
cargo build --release
# The binary will be available at ./target/release/domino
# You can then run it from anywhere:
/path/to/domino/target/release/domino affected
使用量
使用 npx
# Show all projects in the workspace
npx @front-ops/domino affected --all
# Find affected projects (compared to origin/main)
npx @front-ops/domino affected
# Use a different base branch
npx @front-ops/domino affected --base origin/develop
# Compare specific commits (useful in CI patch pipelines)
npx @front-ops/domino affected --base abc123 --head def456
# Output as JSON
npx @front-ops/domino affected --json
# Enable debug logging
npx @front-ops/domino affected --debug
# Generate a detailed report
npx @front-ops/domino affected --report report.html
使用二进制
如果你从源头建了二进制:
# Show all projects in the workspace
domino affected --all
# Find affected projects (compared to origin/main)
domino affected
# Use a different base branch
domino affected --base origin/develop
# Compare specific commits (useful in CI patch pipelines)
domino affected --base abc123 --head def456
# Output as JSON
domino affected --json
# Enable debug logging
domino affected --debug
# Generate a detailed report
domino affected --report report.html
选项
--base <BRANCH>: 基准分支比较(默认值:origin/main(中文(简体) )--head <COMMIT>: 头部承诺比较( 默认为工作树)--all: 显示所有工程,不论修改--json: 作为 JSON 的产出结果--report <PATH>: 生成详细的分析报告--debug: 启用调试记录--cwd <PATH>: 设置当前工作目录--lockfile-strategy <STRATEGY>: Lockfile 更改检测策略( 默认 ):direct(中文(简体) )--root-tsconfig-strategy <STRATEGY>: 怎么样tsconfig.base.json变化影响项目:aliases, (中文(简体) ),all或者说none(默认 :aliases(中文(简体) )
锁定文件更改检测
多米诺自动检测您的锁文件更改时, 并识别哪些项目受到依赖性版本更新的影响 。 与所有主要软件包管理者合作:
| 软件包管理器 | 锁定文件 |
|---|---|
| 无 | package-lock.json |
| 线条 | yarn.lock |
| 小时 | pnpm-lock.yaml |
| 包头 | bun.lock |
有三个战略是通过下列途径提供的: --lockfile-strategy数字 :
none——完全忽略锁文件更改direct(默认)——标记直接导入受影响的依赖的项目full- 喜欢direct,但也追踪到全部参考链(例如如果lib-a已更改和ProjectA进口,full跟踪所有再出口lib-a符号以查找其他受影响的项目)
检测是过渡性的:如果一个深深地嵌入的依赖性变化,多米诺走出反向依赖性图来找出哪些直接依赖性受到影响,然后发现所有项目都导入了这种依赖性.
# Default: detect lockfile changes with "direct" strategy
domino affected
# Disable lockfile detection
domino affected --lockfile-strategy none
# Full reference chain tracing
domino affected --lockfile-strategy full
如何运作
- Git Diff 分析: 检测哪些文件和特定行已经改变
- 语义解析: 使用 Oxc 解析所有类型脚本/ JavaScript 文件
- 文号 决议: 确定修改了哪些符号(功能、类、常数)
- 参考查找: 递归查找这些符号的所有交叉文件引用
- 锁定文件分析: 检测到依赖性版本的变化和所受影响的进口痕迹
- 项目绘图: 将受影响的文件映射到自己的项目
- 隐性依赖: 展开 Nx
implicitDependencies针对已知项目 名称,包括词汇图案app-*, (中文(简体) ),integration-*-module和!排除 – 与 Nx/ minmatch 相同的想法, 而不是路径阴影 - 目标配置链接: 跟踪在 a 中命名的项目
project.json目标inputs(单位:千美元){ "input": "production", "projects": ["shared-config"] }和dependsOn(单位:千美元){ "projects": ["api"], "target": "build" },或"api:build"string form),它不会创建自己的工程图边缘.nx.jsontargetDefaults为项目宣布的目标提供这些字段,而不设置这些字段,以 Nx 的关键优先(执行者,然后是目标名称,然后是目标名称 glob, 匹配小型匹配样式); 项目本身的字段获胜 。 这个self财务报告和审定财务报表dependencies关键字没有添加链接, 标记选择器( n)tag:x)和外接键(@(a|b)不支持,以及filters 在数组形式上targetDefaults不评价条目(它们的链接总是适用的,完全过滤的密钥不会隐藏下一个密钥)。 目标配置已声明package.json#nx,和 Nx 插件推断的目标,不读取.
业绩
多亏了Rust和Oxc,多米诺显著快于TypeScript版本:
- 分析: 使用 Oxc 的3-5x 速度更快
- 内存: 降低内存足迹
- 启动: 近起步时间
与类型脚本版本的比较
| 特性 | 类型脚本 | 锈 |
|---|---|---|
| 解析器 | ts-形态( TypeScript 编译器) | 氧化解析器 |
| 速度 | 基线 | 3 - 5 转快 |
| 内存 | 基线 | 减-50% |
| 二进制大小 | 需要节点.js + 道克 | 单个独立二进制 |
| 启动时间 | ~1-2s 宽度 | < 100 分钟 |
建筑
核心组成部分
- Git 整合 (单位:千美元)
src/git.rs: 支持 git diffs 以识别已更改的文件和行 - 工作空间发现 (单位:千美元)
src/workspace/:发现Nx,Turbo,以及通用npm/yarn/pnpm/bun工作空间的项目 - 语义分析器 (单位:千美元)
src/semantic/analyzer.rs: 使用Oxc来解析和分析类型Script/JavaScript - 参考查找器 (单位:千美元)
src/semantic/reference_finder.rs: 音轨交叉文件符号引用 - 锁定文件分析器 (单位:千美元)
src/lockfile.rs: 解析锁文件,构建反向依赖图,并检测受影响的包 - 核心算法 (单位:千美元)
src/core.rs: 管弦乐 受影响的探测逻辑
主要技术
- 氧化物: 高性能 JavaScript/ TypeScript 解析器和工具链
- oxc 解析器: 模块分辨率(由Rolldown, Nova, knip所使用)
- 掌声: CLI 参数解析
- gi2: 基特整合
- 塞尔维亚JSON/YAML 解析
发展
快速引用
# Build (debug)
cargo build
# Build (release)
cargo build --release
# Run tests
cargo test
# Run integration tests (must be serial)
cargo test --test integration_test -- --test-threads=1
# Run from source
cargo run -- affected --all
# Format code
cargo fmt
# Lint code
cargo clippy
# Enable debug logging
RUST_LOG=domino=debug cargo run -- affected
许可证
麻省理工学院 - 看 自由主义。 。 。 .
贷项
这是原版的Rust端口 贸易 TypeScript 执行.
以下列方式建造: