@bepack/cli 0.1.0-beta.0 → 0.1.0-beta.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +2 -0
- package/README.zh-CN.md +2 -0
- package/dist/cli.js +3 -3
- package/dist/index.d.ts +57 -1
- package/dist/index.js +1 -1
- package/package.json +1 -1
- package/reference.md +192 -1
package/reference.md
CHANGED
|
@@ -81,6 +81,16 @@ export default defineConfig({
|
|
|
81
81
|
});
|
|
82
82
|
```
|
|
83
83
|
|
|
84
|
+
#### bepack.config.ts 支持的语法范围
|
|
85
|
+
|
|
86
|
+
`.ts` 配置文件通过 Node 原生 type-stripping 加载,**只支持"可擦除"的 TypeScript 语法**:
|
|
87
|
+
|
|
88
|
+
- ✅ `import type`、类型标注、`interface` / `type`、`satisfies`、as 断言
|
|
89
|
+
- ✅ 带类型的箭头函数参数(如 `(ctx: { cwd: string }) => ...`)
|
|
90
|
+
- ❌ 运行时产生代码的 TS 语法:`enum`(建议用 `as const` 对象)、带代码的 `namespace`、构造参数属性、legacy decorators
|
|
91
|
+
|
|
92
|
+
复杂 config(或依赖运行时逻辑的配置)建议把逻辑抽到独立的 `.mjs`/`.js` 模块再在 config 里 import,或直接使用 `bepack.config.mjs` / `bepack.config.js`。
|
|
93
|
+
|
|
84
94
|
生成的包类型可通过以下方式使用:
|
|
85
95
|
|
|
86
96
|
```json
|
|
@@ -121,6 +131,13 @@ type UserConfig = {
|
|
|
121
131
|
/** BP 编译配置(入口、TypeScript 检查、Rolldown 选项)。 */
|
|
122
132
|
compile?: {
|
|
123
133
|
entry: string;
|
|
134
|
+
/**
|
|
135
|
+
* 标识符引用替换(条件编译,推荐)。
|
|
136
|
+
* 值为 JavaScript 表达式字符串(如 `{ __TARGET__: JSON.stringify("server") }`)。
|
|
137
|
+
* 只替换**表达式位置的标识符引用**——`declare` 类型声明、对象键、字符串字面量、注释均不受影响。
|
|
138
|
+
* 与顶层 `replace` 并存;同一 key 不能同时配在两者中。
|
|
139
|
+
*/
|
|
140
|
+
define?: Record<string, string>;
|
|
124
141
|
tsconfig?: string;
|
|
125
142
|
typecheck?: boolean;
|
|
126
143
|
preserveModules?: boolean;
|
|
@@ -138,6 +155,19 @@ type UserConfig = {
|
|
|
138
155
|
/** 所有 BP 依赖都在此声明——包括清单依赖和纯代码依赖。 */
|
|
139
156
|
dependencies?: Record<string, "stable" | "beta" | "preview" | string>;
|
|
140
157
|
achievement?: boolean;
|
|
158
|
+
/**
|
|
159
|
+
* manifest 生成策略。
|
|
160
|
+
* - `merge: "preserve"`(默认):增量合并,保留用户手写字段。
|
|
161
|
+
* - `merge: "clean"`:从配置全量重建,非 managed 条目丢弃,改用 `extra*` 字段显式声明。
|
|
162
|
+
* - `minEngineVersion`:clean 模式下的 `header.min_engine_version`(format 2 自动转数组)。
|
|
163
|
+
*/
|
|
164
|
+
manifest?: {
|
|
165
|
+
merge?: "preserve" | "clean";
|
|
166
|
+
minEngineVersion?: string;
|
|
167
|
+
extraDependencies?: Record<string, unknown>[];
|
|
168
|
+
extraModules?: Record<string, unknown>[];
|
|
169
|
+
extraHeader?: Record<string, unknown>;
|
|
170
|
+
};
|
|
141
171
|
/** 额外的打包/复制文件列表(在默认 include 基础上追加)。 */
|
|
142
172
|
include?: string[];
|
|
143
173
|
};
|
|
@@ -147,6 +177,16 @@ type UserConfig = {
|
|
|
147
177
|
uuid: string;
|
|
148
178
|
moduleUuid: string;
|
|
149
179
|
pbr?: boolean;
|
|
180
|
+
/** 资源包可应用范围,写入 manifest header 的 `pack_scope`。默认 "any"。 */
|
|
181
|
+
packScope?: "world" | "global" | "any";
|
|
182
|
+
/** manifest 生成策略,与 bp 同构。 */
|
|
183
|
+
manifest?: {
|
|
184
|
+
merge?: "preserve" | "clean";
|
|
185
|
+
minEngineVersion?: string;
|
|
186
|
+
extraDependencies?: Record<string, unknown>[];
|
|
187
|
+
extraModules?: Record<string, unknown>[];
|
|
188
|
+
extraHeader?: Record<string, unknown>;
|
|
189
|
+
};
|
|
150
190
|
/** 额外的打包/复制文件列表。 */
|
|
151
191
|
include?: string[];
|
|
152
192
|
};
|
|
@@ -363,6 +403,18 @@ export default defineConfig({
|
|
|
363
403
|
4. 内置 `minecraft-vanilla-data` — `@minecraft/vanilla-data` 的 stable/preview 解析
|
|
364
404
|
5. 内置 `exact-version` — 任意精确版本说明符
|
|
365
405
|
|
|
406
|
+
### 依赖错误排查
|
|
407
|
+
|
|
408
|
+
`UNSUPPORTED_DEPENDENCY` 报错会附带**当前可用的 catalog 包列表**与扩展指引:
|
|
409
|
+
|
|
410
|
+
```txt
|
|
411
|
+
[Error] foo-pkg is not a managed dependency.
|
|
412
|
+
→ Managed packages: @minecraft/server, @minecraft/server-ui, ...
|
|
413
|
+
→ Add a missing package to install.dependencyCatalog, or remove it from packs.bp.dependencies.
|
|
414
|
+
```
|
|
415
|
+
|
|
416
|
+
执行 `bepack config --summary`(或 `bepack config --json`)可查看当前生效的完整依赖目录(内置 + 插件 + 自定义 `install.dependencyCatalog`)与解析器注册顺序。
|
|
417
|
+
|
|
366
418
|
## 清单管理
|
|
367
419
|
|
|
368
420
|
`bepack manifest` 和 `bepack install` 可以创建和修补清单。
|
|
@@ -411,6 +463,7 @@ RP 清单受控字段:
|
|
|
411
463
|
- `header.uuid`
|
|
412
464
|
- `header.version`
|
|
413
465
|
- `header.min_engine_version`
|
|
466
|
+
- `header.pack_scope`(当 `packs.rp.packScope` 配置时)
|
|
414
467
|
- 资源模块
|
|
415
468
|
- RP/BP 相互依赖
|
|
416
469
|
- `capabilities: ["pbr"]`(当 `pbr: true` 时)
|
|
@@ -425,6 +478,41 @@ RP 清单受控字段:
|
|
|
425
478
|
- 每个受管理的 Script API 依赖必须使用 `stable` 说明符。
|
|
426
479
|
- 如果在启用成就时使用了 `beta` 或 `preview` 依赖,BePack 会抛出 `ACHIEVEMENT_REQUIRES_STABLE_API`。
|
|
427
480
|
|
|
481
|
+
### manifest 生成策略
|
|
482
|
+
|
|
483
|
+
`packs.bp.manifest` / `packs.rp.manifest` 控制清单如何与已有文件合并:
|
|
484
|
+
|
|
485
|
+
| 条目来源 | `merge: "preserve"`(默认) | `merge: "clean"` |
|
|
486
|
+
| -------- | --------------------------- | ---------------- |
|
|
487
|
+
| `header.name` / `description` / `uuid` / `version` | config | config |
|
|
488
|
+
| `header.min_engine_version` | 保留旧文件值 | config(缺省用默认值,可用 `minEngineVersion` 显式指定) |
|
|
489
|
+
| managed 依赖 / module | 重建 | 重建 |
|
|
490
|
+
| 非 managed 条目(手写依赖、额外 module、capabilities 等) | **保留** | **丢弃**,改用 `extra*` 字段显式声明 |
|
|
491
|
+
| 其他 config 的残留(双配置交替构建) | 保留 → 污染 | **清除** |
|
|
492
|
+
|
|
493
|
+
`clean` 模式下可用的补充字段:
|
|
494
|
+
|
|
495
|
+
- `minEngineVersion`:写 `header.min_engine_version`。SemVer 字符串(如 `"1.21.80"`),format 2 自动转 `[1, 21, 80]`。
|
|
496
|
+
- `extraDependencies`:原样追加到 `dependencies`(非 catalog 依赖)。
|
|
497
|
+
- `extraModules`:原样追加到 `modules`(如自定义 script 模块)。
|
|
498
|
+
- `extraHeader`:合并进 `header`(如 `pack_scope`)。
|
|
499
|
+
|
|
500
|
+
推荐用法——双配置交替构建时,用 `clean` 的一侧从配置全量生成,杜绝另一侧 config 的残留:
|
|
501
|
+
|
|
502
|
+
```ts
|
|
503
|
+
// bepack.server.config.ts
|
|
504
|
+
export default defineConfig({
|
|
505
|
+
packs: {
|
|
506
|
+
bp: {
|
|
507
|
+
root: "bp",
|
|
508
|
+
manifest: { merge: "clean", minEngineVersion: "1.21.80" },
|
|
509
|
+
},
|
|
510
|
+
},
|
|
511
|
+
});
|
|
512
|
+
```
|
|
513
|
+
|
|
514
|
+
client 侧保持默认 `preserve`(尊重手写 manifest),server 侧 `clean`(从配置全量生成),无需再写外部清理脚本。
|
|
515
|
+
|
|
428
516
|
## 构建
|
|
429
517
|
|
|
430
518
|
`bepack build` 执行以下步骤:
|
|
@@ -459,7 +547,7 @@ Rolldown 行为:
|
|
|
459
547
|
- `packs.bp.compile.scriptOutputDir` 控制编译脚本输出目录(相对于 BP root),默认 `"scripts"`。manifest 中的 script 模块 `entry` 路径也会随之更新为 `<scriptOutputDir>/<entry文件名>.js`。
|
|
460
548
|
- 外部包来自 `packs.bp.compile.external`,默认情况下也来自受管理的依赖目录。
|
|
461
549
|
- `packs.bp.compile.minify: true` 或 `--minify` 启用 Rolldown 代码压缩,输出更小的 JS 文件。
|
|
462
|
-
- 字符串替换通过顶层 `replace` 配置:`replace.values` 支持字面量或接收已解析 config 的函数;`replace.builtins` 可开启 `**VERSION**`、`**NAME**`、`**UUID**`、`**DESCRIPTION**`。未配置替换时不会创建 replace plugin
|
|
550
|
+
- 字符串替换通过顶层 `replace` 配置:`replace.values` 支持字面量或接收已解析 config 的函数;`replace.builtins` 可开启 `**VERSION**`、`**NAME**`、`**UUID**`、`**DESCRIPTION**`。未配置替换时不会创建 replace plugin。所有替换 key 都按**字面精确匹配**(不做单词边界匹配),因此自定义值可以放心使用 `**自定义标记**` 这类被非单词字符包围的 token,例如 `replace.values: { "**AUTHOR**": "Your Name" }`。`**DESCRIPTION**` 优先使用 `packs.bp.description`,再回退到根 `description`。**feature flag / 条件编译请优先用 `packs.bp.compile.define`**(详见《构建注入与条件编译》),`replace` 保留给模板 token 等文本级替换。
|
|
463
551
|
- 构建完成后显示输出文件的大小统计(单文件显示路径和体积,多文件显示总文件数和总体积)。
|
|
464
552
|
|
|
465
553
|
> 注意:构建命令(`build` / `dev`)不再要求 BP 必须存在。如果项目只有 RP 或 BP 没有配置 `compile`,则跳过编译流程,只执行 manifest 修补和可选的文件复制/打包。
|
|
@@ -476,6 +564,93 @@ timing rolldown 45 ms
|
|
|
476
564
|
|
|
477
565
|
`--timing` 同样支持 `bepack dev` 命令。
|
|
478
566
|
|
|
567
|
+
## 构建注入与条件编译
|
|
568
|
+
|
|
569
|
+
BePack 提供两种编译期注入机制,**建议按用途选择**:
|
|
570
|
+
|
|
571
|
+
| 对比 | `replace`(顶层) | `define`(`packs.bp.compile.define`) |
|
|
572
|
+
| ---- | ---------------- | ------------------------------------- |
|
|
573
|
+
| 替换目标 | 所有出现位置(声明、注释、字符串内也换) | **仅标识符引用**(表达式位置) |
|
|
574
|
+
| `declare const __T__: ...` | 被破坏(`declare const "client"`) | **保留**(typecheck 正常) |
|
|
575
|
+
| `if (__T__ === "server")` | 可折叠 | 可折叠 |
|
|
576
|
+
| 典型用途 | 模板 token、历史兼容 | **feature flag / 条件编译(推荐)** |
|
|
577
|
+
| 冲突规则 | — | 与 `replace.values` 同一 key 同时配置会报错 |
|
|
578
|
+
|
|
579
|
+
### define 用法
|
|
580
|
+
|
|
581
|
+
`define` 的值是 **JavaScript 表达式字符串**,写入前 BePack 会做语法校验并定位报错:
|
|
582
|
+
|
|
583
|
+
```ts
|
|
584
|
+
export default defineConfig({
|
|
585
|
+
packs: {
|
|
586
|
+
bp: {
|
|
587
|
+
compile: {
|
|
588
|
+
entry: "src/main.ts",
|
|
589
|
+
define: {
|
|
590
|
+
__TARGET__: JSON.stringify("server"), // → '"server"'
|
|
591
|
+
__FLAG__: "true", // → true
|
|
592
|
+
},
|
|
593
|
+
},
|
|
594
|
+
},
|
|
595
|
+
},
|
|
596
|
+
});
|
|
597
|
+
```
|
|
598
|
+
|
|
599
|
+
`declare` 声明可以留在源码里,typecheck 与运行时都正常:
|
|
600
|
+
|
|
601
|
+
```ts
|
|
602
|
+
declare const __TARGET__: "server" | "client";
|
|
603
|
+
|
|
604
|
+
if (__TARGET__ === "server") {
|
|
605
|
+
console.log("server-only path");
|
|
606
|
+
}
|
|
607
|
+
```
|
|
608
|
+
|
|
609
|
+
编译产物只替换引用:对象键、字符串字面量、注释中的同名 token 均不受影响。
|
|
610
|
+
|
|
611
|
+
### 双产物示例(一次构建产出 server / client 两份脚本)
|
|
612
|
+
|
|
613
|
+
利用两套 config + 共享的 `declare` 声明:
|
|
614
|
+
|
|
615
|
+
```ts
|
|
616
|
+
// src/main.ts
|
|
617
|
+
declare const __TARGET__: "server" | "client";
|
|
618
|
+
export const target = __TARGET__;
|
|
619
|
+
```
|
|
620
|
+
|
|
621
|
+
```ts
|
|
622
|
+
// bepack.server.config.ts
|
|
623
|
+
export default defineConfig({
|
|
624
|
+
name: "my-addon-server",
|
|
625
|
+
packs: {
|
|
626
|
+
bp: {
|
|
627
|
+
root: "bp",
|
|
628
|
+
compile: { entry: "src/main.ts", define: { __TARGET__: JSON.stringify("server") } },
|
|
629
|
+
},
|
|
630
|
+
},
|
|
631
|
+
});
|
|
632
|
+
```
|
|
633
|
+
|
|
634
|
+
```ts
|
|
635
|
+
// bepack.client.config.ts —— 同上,仅 define 值改为 JSON.stringify("client")
|
|
636
|
+
```
|
|
637
|
+
|
|
638
|
+
```bash
|
|
639
|
+
bepack build --config bepack.server.config.ts
|
|
640
|
+
bepack build --config bepack.client.config.ts
|
|
641
|
+
```
|
|
642
|
+
|
|
643
|
+
## Tree-shaking 与产物裁剪
|
|
644
|
+
|
|
645
|
+
BePack 默认 `preserveModules: true`,Rolldown 仍会做 tree-shaking:
|
|
646
|
+
|
|
647
|
+
- **未引用的模块**(import 了但没有任何导出被使用)不会出现在输出目录。
|
|
648
|
+
- **死代码导出**(同模块内未被引用的导出)被剔除。
|
|
649
|
+
- **动态 `import()`** 会拆分为独立 chunk 输出(如 `dynamic.js`),并按需加载。
|
|
650
|
+
- 结果:输出目录 = 仅存活模块 + 动态 import chunk。
|
|
651
|
+
|
|
652
|
+
验证方法:构建后检查 `<packs.bp.root>/<scriptOutputDir>`(默认 `bp/scripts`)下的文件列表,对比源码模块数。
|
|
653
|
+
|
|
479
654
|
## 开发模式
|
|
480
655
|
|
|
481
656
|
`bepack dev`:
|
|
@@ -742,6 +917,22 @@ hooks: {
|
|
|
742
917
|
|
|
743
918
|
未传入 `--mode` 时,`mode` 为 `undefined`,保持完全向后兼容。
|
|
744
919
|
|
|
920
|
+
#### `--mode` 取值约定
|
|
921
|
+
|
|
922
|
+
BePack 对 `mode` 的取值**不做语义判断**,以下只是社区推荐约定(可自定义):
|
|
923
|
+
|
|
924
|
+
| mode | 语义 |
|
|
925
|
+
| ---- | ---- |
|
|
926
|
+
| `development` | 开发构建(默认不传时的常见取值),跳过发布相关动作 |
|
|
927
|
+
| `release` / `template` | 发布 / 模板构建,可跳过复制、跳过打包 |
|
|
928
|
+
| 自定义任意字符串 | 由钩子内自行判断 |
|
|
929
|
+
|
|
930
|
+
要点:
|
|
931
|
+
|
|
932
|
+
- `mode` 透传给**同一命令的所有相关钩子**(如 `build` 的 `beforeBuild` / `afterBuild`;`dev` 的初始构建与增量重建)。
|
|
933
|
+
- 判断用 `===` 精确匹配;未传 `--mode` 时 `mode === undefined`,可当作默认分支。
|
|
934
|
+
- 不要依赖 `mode` 来区分命令——命令用 `ctx.command`(`"build"` / `"dev"` / ...)判断。
|
|
935
|
+
|
|
745
936
|
## 输出与错误
|
|
746
937
|
|
|
747
938
|
常规模式下,CLI 输出使用彩色阶段标签和时间戳。
|