更新记录

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.jsonuni-app.scripts, 一个环境一个菜单项,env 由编译器直接注入)—— 那条路覆盖不到 App。


三部分组成

装在哪 是什么 干什么
HBuilderX 的 plugins 目录 插件 hbx-env-pack 打包前弹窗选环境,把选中的 id 写进项目根的 env-pack.json
项目 npm 依赖 hbx-env-pack-inject 构建时读 env-pack.jsonmode → 加载对应 .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'),那样等于把项目的配置文件整个占掉。

别改 configFileprefix 插件把 env-pack.jsonVUE_APP_ 都写死了, 项目这边改了它俩就对不上:prefix: 'CUSTOM_' 的话,插件的校验会认为环境里 一个变量都没有,环境选不进去(单选框拨回原环境,mode 永远写不进去)。 这两个选项是给不用插件的纯 vue-cli 项目留的。

4. 代码里读

export const HOST = process.env.VUE_APP_HOST
export const BASE_URL = `${HOST}/api`

不要再写任何环境相关的字面值。


打包流程

  1. 菜单栏 发行 → 环境打包(选择环境后打包)
  2. 弹窗里选打包形态(app 整包 / wgt 资源包)、环境、版本号,点「写入并打包」
  3. 出包前想确认打的是哪个环境:发行 → 查看当前打包环境(不打包,只报一句)

环境是「选中就生效」的:点一下环境单选框,env-pack.jsonmode 当场就写好了。 所以取消弹窗不会回退环境——选完不用再点一次提交才知道生效没有。打包形态、版本号 这两个则只在点提交时才动(版本号尤其不能跟着单选走,否则点几下就涨几次)。

弹窗底部会把这个环境的变量一条条摊开,变量名和值都显示,切环境时跟着换:

/.env.prod
VUE_APP_HOST = https://api.example.com

选错环境在这里就能看出来,不用等打完包才发现。环境配得不对(文件不存在、或没写 file) 时,这里直接显示原因,并且不会写盘:单选框拨回原环境,宁可保持现状, 也不让 mode 指到一个读不出变量的文件上。

插件的选择是「粘性」的——选了 prod 之后,即使下次不绕插件、直接点原生「发行」菜单, 也仍然按 prod 打包。所以出包前用「查看当前打包环境」确认一下最稳妥。


配置文件 env-pack.json

放在项目根,提交到仓库。首次执行命令时若不存在会自动生成一份带默认值的,照着改即可。

字段 说明
mode 当前环境 id,取值来自 envListid。弹窗里选中环境时就改写,也可以手工改
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(测试)环境为例,两步:

  1. .env.test,照着 .env.dev 写,改掉里面的 VUE_APP_HOST
  2. env-pack.jsonenvList 里加一项:
{ "id": "test", "label": "测试", "file": "/.env.test" }

不用改代码。file 可以指向任意路径(不必叫 .env.<id>)。


注意事项

版本号会被改:默认选项是「不修改」,保持原样。选了某项自增的话,versionCode 的算法是 主*10000 + 副*100 + 修订1.0.1610016),保证始终递增;你的包第一次会从 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_XXXundefined 前缀不是 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

隐私、权限声明

1. 本插件需要申请的系统权限列表:

2. 本插件采集的数据、发送的服务器地址、以及数据用途说明:

插件不采集任何数据

3. 本插件是否包含广告,如包含需详细说明广告表达方式、展示频率:

许可协议

MIT协议

暂无用户评论。