更新记录
1.0.1(2026-09-10) 下载此版本
重构设计
1.0.0(2026-09-10) 下载此版本
发布hbx-env-pack插件
平台兼容性
| HbuilderX/cli最低兼容版本 |
|---|
| 3.0.0 |
hbx-env-pack — HBuilderX 环境打包插件
打包前选一个环境,构建时把那个环境的 .env.* 注入 process.env。选什么打什么。
只支持 App。 H5 和小程序请用官方的自定义运行/发行(package.json → uni-app.scripts,
一个环境一个菜单项,env 由编译器直接注入)—— 那条路覆盖不到 App。
三部分组成
| 装在哪 | 是什么 | 干什么 |
|---|---|---|
HBuilderX 的 plugins 目录 |
插件 hbx-env-pack |
打包前弹窗选环境,把选中的 id 写进项目根的 env-pack.json |
| 项目 npm 依赖 | hbx-env-pack-inject |
构建时读 env-pack.json 的 mode → 加载对应 .env → 注入 process.env |
| 项目根(提交到仓库) | env-pack.json + .env.* |
环境列表 + 当前环境;各环境的变量 |
插件负责写「当前是哪个环境」,npm 包负责读它并注入。两个都要装,缺一个不生效。
接入四步
1. 装 npm 包
npm i -D hbx-env-pack-inject
2. 建各环境的变量文件(项目根,提交到仓库)
# .env.dev
VUE_APP_HOST=https://api-dev.example.com
# .env.prod
VUE_APP_HOST=https://api.example.com
只认 VUE_APP_ 前缀——这条是插件写死的,改不了(见下)。
3. 写 vue.config.js(项目根,必须存在)
const { withEnvInject } = require('hbx-env-pack-inject')
module.exports = withEnvInject({
// 项目自己的 vue-cli 配置照常写在这里,跟这个包互不干扰
})
只装插件、不写这个文件,选环境不会有任何效果——包能打出来,但接口地址没变。
也别写成 module.exports = require('hbx-env-pack-inject'),那样等于把项目的配置文件整个占掉。
别改
configFile和prefix。 插件把env-pack.json和VUE_APP_都写死了, 项目这边改了它俩就对不上:prefix: 'CUSTOM_'的话,插件的校验会认为环境里 一个变量都没有,环境选不进去(单选框拨回原环境,mode永远写不进去)。 这两个选项是给不用插件的纯 vue-cli 项目留的。
4. 代码里读
export const HOST = process.env.VUE_APP_HOST
export const BASE_URL = `${HOST}/api`
不要再写任何环境相关的字面值。
打包流程
- 菜单栏 发行 → 环境打包(选择环境后打包)
- 弹窗里选打包形态(app 整包 / wgt 资源包)、环境、版本号,点「写入并打包」
- 出包前想确认打的是哪个环境:发行 → 查看当前打包环境(不打包,只报一句)
环境是「选中就生效」的:点一下环境单选框,env-pack.json 的 mode 当场就写好了。
所以取消弹窗不会回退环境——选完不用再点一次提交才知道生效没有。打包形态、版本号
这两个则只在点提交时才动(版本号尤其不能跟着单选走,否则点几下就涨几次)。
弹窗底部会把这个环境的变量一条条摊开,变量名和值都显示,切环境时跟着换:
/.env.prod
VUE_APP_HOST = https://api.example.com
选错环境在这里就能看出来,不用等打完包才发现。环境配得不对(文件不存在、或没写 file)
时,这里直接显示原因,并且不会写盘:单选框拨回原环境,宁可保持现状,
也不让 mode 指到一个读不出变量的文件上。
插件的选择是「粘性」的——选了 prod 之后,即使下次不绕插件、直接点原生「发行」菜单, 也仍然按 prod 打包。所以出包前用「查看当前打包环境」确认一下最稳妥。
配置文件 env-pack.json
放在项目根,提交到仓库。首次执行命令时若不存在会自动生成一份带默认值的,照着改即可。
| 字段 | 说明 |
|---|---|
mode |
当前环境 id,取值来自 envList 的 id。弹窗里选中环境时就改写,也可以手工改 |
envList |
环境列表。每项的 file 是该环境的环境变量文件路径,必填 |
manifestFilePath |
manifest.json 的路径,只有要改版本号时才会读写 |
appPackModes |
App 的打包形态:app 整包 / wgt 资源包 |
versionModes |
版本号自增选项,选项个数要与 versionName 的段数一致 |
{
"mode": "dev",
"manifestFilePath": "/manifest.json",
"envList": [
{ "id": "dev", "label": "开发", "file": "/.env.dev" },
{ "id": "prod", "label": "生产", "file": "/.env.prod" }
],
"appPackModes": [
{ "id": "app", "label": "app 整包" },
{ "id": "wgt", "label": "wgt 资源包" }
],
"versionModes": [
{ "id": "none", "label": "不修改" },
{ "id": "0", "label": "主版本 +1" },
{ "id": "1", "label": "副版本 +1" },
{ "id": "2", "label": "修订号 +1" }
]
}
插件只定点改写 mode 那一行,所以除了这一行不会产生别的 diff。
另有一份 .hbuilderx/env-pack.local.json,只记录上次选的打包形态,每打一次包都会变。
不想让它在 git 里产生噪音就加进 .gitignore。
新增一个环境
以加一个 test(测试)环境为例,两步:
- 建
.env.test,照着.env.dev写,改掉里面的VUE_APP_HOST - 在
env-pack.json的envList里加一项:
{ "id": "test", "label": "测试", "file": "/.env.test" }
不用改代码。file 可以指向任意路径(不必叫 .env.<id>)。
注意事项
版本号会被改:默认选项是「不修改」,保持原样。选了某项自增的话,versionCode 的算法是
主*10000 + 副*100 + 修订(1.0.16 → 10016),保证始终递增;你的包第一次会从 1016
跳到 10016(只跳这一次),只要服务端的升级判断按「更大即更新」来就没问题。
环境变量是编译期写死的:改完环境必须重新运行/发行,热更新不会重新注入。 想确认某个包到底是哪个环境,看打包时控制台输出的这一行:
[env] 环境=prod(来源:env-pack.json)加载 /.env.prod -> VUE_APP_HOST
来源 是 env-pack.json 说明走对了;是 NODE_ENV 说明没读到 mode。
mode 会进 git:每切一次环境打包,env-pack.json 都会变一行——这是为了让新克隆的项目
自带一个确定的默认环境。多人协作时注意别把别人切的 mode 顺手带进提交。
排障
| 症状 | 怎么办 |
|---|---|
| 「发行」菜单里没有这两个命令 | 插件要装在 HBuilderX 的 plugins\hbx-env-pack\ 下(HBuilderX 只从自己的插件目录加载,不会从项目目录读),目录名必须正好是 hbx-env-pack;装完重启 HBuilderX |
| 改了插件代码但行为没变 | HBuilderX 加载的是 plugins 目录下那份,不是项目里的,得重新复制;嫌麻烦就把 plugins\hbx-env-pack 做成指向源码目录的符号链接(Windows mklink /D、macOS / Linux ln -s) |
| 弹窗显示「找不到 /.env.xxx」 | envList 里该项的 file 指向的文件不存在,或路径写错了 |
| 弹窗报「环境 xxx 没有配置 file」 | envList 里那项缺 file。插件不做「按 id 猜文件名」的推导 |
| 弹窗报「envList 里没有 id 为 xxx 的环境」 | mode 的值不在 envList 里,多半是手改过 mode、或删掉了某个环境 |
| 包能打出来,但接口地址没变 | 项目根没有 vue.config.js,或没走 withEnvInject。只装插件不写它,选环境不会有任何效果 |
控制台 来源:NODE_ENV |
env-pack.json 不存在或没有 mode。执行一次「环境打包」,或手工给 mode 写上 envList 里的某个 id |
构建报 Error loading vue.config.js |
hbx-env-pack-inject 没装(npm install 没跑),或 vue.config.js 里有语法错 |
process.env.VUE_APP_XXX 是 undefined |
前缀不是 VUE_APP_,或该 .env 文件里根本没这一行;也可能是改完没重新运行/发行 |
已知限制
- 只负责 App 的「打包前切环境」,不做小程序上传、不做版本发布
- 不做「按 id 推导环境文件名」:
envList每项的file必填 - 改版本号依赖 HBuilderX 的
hx.util.readJSONValue/writeJSONValue(manifest.json 带注释, 不能用JSON.parse);不启用版本号功能(选「不修改」)就完全不碰这条路径
为什么「这次用哪个环境」非得落一个文件、为什么 vue.config.js 躲不掉、
为什么包名不能叫 vue-cli-plugin-*,见 skills/uni-app-env-pack/reference.md。

收藏人数:
下载插件并导入HBuilderX
下载插件ZIP
赞赏(0)
下载 1
赞赏 0
下载 12584823
赞赏 1949
赞赏
京公网安备:11010802035340号