做个有深度的程序员 — YuanGe
uniapp微信小程序多平台自动化构建并发行
uniapp微信小程序多平台自动化构建并发行

uniapp微信小程序多平台自动化构建并发行

比如我们有2个小程序主体:小程序A,小程序B。现在公司需要将同一份代码分别发行到这两个平台,给2个不同的客户使用,代码之间的区别是api链接有些许不同、部分文本描述不同以及appid不同。

我们来举一个已经存在的例子:粤核酸(1,2,3,4,5,6),相信广东这边的朋友都用过粤核酸,而我们发现会有很多粤核酸,不同地区使用的都是不同的粤核酸,这种简单直接的”分布式”非常有效

uniapp有提供官方的cli工具可以使用终端来进行uni-app发行

uni-app发行 – 微信小程序 – HBuilderX 文档 (dcloud.net.cn)

既然可以使用终端进行发行,那事情不是就变得简单了吗,只需要写一个node脚本就行了。但是会发现其中存在不少坑

准备工作

1.下好weapp-miniprogram-ci这个插件

2.获取安装hbu时根目录下的cli.exe文件路径

3.下载微信公众平台中每个小程序对应的key密匙文件(下载方法上方的文档中有写)

工具目录结构

appName
    --build
        --index.js                   ----主文件,所有编译的处理都在里面
        --平台模块1                ----平台名,自定义
            --index.js               ----导出该平台信息的主要出口index.js
            --其他逻辑文件       ----其他处理逻辑的文件,都需要在index.js中导入  

例子

在fs平台中,我需要对某些api链接进行处理,所以我创建了一个叫做apiChange.js的文件,然后在index.js中导入

fs/index.js

const apiChange = require("./apiChange.js");
module.exports = {
	name:'****平台',
	appid:'wx7********bc727',
	keyPath:'E:\\project\\xxx项目\\平台.key', //小程序密匙保存路径
	/**
	 * 该平台需要特殊处理的文件变化
	 */
	fileChange(){
		apiChange()
	}
}

fs/apiChange.js(自己需要的业务需求代码)

const fs = require('fs');
module.exports = function(){
	const userApiCode = './js/api/user.js';
	// 读取文件内容
	try {
	  const data = fs.readFileSync(userApiCode, 'utf8');
	
	  // 修改内容
	  const modifiedContent = data.replace(/WxgzLogin/g, 'WxfsLogin');
	
	  // 保存修改后的内容
	  fs.writeFileSync(userApiCode, modifiedContent, 'utf8');

	} catch (err) {
	  console.error('Error:', err);
	  throw new Error('***平台:' + err);
	}
}

然后我们在主文件中将该平台进行导入

index.js

const process = require("child_process");
const config = require( '../js/config.js');
const fs = require( './fs');
const gz = require( './gz');

const mainBodyInfo = [fs,gz]	
/**
 * 说明:<br/>
 * @自动化构建多平台小程序并上传体验版功能需要先提前准备几点<br/>
 *  1.下好weapp-miniprogram-ci这个插件<br/>
 *  2.cliPath这个变量是安装hbu时根目录下的cli.exe文件路径<br/>
 *  3.mainBodyInfo中的keyPath变量是该小程序的密匙,需要前往公众号平台下载<br/>
 */
async function startBuild(){
	for(let a = 0; a<mainBodyInfo.length;a++ ){
		try{
			console.log(mainBodyInfo[a].name,'---开始发行');
			mainBodyInfo[a].fileChange();
			await Issue(mainBodyInfo[a]);
		}catch(e){
			//TODO handle the exception
			console.error(mainBodyInfo[a].name,'---发行失败',e);
			return;
		}
	}
}
startBuild()

/**
 * 发行
 * @param {Object} appid 发行的平台appid
 */
function Issue(data) {
	return new Promise((resolve, reject) => {
		const shellCode = `${config.cliPath} publish --platform mp-weixin --project **项目 --upload true --appid ${data.appid} --description ${config.description} --version ${config.version} --privatekey ${data.keyPath}`
		process.exec(shellCode, (error, stdout, stderr) => {
			if (!error) {
				resolve('成功')
				console.log(data.name,' 该平台发行完成');
				console.log('----------------------分隔线---------------------------');
			} else {
				reject(stderr)
			}
		});
	})
}

其中shellCode 变量是将hbu cli指令进行拼接。具体参数可以查看文档,然后使用process.exec执行

完成上面的工作后,就差不多实现我们需要的功能了,接下来我们只需要前往package.json中设置对应的指令

然后在终端执行npm run platAutoBuild

需要注意的地方

1.代码中的路径变量所有反斜杠都需要使用转义字符“\\”。2.shellCode 中的–project对应的是你在hbuilder编译器中的项目名称。3.使用cli上传体验版需要前往公众号设置ip白名单,或者关闭白名单模式。

-->