From fb1351d82b07645ef9709203b7c129db2ee92e7e Mon Sep 17 00:00:00 2001 From: liangxu Date: Fri, 1 May 2026 16:32:12 +0800 Subject: [PATCH] feat(desktop-client): add afterPack hook to clean up unnecessary localization files and include certificate files for code signing --- apps/desktop-client/build/afterPack.cjs | 46 ++++++++++++++++++ ...rtificateSigningRequest.certSigningRequest | 16 ++++++ .../build/mac/developerID_application.cer | Bin 0 -> 1480 bytes .../build/mac/证书-liang0920.p12 | Bin 0 -> 3225 bytes apps/desktop-client/electron-builder.yml | 1 + deploy/.env.example | 6 --- 6 files changed, 63 insertions(+), 6 deletions(-) create mode 100644 apps/desktop-client/build/afterPack.cjs create mode 100644 apps/desktop-client/build/mac/CertificateSigningRequest.certSigningRequest create mode 100644 apps/desktop-client/build/mac/developerID_application.cer create mode 100644 apps/desktop-client/build/mac/证书-liang0920.p12 diff --git a/apps/desktop-client/build/afterPack.cjs b/apps/desktop-client/build/afterPack.cjs new file mode 100644 index 0000000..d87198a --- /dev/null +++ b/apps/desktop-client/build/afterPack.cjs @@ -0,0 +1,46 @@ +// electron-builder afterPack hook — 在签名前裁掉不要的本地化文件 +// 解决 electron-builder 25 + Electron 41 不识别 *_NEUTER / *_MASCULINE / *_FEMININE 变体的 bug +// 220 个 .lproj → 仅保留 en* 和 zh_CN*,签名时间从 ~10 分钟降到 ~30 秒 +const fs = require('fs'); +const path = require('path'); + +// 只保留 en 和 zh_CN(性别变体 *_NEUTER/_MASCULINE/_FEMININE 在调用方已剥离) +const KEEP = new Set(['en', 'zh_CN']); +function shouldKeepLocale(base) { + return KEEP.has(base); +} + +exports.default = async function afterPack(context) { + const { appOutDir, packager } = context; + const productFilename = packager.appInfo.productFilename; + const appPath = path.join(appOutDir, `${productFilename}.app`); + + // 两处都要清理:app 自己的 Resources + Electron Framework 的 Resources + const dirs = [ + path.join(appPath, 'Contents/Resources'), + path.join(appPath, 'Contents/Frameworks/Electron Framework.framework/Versions/A/Resources'), + ]; + + let removed = 0; + let kept = 0; + + for (const dir of dirs) { + if (!fs.existsSync(dir)) continue; + for (const entry of fs.readdirSync(dir)) { + if (!entry.endsWith('.lproj')) continue; + // 去掉 .lproj 后缀和性别变体后缀,得到基础语言代码 + const base = entry + .replace(/\.lproj$/, '') + .replace(/_(NEUTER|MASCULINE|FEMININE)$/, ''); + + if (shouldKeepLocale(base)) { + kept++; + } else { + fs.rmSync(path.join(dir, entry), { recursive: true, force: true }); + removed++; + } + } + } + + console.log(`[afterPack] 本地化清理:保留 ${kept} 个,删除 ${removed} 个 .lproj`); +}; diff --git a/apps/desktop-client/build/mac/CertificateSigningRequest.certSigningRequest b/apps/desktop-client/build/mac/CertificateSigningRequest.certSigningRequest new file mode 100644 index 0000000..7d2949d --- /dev/null +++ b/apps/desktop-client/build/mac/CertificateSigningRequest.certSigningRequest @@ -0,0 +1,16 @@ +-----BEGIN CERTIFICATE REQUEST----- +MIIChTCCAW0CAQAwQDEgMB4GCSqGSIb3DQEJARYRMjQ2NjU4OTgwOEBxcS5jb20x +DzANBgNVBAMMBuaigeaXrTELMAkGA1UEBhMCQ04wggEiMA0GCSqGSIb3DQEBAQUA +A4IBDwAwggEKAoIBAQDTFpNTzOEjh0KnvpRBOE37Et96ELFbm2L5mpkBpUSwXxWH +Z9Bla02CkUZUivwfD/+YISVQfu/pQ/S9jzCkYCYbYykSNz5MYP2S/t8wAGJarys8 +RdmVUt/2AnIBaWzKngqKgFr9uyZEsr+c0/6zuGvQrxY3YHm2Qe2jyYpcW4zJQ3+M +AIDQw8yZgQu1ybi4Y7RP3wDeUWSFunxcoQozvtWycmZDHbzigOeiiYdIxfwl1naX +IRLNFxagcZheLRoHLNjZbnsjtAxAKtM6V6bgF8lQxom+evXaSkbaeiKZUFO4FQ+j +8KJorgySauVLzec/1WKyfKNlj0+0FV388M7mqUbvAgMBAAGgADANBgkqhkiG9w0B +AQsFAAOCAQEAJgasLwwyvvciKv4fvhS1lQHKvRUSURQmrWmiQIZ0rzdD8f+tXa7/ +7yS1p+h8IRx9LNNzYVA2T/triD44DDg7MmpXKxHIvhXFZbxj0gP73DJPtXoOIwUq +OCHjAZWIvFfDGGmFNpcIPT0iq/++8b15IuLrgh2fB+pL+k2b/k88ZAAZR4fZXwFe +CFOxcfJG+wCnV7yEmIMWlHtd6Sd61pz9VtGzeryhyL1YL9JAC5+VJWxzj57gs80R +2tRLbEEETGH2LMqk6FVeKnEO9CioswrIRqrfcQuyt9DCxXCDYOPYNE1f8QzSs/qH +SsQOkCged041feSDfmAUvR3ZbuUg6rUS2w== +-----END CERTIFICATE REQUEST----- diff --git a/apps/desktop-client/build/mac/developerID_application.cer b/apps/desktop-client/build/mac/developerID_application.cer new file mode 100644 index 0000000000000000000000000000000000000000..2d3f486c3d3dc650e6f02200e410f117b2028d91 GIT binary patch literal 1480 zcmY*Z4NOy46z+X}Eu*}O2o%Q@A0SMiz-hlsJPTtJ67@-6s^`B{zBJ-t(RF-E+@( zph?gVO?Yb~9|IV+G9~BKhi!wJ9WQDl%g#afU!YiM?OhUC@=OeXjerLa$b6xXke`6_ ziS^-34wI?XF?up8oD5_1tXid}l&o5-Ar;wdhE}g;^JF&Ansc`yu$^+5J+$Kt5g}6O zbeRkprJ?*R9zuI8Ar87YiRGJMAe6x%xm+$wauNr~kSTv{!X#*{kvYTFLXmZ~XIagR zlm>th1qR3O3{Tt?y*Ey_6^6`{3s^>u%eFu*gbY{a8W6>3wNi7C-0%kMWua%YETki} zpXW?01ukc80&YtS1q3|43E1+W35YNg0K8F2P2BZ6?xowm=sl(g-u>UIiTssc?LU?N zZ~aN|d3bxOW9h*W=J0OQClT@Gv+Hc<>RdfyiXJ}*GheBKpQU-eLwT(V3XM*CS^a7P z^3s#qe75emSsOd?52gp|%pXpR%8Qd;e&ZS5@!hARuR41UkF-gG((<|$Q_Vx=$@?pZ z!alC#6_4~?KWVhNIMmZab?uqp{l1qz`gLLQ8Bsv*SchH}w)WdUiYJ@ON+SnmJ;rlR zxUL#@k~Dr)cfi-#O8VQ=#`u5-noU>)G-2Bzf$F)|9)LL3O75lSk^5 zdKUc|4B1(XfmBiyqhseWDuiLUr6IX{pmt413NfHlTB)Z=meFS+fQBY1t%g=}Dl?E; z6`5^dq{|ZNvcWleS za6V>Lj9y>#dc07y5V+!YgsmJd=pS-l5)$7V2Q-6F&!8z}d5ig>gtP{DVVCc#{;Lk|BOH8kXO;r;CBPO8~yjpy}|h4z0%1v%;|!0?s(D}g~Z|R<}F8ZADw>U vAt;Z&2+XQ0kDinz7FLoKsnw|oTb_2Xk^5q^&#pVvw|**Bd;c%*?X~{{cQ*lE literal 0 HcmV?d00001 diff --git a/apps/desktop-client/build/mac/证书-liang0920.p12 b/apps/desktop-client/build/mac/证书-liang0920.p12 new file mode 100644 index 0000000000000000000000000000000000000000..f9ef45f823360c77723d635ce7d077625ae0970f GIT binary patch literal 3225 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