前言
各位小伙伴是不是遇到过uniapp狗血的打包发布流程?哈哈哈哈,我是受不鸟了,公司一套代码发布三个小程序,我人都傻了
我能说什么,我只能写个脚本帮我跑这些流程了,不然我真得疯掉,对于公司的这些骚操作,我直呼好家伙啊
准备工作
- 微信公众平台开启小程序代码上传
- 在你的根目录下新建keys文件夹和deploy.js
- 将你第一步下载的小程序上传key文件复制到keys文件夹里
- 再keys下新建version.json用于管理版本
注:此图里的appid全是乱写的,骚年们不用拿去尝试什么乱七八糟的东西
编写主脚本文件deploy.js
const inquirer = require("inquirer");
const shell = require("shelljs"); // 执行文件操作
const fs = require("fs");
const ci = require("miniprogram-ci");
const path = require("path");
const username = 'xxx' // 你发布时的名字
const config = [
{
appid: "wxf318238132312a46",
env: "pro",
name: "小程序一",
},
{
appid: "wxea3847543578a423",
env: "pro-ww",
name: "小程序二",
},
];
// 写入json文件选项
function writeJson(appid) {
return new Promise((resovle) => {
//现将json文件读出来
fs.readFile(
path.join(__dirname, "dist/build/mp-weixin/project.config.json"),
function (err, data) {
if (err) {
return console.error(err);
}
var temp = data.toString(); //将二进制的数据转换为字符串
temp = JSON.parse(temp); //将字符串转换为json对象
temp.appid = appid;
var str = JSON.stringify(temp); //因为nodejs的写入文件只认识字符串或者二进制数,所以把json对象转换成字符串重新写入json文件中
fs.writeFile(
path.join(__dirname, "dist/build/mp-weixin/project.config.json"),
str,
function (err) {
if (err) {
console.error(err);
// 回滚
fs.writeFile(
path.join(__dirname, "dist/build/mp-weixin/project.config.json"),
data.toString(),
function (err) {
if (err) {
console.error(err);
}
resovle();
console.log("----------修改Appid成功---- ß---------");
}
);
}
resovle();
console.log("----------修改Appid成功---- ß---------");
}
);
}
);
});
}
// 版本自加算法
function versionAutoAdd(version, index) {
if (!version) return new Error("版本号不存在");
let arr = version.split(".");
index === undefined && (index = arr.length - 1);
let newVal = parseInt(arr[index] || "0") + 1;
if (newVal > 20 && index !== 0) {
arr.splice(index, 1, 0);
if (index < 0) return arr.join(".");
return versionAutoAdd(arr.join("."), index - 1);
} else {
arr.splice(index, 1, newVal);
return arr.join(".");
}
}
// 设置版本号
function setVersion(appid, versions, setedVersion) {
return new Promise((resovle) => {
if (setedVersion) {
versions[appid] = setedVersion;
} else {
versions[appid] = versionAutoAdd(versions[appid]);
}
var str = JSON.stringify(versions); //因为nodejs的写入文件只认识字符串或者二进制数,所以把json对象转换成字符串重新写入json文件中
fs.writeFile(path.join(__dirname, "keys/version.json"), str, function (err) {
if (err) {
console.error(err);
}
resovle();
console.log("----------自增版本号成功---- ß---------");
});
});
}
// 获取版本号
function getVersions() {
return new Promise((resovle) => {
//现将json文件读出来
fs.readFile(path.join(__dirname, "keys/version.json"), function (err, data) {
if (err) {
return console.error(err);
}
var data = data.toString(); //将二进制的数据转换为字符串
//将字符串转换为json对象
resovle(JSON.parse(data));
});
});
}
// 上传小程序
const uploadMini = (options) => {
return new Promise(async (resovle) => {
let { appid, remark } = options;
// 获取版本号
const versions = await getVersions();
// 获取自增后的版本号
const version = versionAutoAdd(versions[appid]);
const project = new ci.Project({
appid: appid, // 小程序appid
type: "miniProgram", // 类型,小程序或小游戏
projectPath: path.join(__dirname, "dist/build/mp-weixin"), // 项目路径
privateKeyPath: process.cwd() + `/keys/private.${appid}.key`, // 密钥路径
ignores: ["node_modules/**/*"], // 忽略的文件
});
// 调用上传方法
ci.upload({
project,
version: version || "1.0.0",
desc: username + ":" + remark, //主机名,
setting: {
es6: true, // 是否 "es6 转 es5"
es7: true, // 是否 "es7 转 es5"
minify: true, // 是否压缩代码
},
})
.then(async (res) => {
console.log("----------代码上传成功---- ß---------");
await setVersion(appid, versions, version);
resovle({
isSuccess: true,
});
})
.catch((error) => {
console.log("上传失败");
resovle({
isSuccess: false,
});
process.exit(-1);
});
});
};
inquirer
.prompt([
{
type: "input", // 类型
name: "remark", // 字段名称,在then里可以打印出来
message: "备注:", // 提示信息
},
{
type: "checkbox",
message: "请选择你要发布的环境?",
name: "type",
choices: config.map((item) => {
return {
name: item.name,
value: item.appid,
};
}),
},
])
.then(async (answers) => {
console.log(answers);
// 队列式上传
for (let appid of answers.type) {
switch (appid) {
case "wxf318238132312a46":
console.log("正在发布小程序一,请稍等...");
break;
case "wxea3847543578a423":
console.log("正在发布小程序二,请稍等...");
break;
default:
break;
}
shell.exec("npm run build:mp-weixin");
// 修改打包文件的appid为当前appid
await writeJson(appid);
// 上传小程序
await uploadMini({
appid: appid,
remark: answers.remark,
});
}
});
执行
- 打开终端,进入你的项目根路径,执行命令
node deploy
按流程填写即可
- 发布完毕,就可以在小程序助手里查看你发布的小程序了
结尾
多端一键打包的话,就得你自行兼容其他平台的ci发布工具包了,不过基本都是类似微信小程序那一套了