1. 背景与痛点

在微信小程序的日常开发中,传统的上传流程往往是这样的:

  1. 在编辑器(如 VSCode)写完代码。
  2. 打开「微信开发者工具」。
  3. 等待项目编译完成。
  4. 点击界面上的「上传」按钮。
  5. 输入版本号和更新备注。

这套流程虽然直观,但在多人协作或者需要频繁发布测试版本时,显得既繁琐又低效。更重要的是,它无法集成到 CI/CD 自动化流水线中。

为了解决这个问题,微信官方推出了 miniprogram-ci。本文将带你通过编写一个简单的 Node.js 脚本,实现从本地构建到自动上传的全过程。


2. 前期准备

在开始编写脚本之前,需要完成以下准备工作:

2.1 获取 AppID 和 上传密钥

  1. 登录 微信公众平台
  2. 进入 开发管理 -> 开发设置 -> 小程序代码上传
  3. 生成 小程序代码上传密钥,下载并妥善保存(通常命名为 private.wxXXXXXX.key)。
  4. 关闭 IP 白名单限制(或者将你的构建机 IP 加入白名单),否则脚本无法在未授权性 IP 环境下执行上传。

2.2 安装依赖

在你的 Taro 项目根目录下安装 miniprogram-ci

npm install miniprogram-ci --save-dev

3. 核心实现:编写上传脚本

我们在项目的根目录下创建一个 upload.js 脚本。该脚本不仅负责上传,还会联动 Taro 的构建命令。

3.1 脚本代码示例 (upload.js)

const ci = require('miniprogram-ci');
const path = require('path');
const readline = require('readline');
const { spawn } = require('child_process');
const fs = require('fs');
const config = require('./project.config.json');

// 封装一个简单的交互式提问工具
function ask(question) {
    const rl = readline.createInterface({ input: process.stdin, output: process.stdout });
    return new Promise((resolve) =>
        rl.question(question, (answer) => {
            rl.close();
            resolve(String(answer ?? '').trim());
        })
    );
}

// 封装 Shell 命令执行
function run(command, args, options = {}) {
    return new Promise((resolve, reject) => {
        const child = spawn(command, args, { stdio: 'inherit', ...options });
        child.on('close', (code) => {
            if (code === 0) resolve();
            else reject(new Error(`${command} exited with code ${code}`));
        });
    });
}

(async () => {
    // 1. 初始化项目信息
    const project = new ci.Project({
        appid: config.appid,
        type: 'miniProgram',
        projectPath: path.join(__dirname, './dist'), // Taro 编译后的目录
        privateKeyPath: path.join(__dirname, './private.key'), // 你下载的上传密钥
        ignores: ['node_modules/**/*'],
    });

    try {
        // 2. 自动化构建
        console.log('正在执行构建: npm run build:weapp...');
        await run(process.platform === 'win32' ? 'npm.cmd' : 'npm', ['run', 'build:weapp'], {
            cwd: __dirname,
        });

        // 3. 交互式获取版本信息
        const version = (await ask('请输入版本号 (默认 1.0.0): ')) || '1.0.0';
        const desc = (await ask('请输入备注 (默认 Automated upload): ')) || 'Automated upload';

        // 4. 执行上传
        console.log(`正在上传版本 v${version}...`);
        const uploadResult = await ci.upload({
            project,
            version,
            desc,
            setting: {
                es6: true,
                minify: true,
                autoPrefixWXSS: true,
            },
            onProgressUpdate: console.log,
        });

        console.log('上传成功!', uploadResult);
    } catch (error) {
        console.error('上传失败:', error);
        process.exit(1);
    }
})();

3.2 关键代码解析

  • ci.Project: 用于定义项目的基本信息,包括 appid、代码路径和私钥路径。
  • ci.upload: 核心上传接口。你可以配置代码压缩(minify)、ES6 转 ES5 等选项,这些选项通常与微信开发者工具中的设置保持一致。
  • spawn 构建: 脚本首先调用了 npm run build:weapp,确保每次上传的代码都是最新的生产环境包。

4. 实战配置

为了更方便地调用,我们可以将脚本集成到 package.json 的 scripts 中:

{
  "scripts": {
    "upload": "node upload.js"
  }
}

现在,每当你需要发布时,只需在终端输入:

npm run upload

按照提示输入版本号和备注,剩下的工作交给脚本即可!

5. 总结

通过 miniprogram-ci 实现自动化上传,我们不仅摆脱了对可视化工具的依赖,还为后续集成到 Jenkins、GitHub Actions 等 CI 系统打下了基础。这在大中型前端团队的规范化流程中几乎是必不可少的。

希望这篇文章能帮你提升小程序开发效率!如果你有更好的自动化方案,欢迎在评论区交流。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐