From 7a4d39153891d743f5ef3edc7a3ab8d44a66dea3 Mon Sep 17 00:00:00 2001
From: Jacob <hlnie@tohours.com>
Date: 星期一, 12 十月 2026 16:19:23 +0800
Subject: [PATCH] 发布
---
scripts/publish.js | 143 +++++++++++++++++++++++++----------------------
1 files changed, 77 insertions(+), 66 deletions(-)
diff --git a/scripts/publish.js b/scripts/publish.js
index 9d2f542..2d9a9cc 100644
--- a/scripts/publish.js
+++ b/scripts/publish.js
@@ -1,20 +1,18 @@
/**
- * HBuilderX CLI 鍛戒护琛屽彂甯冿細鎸夌幆澧冨彂甯冨井淇″皬绋嬪簭
+ * 鍛戒护琛屽彂琛岋紙涓嶄笂浼狅級锛� 鑷姩鐢ㄥ井淇″紑鍙戣�呭伐鍏锋墦寮�浜х墿
*
* 鐢ㄦ硶锛�
- * node scripts/publish.js sit # 缂栬瘧 + 涓婁紶鍒� SIT 灏忕▼搴忥紙寰俊 CI锛屾棤闇�鎵撳紑寰俊寮�鍙戣�呭伐鍏凤級
- * node scripts/publish.js prod # 缂栬瘧 + 涓婁紶鍒� PROD 灏忕▼搴�
- * node scripts/publish.js sit --local # 鍙湰鍦扮紪璇戯紝涓嶄笂浼�
- * node scripts/publish.js sit --dry-run # 鍙墦鍗板皢瑕佹墽琛岀殑鍛戒护
- * node scripts/publish.js sit --version 2.0.0 --robot 3 # 棰濆鍙傛暟鍘熸牱閫忎紶缁� cli
+ * node scripts/publish.js sit # 鍙戣 SIT 鐗堟湰骞舵墦寮�寰俊寮�鍙戣�呭伐鍏�
+ * node scripts/publish.js prod # 鍙戣 PROD 鐗堟湰骞舵墦寮�寰俊寮�鍙戣�呭伐鍏�
+ * node scripts/publish.js sit --sync # 鍚屾椂鎶� appid 鍚屾杩� manifest.json锛堥粯璁や笉鍔� manifest锛�
+ * node scripts/publish.js sit --no-open # 鍙紪璇戯紝涓嶆墦寮�寰俊寮�鍙戣�呭伐鍏�
+ * node scripts/publish.js sit --dry-run # 鍙墦鍗板皢瑕佹墽琛岀殑鍛戒护
*
- * 鐜鐩稿叧鐨勫�肩粺涓�鍙栬嚜 config/env/<env>.js锛堝敮涓�鏁版嵁婧愶級锛�
- * - 鎺ュ彛/鍩嬬偣绛夎繍琛屾椂鍙傛暟锛氬寘鍐呰嚜鍔ㄦ寜灏忕▼搴� appid 璇嗗埆锛屾棤闇�鍦ㄦ澶勭悊
- * - APPID锛氫綔涓� --appid 浼犵粰寰俊 CI 涓婁紶
+ * 鐜鍊肩粺涓�鍙栬嚜 config/env/<env>.js锛堝敮涓�鏁版嵁婧愶級锛屾帴鍙e湴鍧�绛夎繍琛屾椂鍙傛暟鐢卞寘鍐呰嚜鍔ㄨ瘑鍒紝
+ * 鏈剼鏈彧璐熻矗璁┾�滅紪璇戞湡 appid鈥濅笌鐩爣鐜涓�鑷� 鈥斺�� 寰俊寮�鍙戣�呭伐鍏锋墦寮�鐨勪骇鐗� appid锛�
+ * 灏辨槸 unpackage/dist/build/mp-weixin/project.config.json 閲岀殑 appid锛堟瀯寤烘椂鐢� manifest 鐢熸垚锛夈��
*
- * 瀵嗛挜鏂囦欢锛歬eys/private.<env>.key
- * 鑾峰彇鏂瑰紡锛氬井淇″叕浼楀钩鍙� 鈫� 寮�鍙戠鐞� 鈫� 寮�鍙戣缃� 鈫� 灏忕▼搴忎唬鐮佷笂浼� 鈫� 鐢熸垚涓婁紶瀵嗛挜
- * 娉ㄦ剰锛氬瘑閽ュ睘浜庢満瀵嗭紝宸查�氳繃 .gitignore 鎺掗櫎锛屽垏鍕挎彁浜�
+ * 榛樿绛栫暐锛氫笉鍔� manifest.json锛堜粨搴撲繚鎸� prod 鍩虹嚎锛実it 鏃犲櫔闊筹級锛屽彧鍥炲啓鏈窡韪殑浜х墿鏂囦欢銆�
*/
const { spawnSync } = require('child_process');
const fs = require('fs');
@@ -22,19 +20,21 @@
const ROOT = path.resolve(__dirname, '..');
const ENV_DIR = path.join(ROOT, 'config', 'env');
+const DIST_DIR = path.join(ROOT, 'unpackage', 'dist', 'build', 'mp-weixin');
+const DIST_CONFIG = path.join(DIST_DIR, 'project.config.json');
-// HBuilderX cli.exe 璺緞锛氫紭鍏堣鐜鍙橀噺锛屼究浜庢崲鏈哄櫒 / 鎹㈠畨瑁呬綅缃�
+// 澶栭儴宸ュ叿璺緞锛氬彲鐢ㄧ幆澧冨彉閲忚鐩栵紝渚夸簬鎹㈡満鍣�
const HX_CLI = process.env.HBUILDERX_CLI || 'C:\\Users\\Administrator\\Desktop\\HBuilderX\\cli.exe';
+const WX_CLI = process.env.WX_DEVTOOLS_CLI || 'D:\\Program Files (x86)\\Tencent\\寰俊web寮�鍙戣�呭伐鍏穃\cli.bat';
const argv = process.argv.slice(2);
const envName = (argv.find(function(a) { return a.charAt(0) !== '-'; }) || '').trim();
-const localOnly = argv.indexOf('--local') > -1;
+const syncManifest = argv.indexOf('--sync') > -1;
+const noOpen = argv.indexOf('--no-open') > -1;
const dryRun = argv.indexOf('--dry-run') > -1;
-// 榛樿涓嶆敼 manifest.json锛氫笂浼犵敤 --appid 鎸囧畾鐩爣灏忕▼搴忥紝缂栬瘧浜х墿閲岀殑 appid 涓嶅弬涓庢牎楠屻��
-// 鑻ラ亣鍒颁笂浼犲け璐�/appid 涓嶄竴鑷达紝鍔� --sync-manifest 鍏堝悓姝� manifest 鍐嶅彂甯冦��
-const syncManifest = argv.indexOf('--sync-manifest') > -1;
-const OWN_ARGS = ['--local', '--dry-run', '--sync-manifest'];
-// 閫忎紶缁� cli 鐨勯澶栧弬鏁帮紙淇濈暀 "鍙傛暟 鍊�" 鐨勬垚瀵瑰叧绯伙紝濡� --robot 2锛�
+
+const OWN_ARGS = ['--sync', '--no-open', '--dry-run'];
+// 閫忎紶缁� HBuilderX cli 鐨勯澶栧弬鏁帮紙淇濈暀 "鍙傛暟 鍊�" 鎴愬鍏崇郴锛�
const passthrough = [];
let envNameSkipped = false;
argv.forEach(function(a) {
@@ -47,23 +47,26 @@
});
function fail(msg) {
- console.error('[publish] ' + msg);
+ console.error('[release] ' + msg);
process.exit(1);
}
-function gitShortHash() {
- const res = spawnSync('git', ['rev-parse', '--short', 'HEAD'], { cwd: ROOT, encoding: 'utf8' });
- return res.status === 0 ? String(res.stdout).trim() : '';
+function readAppId(file) {
+ try {
+ return JSON.parse(fs.readFileSync(file, 'utf8')).appid || '';
+ } catch (e) {
+ return '';
+ }
}
-function readManifestVersion() {
- try {
- const txt = fs.readFileSync(path.join(ROOT, 'manifest.json'), 'utf8');
- const m = txt.match(/"versionName"\s*:\s*"([^"]*)"/);
- return m ? m[1] : '1.0.0';
- } catch (e) {
- return '1.0.0';
- }
+/** 鍥炲啓 appid锛堟鍒欐浛鎹紝淇濈暀鍘熸牸寮忥級 */
+function writeAppId(file, appid) {
+ const prev = fs.readFileSync(file, 'utf8');
+ const next = prev.replace(/"appid"(\s*:\s*)"[^"]*"/, function(m, sep) {
+ return '"appid"' + sep + '"' + appid + '"';
+ });
+ if (next !== prev) fs.writeFileSync(file, next, 'utf8');
+ return readAppId(file);
}
function main() {
@@ -76,58 +79,66 @@
const env = require(path.join(ENV_DIR, envName + '.js'));
- // 1) 鏍¢獙 cli.exe
if (!fs.existsSync(HX_CLI)) {
fail('鏈壘鍒� HBuilderX cli.exe锛�' + HX_CLI +
- '\n 璇风‘璁� HBuilderX 瀹夎璺緞锛屾垨璁剧疆鐜鍙橀噺 HBUILDERX_CLI 鎸囧悜 cli.exe');
+ '\n 璇风‘璁ゅ畨瑁呰矾寰勶紝鎴栬缃幆澧冨彉閲� HBUILDERX_CLI 鎸囧悜 cli.exe');
+ }
+ if (!noOpen && !fs.existsSync(WX_CLI)) {
+ fail('鏈壘鍒板井淇″紑鍙戣�呭伐鍏� cli.bat锛�' + WX_CLI +
+ '\n 璇疯缃幆澧冨彉閲� WX_DEVTOOLS_CLI锛屾垨鍔� --no-open 鑷鎵撳紑浜х墿鐩綍');
}
- // 2) 缁勮 cli 鍙傛暟
- const cliArgs = ['publish', '--platform', 'mp-weixin', '--project', ROOT];
+ console.log('[release] 鐜 : ' + envName + '锛�' + env.ENV_NAME + '锛�');
+ console.log('[release] 灏忕▼搴廰ppid : ' + env.APPID);
+ console.log('[release] 鎺ュ彛鍦板潃 : ' + env.HTTP_REQUEST_URL);
+ console.log('[release] 浜х墿鐩綍 : ' + DIST_DIR);
+ console.log('[release] manifest.json: ' + (syncManifest ? '鍚屾涓� ' + envName + ' 鐨� appid锛堜細浜х敓 git 鏀瑰姩锛�' : '淇濇寔涓嶅姩锛堜粨搴撶淮鎸佸熀绾匡紝鏃� git 鏀瑰姩锛�'));
- if (!localOnly) {
- const keyFile = path.join(ROOT, 'keys', 'private.' + envName + '.key');
- if (!fs.existsSync(keyFile)) {
- fail('鏈壘鍒颁笂浼犲瘑閽ユ枃浠讹細' + keyFile +
- '\n 鑾峰彇鏂瑰紡锛氬井淇″叕浼楀钩鍙� 鈫� 寮�鍙戠鐞� 鈫� 寮�鍙戣缃� 鈫� 灏忕▼搴忎唬鐮佷笂浼� 鈫� 鐢熸垚涓婁紶瀵嗛挜' +
- '\n 鑻ュ彧鎯虫湰鍦扮紪璇戜笉涓婁紶锛岃鍔� --local');
- }
- const stamp = new Date().toISOString().slice(0, 16).replace('T', ' ');
- const hash = gitShortHash();
- cliArgs.push('--upload', 'true');
- cliArgs.push('--appid', env.APPID);
- cliArgs.push('--privatekey', keyFile);
- cliArgs.push('--version', readManifestVersion());
- cliArgs.push('--description', '[' + env.ENV_NAME + '] ' + stamp + (hash ? ' ' + hash : ''));
- }
-
- console.log('[publish] 鐜 : ' + envName + '锛�' + env.ENV_NAME + '锛�');
- console.log('[publish] 灏忕▼搴廰ppid: ' + env.APPID);
- console.log('[publish] 鎺ュ彛鍦板潃 : ' + env.HTTP_REQUEST_URL);
- console.log('[publish] 浜х墿鐩綍 : ' + path.join('unpackage', 'dist', 'build', 'mp-weixin'));
- console.log('[publish] 妯″紡 : ' + (localOnly ? '浠呮湰鍦扮紪璇�' : '缂栬瘧 + 涓婁紶鍒板井淇″钩鍙�'));
- console.log('[publish] DCloud鏍囪瘑 : ' + env.UNI_APPID + '锛坢anifest.json 閲岀殑鍊硷紝浠呭奖鍝嶉潪灏忕▼搴忕涓庝簯鏈嶅姟璇嗗埆锛�');
- console.log('[publish] 鍛戒护 : "' + HX_CLI + '" ' + cliArgs.concat(passthrough).join(' '));
+ const cliArgs = ['publish', '--platform', 'mp-weixin', '--project', ROOT].concat(passthrough);
+ // 璺緞鍚┖鏍�/涓枃锛屼氦缁� cmd 瑙f瀽鏇寸ǔ
+ const openCmd = '"' + WX_CLI + '" open --project "' + DIST_DIR + '"';
if (dryRun) {
- console.log('[publish] --dry-run锛屾湭鎵ц');
+ console.log('[release] 1) 缂栬瘧: "' + HX_CLI + '" ' + cliArgs.join(' '));
+ console.log('[release] 2) 浜х墿 appid 鍥炲啓涓� ' + env.APPID + ' 鈫� ' + DIST_CONFIG);
+ if (!noOpen) console.log('[release] 3) 鎵撳紑: ' + openCmd);
+ console.log('[release] --dry-run锛屾湭鎵ц');
return;
}
- // 3) 鍙�夛細鍏堟妸 appid 鍚屾杩� manifest.json锛堣蛋 set-env 鐨勫悓涓�濂楅�昏緫锛�
+ // 1) 鍙�夛細鍚屾 manifest.json锛堜細璁╄璺熻釜鏂囦欢浜х敓鏀瑰姩锛岄粯璁や笉鍋氾級
if (syncManifest) {
- console.log('[publish] --sync-manifest锛氬厛鍚屾 manifest.json 鐨� appid');
+ console.log('[release] 鍚屾 manifest.json 鐨� appid鈥�');
const sync = spawnSync(process.execPath, [path.join(__dirname, 'set-env.js'), envName], { cwd: ROOT, stdio: 'inherit' });
if (sync.status !== 0) fail('鍚屾 manifest.json 澶辫触');
}
- // 4) 鎵ц锛圚BuilderX 浼氬湪鍏舵帶鍒跺彴杈撳嚭缂栬瘧涓庝笂浼犳棩蹇楋級
- const res = spawnSync(HX_CLI, cliArgs.concat(passthrough), { cwd: ROOT, stdio: 'inherit' });
+ // 2) 鍙戣缂栬瘧锛堜骇鐗╋細unpackage/dist/build/mp-weixin锛�
+ console.log('[release] 寮�濮嬪彂琛岀紪璇戯紝鏃ュ織瑙� HBuilderX 鎺у埗鍙扳��');
+ const build = spawnSync(HX_CLI, cliArgs, { cwd: ROOT, stdio: 'inherit' });
+ if (build.error) fail('璋冪敤 cli.exe 澶辫触锛�' + build.error.message);
+ if (build.status !== 0) fail('cli.exe 閫�鍑虹爜 ' + build.status + '锛岃鏌ョ湅 HBuilderX 鎺у埗鍙拌緭鍑�');
- if (res.error) fail('璋冪敤 cli.exe 澶辫触锛�' + res.error.message);
- if (res.status !== 0) fail('cli.exe 閫�鍑虹爜 ' + res.status + '锛岃鏌ョ湅 HBuilderX 鎺у埗鍙拌緭鍑�');
+ // 3) 鏍℃浜х墿 appid锛�--sync 鏃堕�氬父宸蹭竴鑷达紝杩欓噷鍏滃簳淇濊瘉锛�
+ if (!fs.existsSync(DIST_CONFIG)) {
+ fail('鍙戣浜х墿缂哄皯 project.config.json锛�' + DIST_CONFIG + '\n 璇风‘璁� HBuilderX 缂栬瘧鏄惁鎴愬姛');
+ }
+ const before = readAppId(DIST_CONFIG);
+ const after = writeAppId(DIST_CONFIG, env.APPID);
+ if (!after) fail('鍥炲啓浜х墿 appid 澶辫触锛�' + DIST_CONFIG);
+ console.log('[release] 浜х墿 appid : ' + before + (before === after ? '锛堟棤闇�璋冩暣锛�' : ' 鈫� ' + after));
- console.log('[publish] 瀹屾垚銆傝嫢涓婁紶鎴愬姛锛屽彲鍦ㄥ井淇″叕浼楀钩鍙� 鈫� 鐗堟湰绠$悊 涓湅鍒板搴旂増鏈�');
+ // 4) 鐢ㄥ井淇″紑鍙戣�呭伐鍏锋墦寮�浜х墿锛堥娆¢渶鍦ㄣ�岃缃�-瀹夊叏璁剧疆銆嶄腑寮�鍚湇鍔$鍙o級
+ if (!noOpen) {
+ console.log('[release] 鎵撳紑寰俊寮�鍙戣�呭伐鍏封��');
+ const open = spawnSync(openCmd, { cwd: ROOT, stdio: 'inherit', shell: true });
+ if (open.error || open.status !== 0) {
+ console.log('[release] 鑷姩鎵撳紑澶辫触锛堝父瑙佸師鍥狅細鏈紑鍚湇鍔$鍙c�佸井淇″紑鍙戣�呭伐鍏风増鏈緝鏃э級');
+ console.log('[release] 璇锋墜鍔ㄦ墦寮�寰俊寮�鍙戣�呭伐鍏� 鈫� 瀵煎叆椤圭洰 鈫� 閫夋嫨鐩綍锛�' + DIST_DIR);
+ }
+ }
+
+ console.log('[release] 瀹屾垚銆傚井淇″紑鍙戣�呭伐鍏蜂腑鐨勯」鐩� appid = ' + after + '锛屽寘鍐呬細鑷姩浣跨敤 ' + env.HTTP_REQUEST_URL);
}
main();
--
Gitblit v1.4.0