ByteNoteByteNote
微信小程序自动化发布:命令行上传与版本号自增脚本
字

字节笔记本

2026年10月6日 · 约 8 分钟读完

微信小程序自动化发布:命令行上传与版本号自增脚本

API中转
¥120

每次给微信小程序发新版本,都要打开开发者工具、点上传、手填版本号和描述,发布一频繁就容易记混上次用过的版本号。其实微信开发者工具自带命令行入口,把上传动作交给一个几十行的 Node 脚本之后,版本号、描述、构建可以全部自动化,整条发布流程能收敛成一条 npm 命令。

一键发布方案的整体结构:从 package.json 到微信开发者工具 CLI 的调用链

命令行上传的基本用法

在 macOS 上,微信开发者工具的可执行命令行位于应用包内,上传代码的基本格式如下:

bash
/Applications/wechatwebdevtools.app/Contents/MacOS/cli upload --project <项目路径> --version <版本号> --desc <版本描述>

三个参数各管一件事:--project 指向小程序构建产物的目录,比如 ./dist/build/mp-weixin;--version 是平台侧识别的版本号,建议用语义化版本号;--desc 是本次更新的描述,写清修复了什么、新增了什么,方便后期在后台查阅。

动手之前有三件事要确认:开发者工具已安装并登录了微信开发者账号;当前账号具备该项目的管理员权限;版本号必须严格递增,不能重复使用同一个版本号。路径里带空格时要用引号包住,遇到权限报错可以尝试加 sudo。

用 package.json 当版本号源头

手动维护两份版本号迟早会不一致,更稳的做法是让 package.json 做唯一来源,上传前把 1.0.0 这样的语义化版本去掉点号,转成平台识别的数字格式:

javascript
const { execSync } = require('child_process');
const pkg = require('../package.json');

// 1.0.0 转成 100
const version = pkg.version.replace(/\./g, '');

// 取最近一次 git 提交信息当版本描述,取不到就回退
const getLastCommitMessage = () => {
  try {
    return execSync('git log -1 --pretty=%B').toString().trim();
  } catch (error) {
    return '版本更新';
  }
};

这样版本描述也不用每次现编:提交信息写得规范,比如 feat: 表示新功能、fix: 表示修复缺陷,小程序后台里的更新说明自然就跟着规范了。

一条命令的发布流程

把读取版本号、取提交信息、拼命令这几段写进项目根目录的 scripts/upload.js,发布流程就固定成了四步:提交代码,更新 package.json 版本号,执行构建生成产物目录,运行上传脚本。再把构建和上传串进 npm scripts:

json
{
  "scripts": {
    "upload": "npm run build && node scripts/upload.js"
  }
}

执行 npm run upload,构建完成后自动上传。脚本运行时会打印当前版本号和上传进度,失败时给出明确报错并以非零状态退出。发布前照着清单过一遍:代码已完整提交到 git,版本号已更新,构建产物目录存在,最近一次提交信息写得能见人。

版本号自动递增

上面的方案里版本号还得手动改,可以再往前走一步,让脚本自己递增。核心是一个按语义化版本规则工作的 updateVersion 函数,发布时把修订号加一并写回 package.json,发新功能或大版本时再递增次版本号或主版本号:

javascript
const updateVersion = (type = 'patch') => {
  const packagePath = path.resolve(__dirname, '../package.json');
  const pkg = require(packagePath);
  const versions = pkg.version.split('.');
  if (type === 'major') {
    versions[0] = (parseInt(versions[0]) + 1).toString();
    versions[1] = '0';
    versions[2] = '0';
  } else if (type === 'minor') {
    versions[1] = (parseInt(versions[1]) + 1).toString();
    versions[2] = '0';
  } else {
    versions[2] = (parseInt(versions[2]) + 1).toString();
  }
  pkg.version = versions.join('.');
  fs.writeFileSync(packagePath, JSON.stringify(pkg, null, 2));
  return pkg.version;
};

完整脚本按顺序做四件事:递增版本号并写回文件;用 git 单独提交这次版本号变更;执行 npm run build;最后拼好命令交给开发者工具 CLI 上传。在 package.json 里配三条命令,按改动大小选用:

json
{
  "scripts": {
    "deploy": "node scripts/upload.js",
    "deploy:minor": "node scripts/upload.js minor",
    "deploy:major": "node scripts/upload.js major"
  }
}

小修复跑 npm run deploy,1.0.0 变 1.0.1;新功能跑 deploy:minor,1.0.1 变 1.1.0;不兼容的大改跑 deploy:major,1.1.0 变 2.0.0。

npm run deploy 的执行过程与三条发布命令的版本号规则

常见问题

上传失败先看三处:开发者工具是否处于打开状态,--project 是否指向构建产物目录,构建是否真的成功。版本号报错通常是格式不对或已被用过,可以用 npm version 1.0.0 手动修正后再发。版本描述取不到时脚本会回退成固定文案,不影响上传,但建议保证项目有 git 提交记录。需要回退版本时,先回退 git 提交,再手动把 package.json 里的版本号改回去。

小结

这套方案没有引入任何新依赖:CLI 是开发者工具自带的,脚本只用了 Node 标准库。它把版本号、描述、构建、上传绑到同一个入口上,单人项目少点几次鼠标,多人项目则让每次发布的版本记录都可追溯。发布更频繁的项目还能在此基础上加发布前检查,比如发现 git 工作区有未提交变更就中止发布。

相关文章

分享: