前言

各位小伙伴是不是遇到过uniapp狗血的打包发布流程?哈哈哈哈,我是受不鸟了,公司一套代码发布三个小程序,我人都傻了
在这里插入图片描述
我能说什么,我只能写个脚本帮我跑这些流程了,不然我真得疯掉,对于公司的这些骚操作,我直呼好家伙啊
在这里插入图片描述

准备工作

  • 微信公众平台开启小程序代码上传
    ![在这里插入图片描述](https://img-blog.csdnimg.cn/528d7938906d4d8a90d78e1e06df0e49.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shad0,text_Q1NETiBA5Lii5aSx55qE5p6X5aSV,size_20,color_FFFFFF,t_70,g_se,x_1
  • 在你的根目录下新建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发布工具包了,不过基本都是类似微信小程序那一套了

Logo

为开发者提供学习成长、分享交流、生态实践、资源工具等服务,帮助开发者快速成长。

更多推荐