d854c95ee6
`npm install` 在 postinstall 阶段直接失败退出:
node-hid 编译报错 -> node-addon-api/napi.h:2477 expected unqualified-id
根因不是 node-hid 坏了, 是重建范围错了:
1. postinstall 跑的是 `electron-builder install-app-deps`, 它重建**所有**原生模块;
2. 它给子进程传 `npm_config_build_from_source=false` —— 但这是**字符串** "false",
npm 11 对未知的 npm_config_* 不做布尔转换;
3. pkg-prebuilds-verify 用 `if (process.env.npm_config_build_from_source)` 判断,
字符串 "false" 在 JS 里是真值 -> 直接 exit 1 -> 强制源码编译;
4. node-hid 于是去编译它自带的 node-addon-api 3.2.1, 和现代 Node 头文件不兼容 -> 编译失败
-> 整个 npm install 挂掉。
而 node-hid 根本不需要编译 —— 它自带 N-API 预编译产物, 任何 ABI 都能加载。
真正需要按 Electron ABI 重编的只有 better-sqlite3 (非 N-API, 绑死 V8/ABI,
Electron 32 -> node ABI 128); 其余 (@lydell/node-pty / node-hid /
@serialport/bindings-cpp / usb) 都是 N-API 预编译, 重编既没必要又有害。
改动:
- postinstall 换成 `node scripts/postinstall.js`:
只重建 better-sqlite3, 装完**在 Electron 下真跑一次读写校验**, 失败就 exit 1
—— 把"启动即崩"提前到 install 阶段暴露
- package.json 加 `allowScripts` 白名单 (npm 11 新机制, 目前只提醒不拦截,
但迟早会拦; 顺便让 npm install 输出干净)
- AGENTS.md 坑 #3 改写成新规矩 + 完整根因链
- docs/windows-compat.md / docs/remote-terminal-forward-usb.md 里过时的
"postinstall 走 install-app-deps" 表述一并纠正
验证:
- npm run build ✅
- npm run typecheck ✅ node + web
- npm run selftest ✅ 64 通过 / 0 失败
- npm run selftest:sync ✅ 全部通过
- npm run package:linux ✅ 新 deb
- npm run selftest:package ✅ 4/4 (从 app.asar 真实 spawn pty)
138 lines
5.5 KiB
JSON
138 lines
5.5 KiB
JSON
{
|
|
"name": "local-net-msg",
|
|
"version": "0.1.0",
|
|
"private": true,
|
|
"description": "局域网即时通讯 (Electron + Vue 3) - 飞书风格",
|
|
"homepage": "https://github.com/localnetmsg/local-net-msg",
|
|
"author": "LocalNetMsg <dev@localnetmsg.local>",
|
|
"main": "out/main/index.js",
|
|
"allowScripts": {
|
|
"better-sqlite3": true,
|
|
"electron": true,
|
|
"esbuild": true,
|
|
"node-hid": true,
|
|
"@serialport/bindings-cpp": true,
|
|
"vue-demi": true
|
|
},
|
|
"scripts": {
|
|
"dev": "electron-vite dev",
|
|
"build": "electron-vite build",
|
|
"preview": "electron-vite preview",
|
|
"start": "electron-vite preview",
|
|
"typecheck:node": "tsc --noEmit -p tsconfig.node.json",
|
|
"typecheck:web": "vue-tsc --noEmit -p src/renderer/tsconfig.json",
|
|
"typecheck": "npm run typecheck:node && npm run typecheck:web",
|
|
"selftest:build": "esbuild scripts/selftest/main.ts --bundle --platform=node --format=cjs --target=node20 --outfile=scripts/selftest/.out/selftest.cjs --alias:electron=./scripts/selftest/electron-stub.cjs --alias:@lydell/node-pty=./scripts/selftest/pty-shim.cjs --external:better-sqlite3 --external:serialport --external:usb --external:node-hid --external:sudo-prompt --external:ws",
|
|
"selftest": "npm run selftest:build && cross-env ELECTRON_RUN_AS_NODE=1 electron scripts/selftest/.out/selftest.cjs",
|
|
"selftest:sync:build": "esbuild scripts/selftest/sync-e2e.ts --bundle --platform=node --format=cjs --target=node20 --outfile=scripts/selftest/.out/sync-e2e.cjs --alias:electron=./scripts/selftest/electron-stub.cjs --external:better-sqlite3 --external:serialport --external:usb --external:node-hid --external:sudo-prompt --external:ws",
|
|
"selftest:sync": "npm run selftest:sync:build && cross-env ELECTRON_RUN_AS_NODE=1 electron scripts/selftest/.out/sync-e2e.cjs",
|
|
"selftest:package": "cross-env ELECTRON_RUN_AS_NODE=1 electron scripts/selftest/packaging-check.cjs",
|
|
"package:win": "cross-env ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/ ELECTRON_BUILDER_BINARIES_MIRROR=https://npmmirror.com/mirrors/electron-builder-binaries/ electron-vite build && electron-builder --win --x64",
|
|
"package:mac": "cross-env ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/ ELECTRON_BUILDER_BINARIES_MIRROR=https://npmmirror.com/mirrors/electron-builder-binaries/ electron-vite build && electron-builder --mac",
|
|
"package:linux": "cross-env ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/ ELECTRON_BUILDER_BINARIES_MIRROR=https://npmmirror.com/mirrors/electron-builder-binaries/ electron-vite build && electron-builder --linux",
|
|
"package:dir": "cross-env ELECTRON_MIRROR=https://npmmirror.com/mirrors/electron/ ELECTRON_BUILDER_BINARIES_MIRROR=https://npmmirror.com/mirrors/electron-builder-binaries/ electron-vite build && electron-builder --dir",
|
|
"postinstall": "node scripts/postinstall.js"
|
|
},
|
|
"dependencies": {
|
|
"@element-plus/icons-vue": "^2.3.1",
|
|
"@lydell/node-pty": "^1.2.0-beta.12",
|
|
"@xterm/addon-fit": "^0.11.0",
|
|
"@xterm/addon-web-links": "^0.12.0",
|
|
"@xterm/xterm": "^6.0.0",
|
|
"better-sqlite3": "^11.5.0",
|
|
"electron-store": "^8.2.0",
|
|
"element-plus": "^2.8.4",
|
|
"highlight.js": "^11.10.0",
|
|
"markdown-it": "^14.3.0",
|
|
"node-hid": "^3.3.0",
|
|
"pinia": "^2.2.4",
|
|
"serialport": "^13.0.0",
|
|
"sudo-prompt": "^9.2.1",
|
|
"usb": "^3.0.1",
|
|
"ws": "^8.18.0"
|
|
},
|
|
"devDependencies": {
|
|
"@types/better-sqlite3": "^7.6.11",
|
|
"@types/markdown-it": "^14.1.2",
|
|
"@types/node": "^22.7.5",
|
|
"@types/ws": "^8.5.12",
|
|
"@vitejs/plugin-vue": "^5.1.4",
|
|
"cross-env": "^7.0.3",
|
|
"electron": "^32.1.2",
|
|
"electron-builder": "^24.13.3",
|
|
"electron-vite": "^2.3.0",
|
|
"typescript": "^5.6.2",
|
|
"vite": "^5.4.8",
|
|
"vue": "^3.5.10",
|
|
"vue-router": "^4.4.5",
|
|
"vue-tsc": "^2.1.6"
|
|
},
|
|
"build": {
|
|
"appId": "com.localnetmsg.app",
|
|
"productName": "LocalNetMsg",
|
|
"copyright": "Copyright © 2026",
|
|
"directories": {
|
|
"output": "dist-Electron",
|
|
"buildResources": "resources"
|
|
},
|
|
"npmRebuild": false,
|
|
"files": [
|
|
"out/**/*",
|
|
"package.json"
|
|
],
|
|
"asarUnpack": [
|
|
"**/node_modules/@lydell/node-pty/**/*",
|
|
"**/node_modules/@lydell/node-pty-*/**/*",
|
|
"**/node_modules/@node-usb/**/*",
|
|
"**/node_modules/usb/prebuilds/**/*",
|
|
"**/node_modules/@serialport/**/prebuilds/**/*",
|
|
"**/node_modules/node-hid/prebuilds/**/*"
|
|
],
|
|
"extraResources": [
|
|
{
|
|
"from": "resources/icon.png",
|
|
"to": "icon.png"
|
|
}
|
|
],
|
|
"win": {
|
|
"icon": "resources/icon.png",
|
|
"target": [
|
|
{
|
|
"target": "nsis",
|
|
"arch": [
|
|
"x64"
|
|
]
|
|
}
|
|
],
|
|
"artifactName": "${productName}-${version}-Setup.${ext}"
|
|
},
|
|
"nsis": {
|
|
"oneClick": false,
|
|
"perMachine": false,
|
|
"allowElevation": true,
|
|
"allowToChangeInstallationDirectory": true,
|
|
"createDesktopShortcut": true,
|
|
"createStartMenuShortcut": true,
|
|
"shortcutName": "LocalNetMsg"
|
|
},
|
|
"mac": {
|
|
"icon": "resources/icon.png",
|
|
"target": "dmg",
|
|
"category": "public.app-category.social-networking"
|
|
},
|
|
"linux": {
|
|
"icon": "resources/icons",
|
|
"target": [
|
|
"deb"
|
|
],
|
|
"category": "Network",
|
|
"synopsis": "LAN instant messaging",
|
|
"description": "LocalNetMsg — a LAN instant messaging desktop app.",
|
|
"maintainer": "LocalNetMsg <dev@localnetmsg.local>",
|
|
"desktop": {
|
|
"StartupWMClass": "local-net-msg"
|
|
}
|
|
}
|
|
}
|
|
}
|