@wavever/buildby
v1.2.0
Published
Detect the technology stack, code signature, and notarization status of desktop applications (Native vs Cross-platform)
Maintainers
Readme
buildby 可以检测 macOS 与 Windows 上桌面应用所使用的技术栈,快速看出一个应用是使用 原生技术(Swift、Objective-C、Win32 等),还是使用 跨平台框架(Electron、Flutter、Tauri、Qt、JVM、CEF、NW.js、React Native、wxWidgets、Unity、.NET 等)构建的。
除了识别技术栈,buildby 还会在单应用检查时展示 签名与公证 信息,包括开发者名称、Team ID、签名状态、Apple 公证状态(macOS)或 Authenticode 状态(Windows),以及是否启用了强化运行时(Hardened Runtime)。
亮点
- 基于文件系统快速检测,不需要管理员权限。
- 支持单应用查看、全量扫描、按技术栈过滤。
- 展示 macOS 与 Windows 应用的签名、公证和信任状态。
- 同时支持 npm 包、GitHub Release 构建包和 GitHub Packages 发布。
- 安装后直接作为全局 CLI 使用:
buildby <应用名>。
截图
| 查看单个应用 | 扫描所有已安装应用 | 按技术栈过滤 |
| :---: | :---: | :---: |
|
|
|
|
安装
# 从 npm 安装
npm i -g @wavever/buildby
# 克隆仓库并全局链接
git clone https://github.com/wavever/buildby.git
cd buildby
npm install
npm link
# 或直接运行
node bin/buildby.js <command>早期发布名为
desktop-app-build-by,现已弃用,请改用npm i -g @wavever/buildby。CLI 命令保持为buildby。详情见 CHANGELOG.md。
用法
查看单个应用
buildby wechat
buildby discord
buildby "visual studio code"
buildby "clash verge"输出示例:
Discord
/Applications/Discord.app
跨平台 ⚡ Electron
使用 Web 技术(HTML/CSS/JS)构建的跨平台桌面应用
https://www.electronjs.org
检测依据:
• Electron Framework.framework
• app.asar
Bundle ID: com.hnc.Discord
版本: 0.0.335
大小: 375.4 MB
签名与公证
开发者: Discord, Inc.
团队 ID: 53Q6R32WPB
签名: 已签名
公证: 已公证
强化运行时: ✓ 是签名与公证 部分仅在单应用查看时输出(
buildby <name>与--path)。--all与--<stack>模式为了保证批量扫描速度,会跳过这一部分。
扫描所有已安装应用
buildby --all
buildby -a会扫描 /Applications(macOS)或 Program Files(Windows)等目录下的所有桌面应用,按技术栈分组,并展示适合截图分享的“桌面应用技术栈画像”。
--scan仍然保留为--all的兼容别名。
批量扫描会使用本地分析缓存。如果应用版本与主可执行文件指纹没有变化,BuildBy 会直接复用上一次分析结论,重复扫描几乎是瞬时完成。
buildby --all --no-cache # 强制重新分析配置文件
BuildBy 会在首次运行时自动创建默认 JSON 配置文件,之后运行时会读取它:
- macOS:
~/.buildby/config.json - Windows:
%APPDATA%\buildby\config.json - Linux / 其他:
$XDG_CONFIG_HOME/buildby/config.json或~/.config/buildby/config.json
也可以通过 BUILDBY_CONFIG=/path/to/config.json 指定自定义配置文件;如果该文件不存在,BuildBy 会自动写入默认值。
{
"cache": true,
"excludeApps": [
"Xcode",
"com.apple.Safari",
"/Applications/VMware Fusion.app"
]
}cache: false 会默认禁用分析缓存。excludeApps 会让匹配的应用不参与 --all 与按技术栈过滤扫描;条目可以写应用名、Bundle ID 或完整路径。单应用查询仍然可以查看这些被排除的应用。
输出语言
BuildBy 默认会跟随终端或系统语言。无需修改系统语言,也可以临时展示英文输出:
LC_ALL=en_US.UTF-8 buildby -a也可以创建一个 alias:
alias buildby-en='LC_ALL=en_US.UTF-8 buildby'按技术栈过滤
buildby -e # 所有 Electron 应用(--electron)
buildby -f # 所有 Flutter 应用(--flutter)
buildby -t # 所有 Tauri 应用(--tauri)
buildby -q # 所有 Qt 应用(--qt)
buildby -w # 所有 wxWidgets/wxPython 应用(--wxwidgets)
buildby -j # 所有 JVM 应用(--jvm)
buildby -c # 所有 CEF 应用(--cef)
buildby -d # 所有 .NET / MAUI / WPF 应用(--dotnet)
buildby -b # 所有 Chromium 应用(--chromium)
buildby -W # 所有 NW.js 应用(--nwjs)
buildby -r # 所有 React Native 桌面应用(--reactnative)
buildby -u # 所有 Unity 应用(--unity)
buildby -n # 所有原生应用(--native)指定自定义路径
buildby --path /Applications/SomeApp.app
buildby --path "C:\Program Files\SomeApp"支持检测的技术栈
| 栈 | 说明 | 主要检测方式 |
|----|------|--------------|
| ⚡ Electron | Node.js + Chromium | Electron Framework.framework、app.asar |
| 🐦 Flutter | Google 跨平台 UI 工具包 | FlutterMacOS.framework、flutter_windows.dll |
| 🌐 CEF | Chromium Embedded Framework | Chromium Embedded Framework.framework、libcef.dll |
| 🦀 Tauri | Rust + 系统 WebView | otool -L 检测 WebKit.framework + 资源目录 / Windows 上 WebView2Loader.dll |
| 🔷 Qt | C++ 跨平台框架 | Qt*.framework、Qt5Core.dll / Qt6Core.dll |
| 🧩 wxWidgets | C++ 跨平台 GUI 库 | macOS 上 libwx*.dylib,Windows 上 wxmswXXu_*.dll 等 |
| ☕ JVM | Java/Kotlin/Scala | jbr/、libjvm.dylib、大量 .jar 文件 |
| 🔵 .NET | Microsoft .NET / MAUI / WPF | MonoBundle/、coreclr.dll、.dll 组合特征 |
| 🟩 NW.js | Node.js + Chromium(原 node‑webkit) | nwjs Framework.framework、app.nw |
| ⚛️ React Native | React Native 桌面端实现 | React.framework、Hermes.framework / hermes.dll |
| 🖥️ Native | 平台原生技术 | 未命中任何跨平台特征时的兜底分类 |
平台支持
| 平台 | 应用发现位置 | 检测方式 |
|------|--------------|----------|
| macOS | /Applications、~/Applications | Contents/Frameworks、Contents/Resources、otool -L、Info.plist 元数据 |
| Windows | Program Files、Program Files (x86)、AppData/Local/Programs | 扫描 .exe / .dll、特定框架文件与目录结构 |
工作原理(简要)
检测完全基于 文件系统,不会做反汇编,也不需要管理员权限:
- 扫描框架目录:读取
Contents/Frameworks/或应用目录下的 DLL,匹配各类已知框架的特征文件。 - 资源文件模式:查找
app.asar、flutter_assets、app.nw等典型文件。 - JVM / .NET / 其他运行时检测:识别打包的 JRE/JBR、.NET 运行时以及关联目录结构。
- Tauri / wxWidgets 等特定栈:结合
otool -L/ DLL 名称 + 资源分布做多信号判断。 - 元数据提取:从
Info.plist解析 Bundle ID、版本号和展示名称。 - 签名与公证:macOS 上调用
codesign -dv与spctl --assess,Windows 上调用 PowerShellGet-AuthenticodeSignature,提取开发者 / Team ID / 签发者,以及 Apple 公证或 Authenticode 信任状态。 - 兜底策略:如果未匹配到任何跨平台特征,则将应用归类为原生技术栈。
检测按照优先级顺序依次执行,特征越独特的框架越先匹配,以减少误报和重复分类。
环境要求
- Node.js >= 18
- 当前系统为 macOS 或 Windows
- macOS 需要
otool、codesign、spctl(Xcode Command Line Tools 自带) - Windows 需要
powershell在PATH中(用于读取 Authenticode 签名)
许可证
MIT
