为什么要这么做?
比如我们有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白名单,或者关闭白名单模式。