From 6a0a2c52a4ea8049909b8d7a40d0c2d098b5e74c Mon Sep 17 00:00:00 2001
From: Jacob <hlnie@tohours.com>
Date: 星期五, 23 十月 2026 13:19:18 +0800
Subject: [PATCH] fix:解决专区图片拉伸问题

---
 scripts/publish.js |  329 ++++++++++++++++++++++++++++++++++++++++++------------
 1 files changed, 254 insertions(+), 75 deletions(-)

diff --git a/scripts/publish.js b/scripts/publish.js
index 9d2f542..ddb06f8 100644
--- a/scripts/publish.js
+++ b/scripts/publish.js
@@ -1,40 +1,203 @@
 /**
- * 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 --no-gen   # 涓嶆敼 manifest.json锛堣姹傚畠宸插瓨鍦級
+ *   node scripts/publish.js sit --no-open  # 鍙紪璇戯紝涓嶆墦寮�寰俊寮�鍙戣�呭伐鍏�
+ *   node scripts/publish.js sit --dry-run  # 鍙墦鍗板皢瑕佹墽琛岀殑鍛戒护
  *
- * 鐜鐩稿叧鐨勫�肩粺涓�鍙栬嚜 config/env/<env>.js锛堝敮涓�鏁版嵁婧愶級锛�
- *   - 鎺ュ彛/鍩嬬偣绛夎繍琛屾椂鍙傛暟锛氬寘鍐呰嚜鍔ㄦ寜灏忕▼搴� appid 璇嗗埆锛屾棤闇�鍦ㄦ澶勭悊
- *   - APPID锛氫綔涓� --appid 浼犵粰寰俊 CI 涓婁紶
+ * 娴佺▼锛氫粠 manifest.json.demo 鐢熸垚 manifest.json锛堟寜鐩爣鐜娉ㄥ叆 appid锛夆啋 鍙戣缂栬瘧 鈫�
+ *       鏍℃浜х墿 appid 鈫� 鐢ㄥ井淇″紑鍙戣�呭伐鍏锋墦寮�浜х墿
  *
- * 瀵嗛挜鏂囦欢锛歬eys/private.<env>.key
- *   鑾峰彇鏂瑰紡锛氬井淇″叕浼楀钩鍙� 鈫� 寮�鍙戠鐞� 鈫� 寮�鍙戣缃� 鈫� 灏忕▼搴忎唬鐮佷笂浼� 鈫� 鐢熸垚涓婁紶瀵嗛挜
- *   娉ㄦ剰锛氬瘑閽ュ睘浜庢満瀵嗭紝宸查�氳繃 .gitignore 鎺掗櫎锛屽垏鍕挎彁浜�
+ * 鐜鍊肩粺涓�鍙栬嚜 config/env/<env>.js锛堝敮涓�鏁版嵁婧愶級锛屾帴鍙e湴鍧�绛夎繍琛屾椂鍙傛暟鐢卞寘鍐呮寜 appid 鑷姩璇嗗埆锛�
+ * manifest.json 鏄敓鎴愮墿锛堝凡 .gitignore锛夛紝鍥犳 git 姘歌繙娌℃湁鐜鍣煶銆�
+ * 寰俊寮�鍙戣�呭伐鍏锋墦寮�鐨勪骇鐗� appid = unpackage/dist/build/mp-weixin/project.config.json 鐨� appid
+ * 锛堟瀯寤烘椂鐢� manifest 鐢熸垚锛岃繖閲屽啀鍏滃簳鏍℃涓�娆★級銆�
+ *
+ * 澶栭儴宸ュ叿锛圚BuilderX cli.exe銆佸井淇″紑鍙戣�呭伐鍏� cli.bat锛変笉鍐欐缁濆璺緞锛屾寜椤哄簭鑷姩鏌ユ壘锛�
+ *   1) 鐜鍙橀噺 HBUILDERX_CLI / WX_DEVTOOLS_CLI
+ *   2) 绯荤粺 PATH
+ *   3) 甯歌瀹夎鐩綍锛圥rogram Files銆佺敤鎴风洰褰曘�佸悇纾佺洏甯歌杞欢鐩綍锛�
+ *   4) 纾佺洏鏍圭洰褰曟祬灞傛壂鎻忥紙鈮�2 灞傦級
+ * 鎵惧埌鍚庝細鎶婂叾鎵�鍦ㄧ洰褰曞姞鍏ユ湰娆¤繘绋� PATH锛堜究浜庢寜鍚嶅瓧鐩存帴璋冪敤锛夛紝鎵句笉鍒板垯鎶ラ敊骞剁粰鍑鸿В鍐冲姙娉曘��
  */
 const { spawnSync } = require('child_process');
 const fs = require('fs');
 const path = require('path');
+const manifest = require('./manifest');
 
 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 SKIP_DIRS = /^(\$recycle\.bin|system volume information|windows|winsxs|node_modules|\.git|\.cache|programdata)$/i;
+
+const HX_TOOL = {
+	envKey: 'HBUILDERX_CLI',
+	label: 'HBuilderX 鍛戒护琛� cli.exe',
+	names: ['cli.exe'],
+	subDirs: ['HBuilderX', 'HBuilderX\\HBuilderX'],
+	dirPattern: /^hbuilderx/i,
+	ok: function(file) { return /hbuilderx/i.test(file); },
+	hint: 'HBuilderX 瀹夎/瑙e帇鐩綍涓嬬殑 cli.exe锛堝 X:\\HBuilderX\\cli.exe锛�',
+	extra: ''
+};
+
+const WX_TOOL = {
+	envKey: 'WX_DEVTOOLS_CLI',
+	label: '寰俊寮�鍙戣�呭伐鍏峰懡浠よ cli.bat',
+	names: ['cli.bat'],
+	subDirs: ['寰俊web寮�鍙戣�呭伐鍏�', '寰俊寮�鍙戣�呭伐鍏�', 'Tencent\\寰俊web寮�鍙戣�呭伐鍏�', 'Tencent\\寰俊寮�鍙戣�呭伐鍏�'],
+	dirPattern: /寰俊(web)?寮�鍙戣�呭伐鍏�/,
+	hint: '寰俊寮�鍙戣�呭伐鍏峰畨瑁呯洰褰曚笅鐨� cli.bat锛堝 X:\\Program Files (x86)\\Tencent\\寰俊web寮�鍙戣�呭伐鍏穃\cli.bat锛�',
+	extra: '    3) 鎴栧姞 --no-open锛屽彧缂栬瘧涓嶈嚜鍔ㄦ墦寮�浜х墿\n'
+};
+
+function fail(msg) {
+	console.error('[release] ' + msg);
+	process.exit(1);
+}
+
+function uniq(list) {
+	return list.filter(function(v, i) { return v && list.indexOf(v) === i; });
+}
+
+function isFile(p) {
+	try { return fs.statSync(p).isFile(); } catch (e) { return false; }
+}
+
+function isDir(p) {
+	try { return fs.statSync(p).isDirectory(); } catch (e) { return false; }
+}
+
+/** 鏈湴鍥哄畾纾佺洏锛圕:銆丏: 鈥︼級锛涙嬁涓嶅埌鏃堕��鍥炵幆澧冨彉閲忛噷鐨勭洏绗︼紙缁撴灉缂撳瓨锛屽彧鎺㈡祴涓�娆★級 */
+let DRIVES = null;
+function fixedDrives() {
+	if (DRIVES) return DRIVES;
+	const ps = spawnSync('powershell', ['-NoProfile', '-NonInteractive', '-Command',
+		"[System.IO.DriveInfo]::GetDrives() | Where-Object { $_.DriveType -eq 'Fixed' } | ForEach-Object { $_.Name }"
+	], { encoding: 'utf8', windowsHide: true });
+	const fromPs = (ps.stdout || '').split(/\r?\n/)
+		.map(function(s) { return s.trim().replace(/\\$/, ''); })
+		.filter(function(s) { return /^[A-Za-z]:$/.test(s); });
+	const fromEnv = [process.env.SystemDrive, process.env.HOMEDRIVE];
+	DRIVES = uniq(fromPs.concat(fromEnv).map(function(d) { return (d || '').replace(/\\$/, ''); }));
+	return DRIVES;
+}
+
+/** 鍦ㄧ郴缁� PATH 涓寜鏂囦欢鍚嶆煡鎵撅紝ok() 鐢ㄤ簬鎺掗櫎鍚屽悕鏃犲叧绋嬪簭 */
+function findOnPath(names, ok) {
+	const dirs = (process.env.PATH || '').split(path.delimiter);
+	for (let i = 0; i < dirs.length; i++) {
+		const dir = dirs[i].replace(/^"|"$/g, '');
+		if (!dir) continue;
+		for (let j = 0; j < names.length; j++) {
+			const file = path.join(dir, names[j]);
+			if (isFile(file) && (!ok || ok(file))) return file;
+		}
+	}
+	return '';
+}
+
+/** 甯歌瀹夎鏍圭洰褰曪細Program Files銆佺敤鎴风洰褰曘�佸悇纾佺洏鏍逛笌甯歌杞欢鐩綍 */
+function baseDirs() {
+	const bases = [
+		process.env.ProgramFiles,
+		process.env['ProgramFiles(x86)'],
+		process.env.LOCALAPPDATA,
+		process.env.APPDATA,
+		process.env.USERPROFILE,
+		process.env.LOCALAPPDATA && path.join(process.env.LOCALAPPDATA, 'Programs'),
+		process.env.USERPROFILE && path.join(process.env.USERPROFILE, 'Desktop'),
+		process.env.USERPROFILE && path.join(process.env.USERPROFILE, 'Downloads')
+	];
+	fixedDrives().forEach(function(d) {
+		bases.push(d + '\\', d + '\\Program Files', d + '\\Program Files (x86)',
+			d + '\\soft', d + '\\software', d + '\\Programs', d + '\\develop');
+	});
+	return uniq(bases).filter(isDir);
+}
+
+/** 纾佺洏娴呭眰鎵弿锛氭壘鍚嶅瓧绗﹀悎鐗瑰緛鐨勭洰褰曪紙鍏滃簳鎵嬫锛� */
+function scanPlausibleDirs(pattern) {
+	const found = [];
+	fixedDrives().forEach(function(root) {
+		let level1 = [];
+		try { level1 = fs.readdirSync(root + '\\', { withFileTypes: true }); } catch (e) { return; }
+		level1.forEach(function(e1) {
+			if (!e1.isDirectory() || SKIP_DIRS.test(e1.name)) return;
+			const p1 = path.join(root + '\\', e1.name);
+			if (pattern.test(e1.name)) { found.push(p1); return; }
+			let level2 = [];
+			try { level2 = fs.readdirSync(p1, { withFileTypes: true }); } catch (e) { return; }
+			level2.forEach(function(e2) {
+				if (e2.isDirectory() && pattern.test(e2.name)) found.push(path.join(p1, e2.name));
+			});
+		});
+	});
+	return found;
+}
+
+/** 瀹氫綅宸ュ叿锛氳繑鍥� { file, source }锛屾壘涓嶅埌杩斿洖 null */
+function resolveTool(cfg) {
+	// 1) 鐜鍙橀噺鏄惧紡鎸囧畾
+	const fromEnv = (process.env[cfg.envKey] || '').trim();
+	if (fromEnv) {
+		if (isFile(fromEnv)) return { file: fromEnv, source: '鐜鍙橀噺 ' + cfg.envKey };
+		fail('鐜鍙橀噺 ' + cfg.envKey + ' 鎸囧悜鐨勬枃浠朵笉瀛樺湪锛�' + fromEnv);
+	}
+
+	// 2) 绯荤粺 PATH
+	const onPath = findOnPath(cfg.names, cfg.ok);
+	if (onPath) return { file: onPath, source: '绯荤粺 PATH' };
+
+	// 3) 甯歌瀹夎鐩綍 + 纾佺洏娴呭眰鎵弿
+	const dirs = baseDirs().concat(scanPlausibleDirs(cfg.dirPattern));
+	for (let i = 0; i < dirs.length; i++) {
+		for (let j = 0; j < cfg.subDirs.length; j++) {
+			for (let k = 0; k < cfg.names.length; k++) {
+				const file = path.join(dirs[i], cfg.subDirs[j], cfg.names[k]);
+				if (isFile(file)) return { file: file, source: '甯歌瀹夎鐩綍' };
+			}
+		}
+	}
+	return null;
+}
+
+/** 鎵句笉鍒板伐鍏锋椂鐨勬姤閿欐彁绀� */
+function toolFail(cfg) {
+	fail('鏈壘鍒� ' + cfg.label + '\n' +
+		'  宸叉煡鎵撅細鐜鍙橀噺 ' + cfg.envKey + ' 鈫� 绯荤粺 PATH 鈫� 甯歌瀹夎鐩綍 鈫� 纾佺洏娴呭眰鎵弿\n' +
+		'  鍏稿瀷浣嶇疆锛�' + cfg.hint + '\n' +
+		'  瑙e喅鍔炴硶锛堜换閫夊叾涓�锛夛細\n' +
+		'    1) 鎶婂畨瑁呯洰褰曞姞鍏� PATH锛歴et PATH=%PATH%;<瀹夎鐩綍>\n' +
+		'    2) 鐢ㄧ幆澧冨彉閲忔寚瀹氾細set ' + cfg.envKey + '=<cli 瀹屾暣璺緞>\n' +
+		cfg.extra);
+}
+
+/** 鎶婂伐鍏锋墍鍦ㄧ洰褰曞姞鍏ユ湰娆¤繘绋� PATH锛屼究浜庢寜鍚嶅瓧鐩存帴璋冪敤 */
+function putOnPath(file) {
+	const dir = path.dirname(file);
+	const cur = process.env.PATH || '';
+	if (cur.split(path.delimiter).indexOf(dir) < 0) process.env.PATH = dir + path.delimiter + cur;
+}
+
+/* ------------------------- 鍙傛暟瑙f瀽 ------------------------- */
 
 const argv = process.argv.slice(2);
 const envName = (argv.find(function(a) { return a.charAt(0) !== '-'; }) || '').trim();
-const localOnly = argv.indexOf('--local') > -1;
+const noGen = argv.indexOf('--no-gen') > -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 = ['--no-gen', '--no-open', '--dry-run'];
+// 閫忎紶缁� HBuilderX cli 鐨勯澶栧弬鏁帮紙淇濈暀 "鍙傛暟 鍊�" 鎴愬鍏崇郴锛�
 const passthrough = [];
 let envNameSkipped = false;
 argv.forEach(function(a) {
@@ -46,24 +209,22 @@
 	passthrough.push(a);
 });
 
-function fail(msg) {
-	console.error('[publish] ' + 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 readManifestVersion() {
+function readAppId(file) {
 	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';
+		return JSON.parse(fs.readFileSync(file, 'utf8')).appid || '';
 	} catch (e) {
-		return '1.0.0';
+		return '';
 	}
+}
+
+/** 鍥炲啓 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 +237,76 @@
 
 	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');
+	// 瀹氫綅澶栭儴宸ュ叿锛堜笉鍐欐璺緞锛�
+	console.log('[release] 鏌ユ壘 HBuilderX / 寰俊寮�鍙戣�呭伐鍏封��');
+	const hx = resolveTool(HX_TOOL);
+	if (!hx) toolFail(HX_TOOL);
+	const wx = noOpen ? null : resolveTool(WX_TOOL);
+	if (!noOpen && !wx) toolFail(WX_TOOL);
+	putOnPath(hx.file);
+	if (wx) putOnPath(wx.file);
+
+	// 鐩爣缂栬瘧浜х墿鐢� manifest.json 鍐冲畾锛岃�� manifest.json 鏄敓鎴愮墿
+	if (noGen && !fs.existsSync(manifest.TARGET)) {
+		fail('--no-gen 闇�瑕� manifest.json 宸插瓨鍦紝璇峰厛杩愯锛歯ode scripts/set-env.js ' + envName);
 	}
 
-	// 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] HBuilderX    : ' + hx.file + '锛�' + hx.source + '锛�');
+	if (wx) console.log('[release] 寮�鍙戣�呭伐鍏�   : ' + wx.file + '锛�' + wx.source + '锛�');
+	console.log('[release] manifest.json: ' + (noGen
+		? '涓嶆敼鍔紙--no-gen锛�'
+		: '鐢� manifest.json.demo 鐢熸垚锛坅ppid ' + env.APPID + '锛岀敓鎴愮墿涓嶅叆搴擄級'));
 
-	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瀽鏇寸ǔ锛�--no-open 鏃舵病鏈夊井淇″紑鍙戣�呭伐鍏凤紝涓嶆嫾杩欐潯鍛戒护锛�
+	const openCmd = wx ? '"' + wx.file + '" open --project "' + DIST_DIR + '"' : '';
 
 	if (dryRun) {
-		console.log('[publish] --dry-run锛屾湭鎵ц');
+		console.log('[release] 0) 鐢熸垚: manifest.json 鈫� manifest.json.demo' + (noGen ? '锛堝凡鎸囧畾 --no-gen锛岃烦杩囷級' : ''));
+		console.log('[release] 1) 缂栬瘧: "' + hx.file + '" ' + 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 鐨勫悓涓�濂楅�昏緫锛�
-	if (syncManifest) {
-		console.log('[publish] --sync-manifest锛氬厛鍚屾 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 澶辫触');
+	// 1) 鐢熸垚 manifest.json锛圚BuilderX 鐨勭紪璇戣緭鍏ワ紝妯℃澘锛歮anifest.json.demo锛�
+	if (noGen) {
+		console.log('[release] 璺宠繃 manifest.json 鐢熸垚锛�--no-gen锛�');
+	} else {
+		manifest.generate(env);
 	}
 
-	// 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.file, 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锛堟甯稿簲涓� manifest 涓�鑷达紝杩欓噷鍏滃簳淇濊瘉锛�
+	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