| .. | .. |
|---|
| 1 | +# 4 个 bat 使用说明 |
|---|
| 2 | + |
|---|
| 3 | +项目根目录下 4 个双击即用的批处理,按用途分两类: |
|---|
| 4 | + |
|---|
| 5 | +| 我想做的事 | 用哪个 bat | |
|---|
| 6 | +| --- | --- | |
|---|
| 7 | +| 出小程序发行版,并自动在微信开发者工具里打开 | `publish-sit.bat`(测试)/ `publish-prod.bat`(生产) | |
|---|
| 8 | +| 在 HBuilderX 里「运行 → 运行到小程序模拟器」调试 | 先切环境:`switch-sit.bat` / `switch-prod.bat` | |
|---|
| 9 | + |
|---|
| 10 | +> 一句话区分:`publish-*` 产出 `unpackage/dist/build/mp-weixin` 发行产物,编译期 appid 由脚本注入,**不改仓库里的任何文件**;`switch-*` 改的是 HBuilderX 的编译输入 `manifest.json`,供 GUI 编译/调试用。 |
|---|
| 11 | + |
|---|
| 12 | +--- |
|---|
| 13 | + |
|---|
| 14 | +## 1. 一次性前提 |
|---|
| 15 | + |
|---|
| 16 | +1. Node.js(命令行 `node -v` 可用) |
|---|
| 17 | +2. HBuilderX(提供命令行 `cli.exe`) |
|---|
| 18 | +3. 微信开发者工具,且 **设置 → 安全设置 → 服务端口 = 开启**(不开时 `cli.bat open` 会失败,脚本会降级提示你手动导入) |
|---|
| 19 | + |
|---|
| 20 | +**工具路径不需要配置**,脚本按顺序自动查找,命中后把所在目录加入本次进程的 `PATH`(便于按名字直接调用): |
|---|
| 21 | + |
|---|
| 22 | +1. 环境变量 `HBUILDERX_CLI` / `WX_DEVTOOLS_CLI` |
|---|
| 23 | +2. 系统 `PATH` |
|---|
| 24 | +3. 常见安装目录(`Program Files`、`Program Files (x86)`、用户目录、桌面、下载、各磁盘常见软件目录…) |
|---|
| 25 | +4. 磁盘浅层扫描(≤2 层,只扫本地固定磁盘,跳过系统目录) |
|---|
| 26 | + |
|---|
| 27 | +找不到时直接报错并给出办法: |
|---|
| 28 | + |
|---|
| 29 | +```bat |
|---|
| 30 | +set PATH=%PATH%;<HBuilderX 或 微信开发者工具 的安装目录> |
|---|
| 31 | +set HBUILDERX_CLI=<HBuilderX cli.exe 完整路径> |
|---|
| 32 | +set WX_DEVTOOLS_CLI=<微信开发者工具 cli.bat 完整路径> |
|---|
| 33 | +``` |
|---|
| 34 | + |
|---|
| 35 | +--- |
|---|
| 36 | + |
|---|
| 37 | +## 2. publish-sit.bat / publish-prod.bat |
|---|
| 38 | + |
|---|
| 39 | +双击 = 发行并自动打开。实际执行 4 步: |
|---|
| 40 | + |
|---|
| 41 | +| 步骤 | 做什么 | 具体命令 | |
|---|
| 42 | +| --- | --- | --- | |
|---|
| 43 | +| 0 | 生成 `manifest.json`(模板 `manifest.json.demo` + 该环境 appid) | 内置逻辑 | |
|---|
| 44 | +| 1 | HBuilderX CLI 发行编译 | `cli.exe publish --platform mp-weixin --project <项目根>` | |
|---|
| 45 | +| 2 | 回写产物 appid(兜底校正) | 写入 `unpackage/dist/build/mp-weixin/project.config.json` | |
|---|
| 46 | +| 3 | 微信开发者工具 CLI 打开产物 | `cli.bat open --project <产物目录>` | |
|---|
| 47 | + |
|---|
| 48 | +- 发行产物:`unpackage/dist/build/mp-weixin` |
|---|
| 49 | +- 编译日志在 **HBuilderX 控制台**里看 |
|---|
| 50 | +- 任一步失败,窗口会打印 `[FAILED] ...`(退出码非 0) |
|---|
| 51 | + |
|---|
| 52 | +### 可加的参数(`%*` 原样传给 `scripts/publish.js`) |
|---|
| 53 | + |
|---|
| 54 | +| 参数 | 作用 | |
|---|
| 55 | +| --- | --- | |
|---|
| 56 | +| `--dry-run` | 只打印将要执行的命令,不做任何写操作 | |
|---|
| 57 | +| `--no-open` | 只编译,不打开微信开发者工具(此种情况不要求安装开发者工具) | |
|---|
| 58 | +| `--no-gen` | 跳过生成 `manifest.json`(要求它已存在;适合你手工维护 manifest 的场景) | |
|---|
| 59 | +| 其他参数 | 原样透传给 HBuilderX cli | |
|---|
| 60 | + |
|---|
| 61 | +用法示例(在命令行窗口里): |
|---|
| 62 | + |
|---|
| 63 | +```bat |
|---|
| 64 | +publish-sit.bat --dry-run |
|---|
| 65 | +publish-prod.bat --no-open |
|---|
| 66 | +``` |
|---|
| 67 | + |
|---|
| 68 | +等价命令:`npm run release:sit` / `npm run release:prod` / `node scripts/publish.js sit` |
|---|
| 69 | + |
|---|
| 70 | +--- |
|---|
| 71 | + |
|---|
| 72 | +## 3. switch-sit.bat / switch-prod.bat |
|---|
| 73 | + |
|---|
| 74 | +双击 = 按该环境重新生成 `manifest.json`(`manifest.json.demo` + 该环境 appid)。 |
|---|
| 75 | + |
|---|
| 76 | +- 等价命令:`npm run env:sit` / `npm run env:prod` / `node scripts/set-env.js sit` |
|---|
| 77 | +- **切完必须做两件事**:① 在 HBuilderX 里重新编译一次;② 在微信开发者工具里重新打开该项目(appid 变更需重开) |
|---|
| 78 | +- 幂等:内容已一致时提示「无需重写」,可放心重复双击 |
|---|
| 79 | +- 适用场景:在 HBuilderX GUI 里直接运行/调试(编译期 appid 取自 `manifest.json`),或需要出 App 包(顶层 DCloud appid) |
|---|
| 80 | + |
|---|
| 81 | +### 两个环境的取值 |
|---|
| 82 | + |
|---|
| 83 | +| 环境 | 小程序 appid(`mp-weixin.appid`) | DCloud appid(顶层) | 接口地址 | |
|---|
| 84 | +| --- | --- | --- | --- | |
|---|
| 85 | +| sit | `wx7e443c60d08449de` | `__UNI__3D0C5FE` | `https://sit.tohours.com/crmeb/front` | |
|---|
| 86 | +| prod | `wx15d029cdf2e92a9f` | `__UNI__CE0C605` | `https://acmall.bluedeer.com.cn/crmeb/front` | |
|---|
| 87 | + |
|---|
| 88 | +数据源:`config/env/sit.js`、`config/env/prod.js`(唯一数据源,改这两处即可,两个文件键名保持一致)。 |
|---|
| 89 | + |
|---|
| 90 | +--- |
|---|
| 91 | + |
|---|
| 92 | +## 4. 为什么跑完 git 是干净的 |
|---|
| 93 | + |
|---|
| 94 | +`manifest.json` 是**生成物**,`project.config.json` 与 `unpackage/` 已忽略: |
|---|
| 95 | + |
|---|
| 96 | +``` |
|---|
| 97 | +manifest.json.demo(入库,模板) ──注入环境 appid──▶ manifest.json(已忽略,不入库) |
|---|
| 98 | +``` |
|---|
| 99 | + |
|---|
| 100 | +所以发行、切环境都不会产生 git 改动,`git status` 只会有你自己改的源码。 |
|---|
| 101 | + |
|---|
| 102 | +两点注意: |
|---|
| 103 | + |
|---|
| 104 | +1. 新 clone 的机器**没有 `manifest.json`,HBuilderX 打不开项目** —— 先跑一次 `switch-sit.bat`(或任意 `publish-*.bat`)把它生成出来。 |
|---|
| 105 | +2. 在 HBuilderX GUI 里直接改的 manifest 配置落在**生成物**上,下次生成会被模板内容覆盖(脚本会打印警告)。需要长期保留的改动,请写进 `manifest.json.demo`。 |
|---|
| 106 | + |
|---|
| 107 | +--- |
|---|
| 108 | + |
|---|
| 109 | +## 5. 接口地址为什么自动对得上 |
|---|
| 110 | + |
|---|
| 111 | +`config/env/index.js` 的识别顺序:手动 `OVERRIDE_ENV` > 小程序 appid 自动识别 > H5 域名识别 > 默认 prod,对外导出 `ENV_NAME` / `IS_SIT` / `IS_PROD`。 |
|---|
| 112 | + |
|---|
| 113 | +也就是「用哪个 appid 编译」就等于「用哪套接口」,不会出现接口与环境错配 —— 你只需要选对 bat。 |
|---|
| 114 | + |
|---|
| 115 | +--- |
|---|
| 116 | + |
|---|
| 117 | +## 6. 常见问题 |
|---|
| 118 | + |
|---|
| 119 | +| 现象 | 处理 | |
|---|
| 120 | +| --- | --- | |
|---|
| 121 | +| 窗口报 `'…' is not recognized as an internal or external command` 且带中文乱码 | bat 内混用 UTF-8 中文时,cmd 按代码页解析会错位。现在 4 个 bat **全部是 ASCII**,中文提示由 Node 打印。自己改 bat 时不要加中文,要加就用 Node 输出 | |
|---|
| 122 | +| `未找到 HBuilderX 命令行 cli.exe` / `未找到微信开发者工具命令行 cli.bat` | 按报错里的两种办法处理:加 `PATH` 或设对应环境变量(见第 1 节) | |
|---|
| 123 | +| 自动打开失败,提示未开启服务端口 | 开发者工具 → 设置 → 安全设置 → 打开服务端口;或手动「导入项目」选 `unpackage\dist\build\mp-weixin` | |
|---|
| 124 | +| 开发者工具里 appid 还是旧的 | appid 变更后需要在工具里**重新打开**该项目 | |
|---|
| 125 | +| `--no-gen 需要 manifest.json 已存在` | 先跑一次 `switch-*.bat`,或去掉 `--no-gen` | |
|---|
| 126 | +| `cli.exe 退出码 …` | 编译失败,看 HBuilderX 控制台里的具体报错 | |
|---|
| 127 | + |
|---|
| 128 | +--- |
|---|
| 129 | + |
|---|
| 130 | +## 7. 附注 |
|---|
| 131 | + |
|---|
| 132 | +- 4 个 bat 都会先 `cd /d "%~dp0"`,所以在任意目录双击或命令行调用都不会跑错位置;末尾 `pause` 方便双击后查看输出。 |
|---|
| 133 | +- 微信开发者工具生成的 `project.private.config.json` 目前仍入库(未被忽略)。若想连它一起做到零噪音,可自行加入 `.gitignore` 并执行 `git rm --cached project.private.config.json`。 |
|---|