fix: preserve native dependencies for release targets

This commit is contained in:
hy committed 2026-07-15 15:01:49 +08:00
1 parent 3bc06dde08
commit 5487324c26
6 files changed
+97 -42

No files matched your search

+4
View File
@@ -113,6 +113,10 @@ pnpm run package:audit:summary
- macOS x64:在同一台 Mac 的 Rosetta x64 Node/Python 环境构建。
- GitHub Actions 不响应 Tag push,不保存安装包 Artifact,也不构建 macOS 或 Linux。
`pnpm-workspace.yaml` 固定记录 macOS arm64、macOS x64 和 Windows x64 的可选原生依赖。打包时再按当前 OS/CPU 删除不兼容包,不能只用开发机架构生成锁文件。
当前 Intel Mac 依赖 `@lancedb/lancedb 0.22.3`,这是项目已验证且包含 `darwin-x64` 原生包的稳定版本。升级 LanceDB 前必须先确认 npm 中同时存在 arm64、x64 和 Windows x64 对应包,并重新执行三个架构的真实启动测试。
Windows GitHub Actions 只允许手动 `workflow_dispatch`,并按 Tag 设置 concurrency。工作流步骤固定为:
1. 检出输入的 annotated Tag;
+2 -2
View File
@@ -1,6 +1,6 @@
{
"name": "ncurator",
"version": "0.1.5",
"version": "0.1.6",
"description": "An Electron application with React and TypeScript",
"main": "./out/main/index.js",
"author": "example.com",
@@ -67,7 +67,7 @@
"@electron-toolkit/utils": "^4.0.0",
"@huggingface/transformers": "^3.8.1",
"@js-preview/docx": "^1.6.4",
"@lancedb/lancedb": "^0.23.0",
"@lancedb/lancedb": "0.22.3",
"@langchain/community": "^1.1.1",
"@langchain/core": "^1.1.44",
"@langchain/deepseek": "^1.0.25",
+47 -36
View File
@@ -27,11 +27,11 @@ importers:
specifier: ^1.6.4
version: 1.6.4(core-js@3.48.0)
'@lancedb/lancedb':
specifier: ^0.23.0
version: 0.23.0(apache-arrow@17.0.0)
specifier: 0.22.3
version: 0.22.3(apache-arrow@17.0.0)
'@langchain/community':
specifier: ^1.1.1
version: 1.1.2(@browserbasehq/sdk@2.14.0(encoding@0.1.13))(@browserbasehq/stagehand@3.5.0(@cfworker/json-schema@4.1.1)(encoding@0.1.13)(playwright-core@1.58.2)(zod@4.3.6))(@huggingface/transformers@3.8.1)(@ibm-cloud/watsonx-ai@1.7.5)(@lancedb/lancedb@0.23.0(apache-arrow@17.0.0))(@langchain/core@1.1.44(@opentelemetry/api@1.9.0)(openai@6.36.0(ws@8.21.0(bufferutil@4.1.0))(zod@4.3.6)))(@opentelemetry/api@1.9.0)(@smithy/util-utf8@2.3.0)(better-sqlite3@12.11.1)(cheerio@1.2.0)(crypto-js@4.2.0)(google-auth-library@10.7.0)(ibm-cloud-sdk-core@5.4.5)(ignore@5.3.2)(jsdom@26.1.0(bufferutil@4.1.0))(jsonwebtoken@9.0.3)(lodash@4.17.21)(mammoth@1.11.0)(openai@6.36.0(ws@8.21.0(bufferutil@4.1.0))(zod@4.3.6))(pdf-parse@1.1.1)(playwright@1.58.2)(ws@8.21.0(bufferutil@4.1.0))
version: 1.1.2(@browserbasehq/sdk@2.14.0(encoding@0.1.13))(@browserbasehq/stagehand@3.5.0(@cfworker/json-schema@4.1.1)(encoding@0.1.13)(playwright-core@1.58.2)(zod@4.3.6))(@huggingface/transformers@3.8.1)(@ibm-cloud/watsonx-ai@1.7.5)(@lancedb/lancedb@0.22.3(apache-arrow@17.0.0))(@langchain/core@1.1.44(@opentelemetry/api@1.9.0)(openai@6.36.0(ws@8.21.0(bufferutil@4.1.0))(zod@4.3.6)))(@opentelemetry/api@1.9.0)(@smithy/util-utf8@2.3.0)(better-sqlite3@12.11.1)(cheerio@1.2.0)(crypto-js@4.2.0)(google-auth-library@10.7.0)(ibm-cloud-sdk-core@5.4.5)(ignore@5.3.2)(jsdom@26.1.0(bufferutil@4.1.0))(jsonwebtoken@9.0.3)(lodash@4.17.21)(mammoth@1.11.0)(openai@6.36.0(ws@8.21.0(bufferutil@4.1.0))(zod@4.3.6))(pdf-parse@1.1.1)(playwright@1.58.2)(ws@8.21.0(bufferutil@4.1.0))
'@langchain/core':
specifier: ^1.1.44
version: 1.1.44(@opentelemetry/api@1.9.0)(openai@6.36.0(ws@8.21.0(bufferutil@4.1.0))(zod@4.3.6))
@@ -1240,55 +1240,62 @@ packages:
peerDependencies:
core-js: ^3.0.0
'@lancedb/lancedb-darwin-arm64@0.23.0':
resolution: {integrity: sha512-8w0sMCNMwBv2kv5+fczGeSVlNOL+BOKChSsO4usM0hMw3PmxasONPctQBsESDuPS8lQ6/AKAQc2HT/ddd5Mg5w==}
'@lancedb/lancedb-darwin-arm64@0.22.3':
resolution: {integrity: sha512-oP2Kic51nLqs27Xo+AzSVlcMgmmfZbU/PseQ3KBtU92rczO5DYU2St1Y7qDUWcjw+RF3H2v/DKzYed16h1wCBQ==}
engines: {node: '>= 18'}
cpu: [arm64]
os: [darwin]
'@lancedb/lancedb-linux-arm64-gnu@0.23.0':
resolution: {integrity: sha512-+xse2IspO7hbuHT4H62q8Ct00fTojnuBxXp1X1I3/27dDvW8E+/itFiJuTZ0YMaJc7nNr9qh9YFXZ9hZdEmReg==}
'@lancedb/lancedb-darwin-x64@0.22.3':
resolution: {integrity: sha512-wOwgZkvBgQM8asjolz4NeyPa8W/AjZv4fwyQxJhTqKTGlB3ntrpdn1m84K5qncTmFFDcDfGgZ4DkNVkVK+ydoQ==}
engines: {node: '>= 18'}
cpu: [x64]
os: [darwin]
'@lancedb/lancedb-linux-arm64-gnu@0.22.3':
resolution: {integrity: sha512-YUbFuBKQniTZOR9h2/es1f7lDzdHNt8qXs5GaqFmLQv2GNWpnvKXVA/vVffhCNpFB5nV132o1VhXW3KoMubPsw==}
engines: {node: '>= 18'}
cpu: [arm64]
os: [linux]
libc: [glibc]
'@lancedb/lancedb-linux-arm64-musl@0.23.0':
resolution: {integrity: sha512-c2UCtGoYjA3oDdw5y3RLK7J2th3rSjYBng+1I03vU9g092y8KATAJO/lV2AtyxSC+esSuyY1dMEaj8ADcXjZAA==}
'@lancedb/lancedb-linux-arm64-musl@0.22.3':
resolution: {integrity: sha512-jVRMtXxxYaDlZSaclCIHB2N+NJvQ1Fj9EaPeBx+HxG2VqUg0vXKef+yiaD2aGo9sAH6mMmkKJsrPhwABpUC4rQ==}
engines: {node: '>= 18'}
cpu: [arm64]
os: [linux]
libc: [musl]
'@lancedb/lancedb-linux-x64-gnu@0.23.0':
resolution: {integrity: sha512-OPL7tK3JCTx43ZxvbVs+CljfCer0KrojANQbcJ2V4VAp6XBhKx1sBAlIVGuCrd93pA8UOUP3iHsM7aglPo6rCg==}
'@lancedb/lancedb-linux-x64-gnu@0.22.3':
resolution: {integrity: sha512-co7idTwvNAtbFoFHojhHlTpKsydOm5sZfbtAsQRdoa7g6a61yIrqrMm8D7Ngh756JfzZLFQBMkDUZEW3X4vP/g==}
engines: {node: '>= 18'}
cpu: [x64]
os: [linux]
libc: [glibc]
'@lancedb/lancedb-linux-x64-musl@0.23.0':
resolution: {integrity: sha512-1ZEoQDwOrKvwPyAG+95/r1NYqX8Ca5bRek8Vr62CzWCEmHd/pFeEGWZ5STrkh+Bt3GLdi2JOivFtRbmuBAJypQ==}
'@lancedb/lancedb-linux-x64-musl@0.22.3':
resolution: {integrity: sha512-+ipFsn5PCODK7mOMq1gZ5OAZWks5YlgmjAlnYMmU8XxvaK0b6lZdA3s1hTmBaBO9+wv+31ulO55oBN4/U8Yldg==}
engines: {node: '>= 18'}
cpu: [x64]
os: [linux]
libc: [musl]
'@lancedb/lancedb-win32-arm64-msvc@0.23.0':
resolution: {integrity: sha512-OuD1mkrgXvijRlXdbx3LvfuorO04FD5qHegnTOWGXh1sIwwrvvhcJAvXUGBNLY4n/lsWvA+xTjtMwRjUitvPKg==}
'@lancedb/lancedb-win32-arm64-msvc@0.22.3':
resolution: {integrity: sha512-E0XywJYnelIe4pzOlvog+aMHKt5ChW27tgmT2V80Z6PXcX6eN9I69Fj0Q6DK6z1YCTPIPu6Na1Hd6d4GqUNKPw==}
engines: {node: '>= 18'}
cpu: [arm64]
os: [win32]
'@lancedb/lancedb-win32-x64-msvc@0.23.0':
resolution: {integrity: sha512-5ve1hvVtp8zWxSE9A+MOQaicXl2Rn0ZG/NUaMTjTD3/CQHPKFmtrqDnM5khoPICTj2O2b10F6mn4cUzl5PASgA==}
'@lancedb/lancedb-win32-x64-msvc@0.22.3':
resolution: {integrity: sha512-/1feFnjz5MIhzXOEU4+1OeGwpAFYczGfefuOGZRsmGWDdt4V6/fza7Hkkxyb2OnTzqpBfy6BdW2+iBguE1JMyQ==}
engines: {node: '>= 18'}
cpu: [x64]
os: [win32]
'@lancedb/lancedb@0.23.0':
resolution: {integrity: sha512-aYrIoEG24AC+wILCL57Ius/Y4yU+xFHDPKLvmjzzN4byAjzeIGF0TC86S5RBt4Ji+dxS7yIWV5Q/gE5/fybIFQ==}
'@lancedb/lancedb@0.22.3':
resolution: {integrity: sha512-nRC0fkg+d7dzCtudKHT+VH7znk6KUXRZyuS6HJYNnIrbvXBxaT6wAPjEbf70KTuqvP2znj48Zg+kiwRqkRnAJw==}
engines: {node: '>= 18'}
cpu: [x64, arm64]
os: [darwin, linux, win32]
peerDependencies:
apache-arrow: '>=15.0.0 <=18.1.0'
@@ -7947,39 +7954,43 @@ snapshots:
dependencies:
core-js: 3.48.0
'@lancedb/lancedb-darwin-arm64@0.23.0':
'@lancedb/lancedb-darwin-arm64@0.22.3':
optional: true
'@lancedb/lancedb-linux-arm64-gnu@0.23.0':
'@lancedb/lancedb-darwin-x64@0.22.3':
optional: true
'@lancedb/lancedb-linux-arm64-musl@0.23.0':
'@lancedb/lancedb-linux-arm64-gnu@0.22.3':
optional: true
'@lancedb/lancedb-linux-x64-gnu@0.23.0':
'@lancedb/lancedb-linux-arm64-musl@0.22.3':
optional: true
'@lancedb/lancedb-linux-x64-musl@0.23.0':
'@lancedb/lancedb-linux-x64-gnu@0.22.3':
optional: true
'@lancedb/lancedb-win32-arm64-msvc@0.23.0':
'@lancedb/lancedb-linux-x64-musl@0.22.3':
optional: true
'@lancedb/lancedb-win32-x64-msvc@0.23.0':
'@lancedb/lancedb-win32-arm64-msvc@0.22.3':
optional: true
'@lancedb/lancedb@0.23.0(apache-arrow@17.0.0)':
'@lancedb/lancedb-win32-x64-msvc@0.22.3':
optional: true
'@lancedb/lancedb@0.22.3(apache-arrow@17.0.0)':
dependencies:
apache-arrow: 17.0.0
reflect-metadata: 0.2.2
optionalDependencies:
'@lancedb/lancedb-darwin-arm64': 0.23.0
'@lancedb/lancedb-linux-arm64-gnu': 0.23.0
'@lancedb/lancedb-linux-arm64-musl': 0.23.0
'@lancedb/lancedb-linux-x64-gnu': 0.23.0
'@lancedb/lancedb-linux-x64-musl': 0.23.0
'@lancedb/lancedb-win32-arm64-msvc': 0.23.0
'@lancedb/lancedb-win32-x64-msvc': 0.23.0
'@lancedb/lancedb-darwin-arm64': 0.22.3
'@lancedb/lancedb-darwin-x64': 0.22.3
'@lancedb/lancedb-linux-arm64-gnu': 0.22.3
'@lancedb/lancedb-linux-arm64-musl': 0.22.3
'@lancedb/lancedb-linux-x64-gnu': 0.22.3
'@lancedb/lancedb-linux-x64-musl': 0.22.3
'@lancedb/lancedb-win32-arm64-msvc': 0.22.3
'@lancedb/lancedb-win32-x64-msvc': 0.22.3
'@langchain/classic@1.0.8(@langchain/core@1.1.44(@opentelemetry/api@1.9.0)(openai@6.36.0(ws@8.21.0(bufferutil@4.1.0))(zod@4.3.6)))(@opentelemetry/api@1.9.0)(cheerio@1.2.0)(openai@6.36.0(ws@8.21.0(bufferutil@4.1.0))(zod@4.3.6))(ws@8.21.0(bufferutil@4.1.0))':
dependencies:
@@ -8003,7 +8014,7 @@ snapshots:
- openai
- ws
'@langchain/community@1.1.2(@browserbasehq/sdk@2.14.0(encoding@0.1.13))(@browserbasehq/stagehand@3.5.0(@cfworker/json-schema@4.1.1)(encoding@0.1.13)(playwright-core@1.58.2)(zod@4.3.6))(@huggingface/transformers@3.8.1)(@ibm-cloud/watsonx-ai@1.7.5)(@lancedb/lancedb@0.23.0(apache-arrow@17.0.0))(@langchain/core@1.1.44(@opentelemetry/api@1.9.0)(openai@6.36.0(ws@8.21.0(bufferutil@4.1.0))(zod@4.3.6)))(@opentelemetry/api@1.9.0)(@smithy/util-utf8@2.3.0)(better-sqlite3@12.11.1)(cheerio@1.2.0)(crypto-js@4.2.0)(google-auth-library@10.7.0)(ibm-cloud-sdk-core@5.4.5)(ignore@5.3.2)(jsdom@26.1.0(bufferutil@4.1.0))(jsonwebtoken@9.0.3)(lodash@4.17.21)(mammoth@1.11.0)(openai@6.36.0(ws@8.21.0(bufferutil@4.1.0))(zod@4.3.6))(pdf-parse@1.1.1)(playwright@1.58.2)(ws@8.21.0(bufferutil@4.1.0))':
'@langchain/community@1.1.2(@browserbasehq/sdk@2.14.0(encoding@0.1.13))(@browserbasehq/stagehand@3.5.0(@cfworker/json-schema@4.1.1)(encoding@0.1.13)(playwright-core@1.58.2)(zod@4.3.6))(@huggingface/transformers@3.8.1)(@ibm-cloud/watsonx-ai@1.7.5)(@lancedb/lancedb@0.22.3(apache-arrow@17.0.0))(@langchain/core@1.1.44(@opentelemetry/api@1.9.0)(openai@6.36.0(ws@8.21.0(bufferutil@4.1.0))(zod@4.3.6)))(@opentelemetry/api@1.9.0)(@smithy/util-utf8@2.3.0)(better-sqlite3@12.11.1)(cheerio@1.2.0)(crypto-js@4.2.0)(google-auth-library@10.7.0)(ibm-cloud-sdk-core@5.4.5)(ignore@5.3.2)(jsdom@26.1.0(bufferutil@4.1.0))(jsonwebtoken@9.0.3)(lodash@4.17.21)(mammoth@1.11.0)(openai@6.36.0(ws@8.21.0(bufferutil@4.1.0))(zod@4.3.6))(pdf-parse@1.1.1)(playwright@1.58.2)(ws@8.21.0(bufferutil@4.1.0))':
dependencies:
'@browserbasehq/stagehand': 3.5.0(@cfworker/json-schema@4.1.1)(encoding@0.1.13)(playwright-core@1.58.2)(zod@4.3.6)
'@ibm-cloud/watsonx-ai': 1.7.5
@@ -8021,7 +8032,7 @@ snapshots:
optionalDependencies:
'@browserbasehq/sdk': 2.14.0(encoding@0.1.13)
'@huggingface/transformers': 3.8.1
'@lancedb/lancedb': 0.23.0(apache-arrow@17.0.0)
'@lancedb/lancedb': 0.22.3(apache-arrow@17.0.0)
'@smithy/util-utf8': 2.3.0
better-sqlite3: 12.11.1
cheerio: 1.2.0
+8
View File
@@ -1,6 +1,14 @@
packages:
- .
supportedArchitectures:
os:
- darwin
- win32
cpu:
- arm64
- x64
allowBuilds:
'@google/genai': true
better-sqlite3: true
+24 -4
View File
@@ -260,6 +260,22 @@ const stripSourceMapReferences = () => {
const pruneNodeModules = () => {
const nodeModules = path.join(STAGE_DIR, 'node_modules')
const targetPrebuildDirectory = `${process.platform}-${process.arch}`
const supportsCurrentTarget = (values, current) => {
if (!Array.isArray(values) || values.length === 0) return true
const normalized = values.map((value) => String(value).trim()).filter(Boolean)
if (normalized.includes(`!${current}`)) return false
const allowed = normalized.filter((value) => !value.startsWith('!'))
return allowed.length === 0 || allowed.includes(current)
}
const isIncompatiblePackage = (directory) => {
const packageJsonPath = path.join(directory, 'package.json')
if (!fs.existsSync(packageJsonPath)) return false
const packageJson = JSON.parse(fs.readFileSync(packageJsonPath, 'utf8'))
return (
!supportsCurrentTarget(packageJson.os, process.platform) ||
!supportsCurrentTarget(packageJson.cpu, process.arch)
)
}
const prunePlatformPrebuilds = (directory) => {
for (const entry of fs.readdirSync(directory, { withFileTypes: true })) {
if (!entry.isDirectory()) continue
@@ -281,6 +297,10 @@ const pruneNodeModules = () => {
const lowerName = entry.name.toLowerCase()
if (entry.isSymbolicLink()) continue
if (entry.isDirectory()) {
if (isIncompatiblePackage(entryPath)) {
fs.rmSync(entryPath, { recursive: true, force: true })
continue
}
if (lowerName === 'prebuilds') {
prunePlatformPrebuilds(entryPath)
}
@@ -433,15 +453,15 @@ const main = () => {
writeStageLockfile(runtimeDependencies)
installRuntimeDependencies()
fs.rmSync(path.join(STAGE_DIR, 'pnpm-lock.yaml'), { force: true })
pruneCompiledOutput()
pruneNodeModules()
pruneStagedResources()
const packagedDependencies = collectInstalledTopLevelDependencies()
fs.writeFileSync(
path.join(STAGE_DIR, 'package.json'),
`${JSON.stringify({ ...stagePackage, dependencies: packagedDependencies }, null, 2)}\n`
)
fs.rmSync(path.join(STAGE_DIR, 'pnpm-lock.yaml'), { force: true })
pruneCompiledOutput()
pruneNodeModules()
pruneStagedResources()
stripSourceMapReferences()
const audit = spawnSync(
@@ -86,11 +86,23 @@ describe('app update publish config', () => {
})
it('keeps the complete installed production dependency closure', async () => {
const packageJson = JSON.parse(await readFile(path.resolve('package.json'), 'utf8'))
const packageStage = await readFile(path.resolve('scripts/prepare-package-stage.mjs'), 'utf8')
expect(packageStage).toContain('collectInstalledTopLevelDependencies')
expect(packageStage).toContain('dependencies: packagedDependencies')
expect(packageStage).toContain('isIncompatiblePackage')
expect(packageStage).not.toContain("name.startsWith('history.')")
const workspaceConfig = await readFile(path.resolve('pnpm-workspace.yaml'), 'utf8')
expect(workspaceConfig).toContain('supportedArchitectures:')
expect(workspaceConfig).toContain('- win32')
expect(workspaceConfig).toContain('- x64')
expect(packageJson.dependencies['@lancedb/lancedb']).toBe('0.22.3')
const lockfile = await readFile(path.resolve('pnpm-lock.yaml'), 'utf8')
expect(lockfile).toContain("'@lancedb/lancedb-darwin-x64@0.22.3':")
expect(lockfile).toContain("'@lancedb/lancedb-win32-x64-msvc@0.22.3':")
})
it('requires local Rosetta builds and stable macOS signatures', async () => {