@bepack/cli 0.1.0-beta.1 → 0.1.0-beta.3
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 +82 -12
- package/README.zh-CN.md +82 -12
- package/dist/cli.js +5 -5
- package/dist/index.d.ts +166 -12
- package/dist/index.js +1 -1
- package/package.json +4 -3
- package/reference.md +329 -23
package/reference.md
CHANGED
|
@@ -139,6 +139,7 @@ type UserConfig = {
|
|
|
139
139
|
*/
|
|
140
140
|
define?: Record<string, string>;
|
|
141
141
|
tsconfig?: string;
|
|
142
|
+
/** 打包前是否运行 tsc 类型检查。默认 true(即默认会跑)。 */
|
|
142
143
|
typecheck?: boolean;
|
|
143
144
|
preserveModules?: boolean;
|
|
144
145
|
external?: (string | RegExp)[];
|
|
@@ -151,10 +152,16 @@ type UserConfig = {
|
|
|
151
152
|
};
|
|
152
153
|
/** 编译脚本输出目录,相对于 BP root。默认 "scripts"。 */
|
|
153
154
|
scriptOutputDir?: string;
|
|
155
|
+
/**
|
|
156
|
+
* 额外的 Rolldown 选项(对象),或自定义函数 (options, context) => options。
|
|
157
|
+
* 在 BePack 生成的选项之上增量合并;input 与输出位置字段由 BePack 管理。
|
|
158
|
+
*/
|
|
159
|
+
rolldown?: RolldownOptions | RolldownCustomizeFunction;
|
|
160
|
+
/** Rolldown 配置文件路径(相对项目根或绝对路径),支持 .ts/.mts/.js/.mjs。 */
|
|
161
|
+
rolldownConfig?: string;
|
|
154
162
|
};
|
|
155
163
|
/** 所有 BP 依赖都在此声明——包括清单依赖和纯代码依赖。 */
|
|
156
164
|
dependencies?: Record<string, "stable" | "beta" | "preview" | string>;
|
|
157
|
-
achievement?: boolean;
|
|
158
165
|
/**
|
|
159
166
|
* manifest 生成策略。
|
|
160
167
|
* - `merge: "preserve"`(默认):增量合并,保留用户手写字段。
|
|
@@ -214,19 +221,41 @@ type UserConfig = {
|
|
|
214
221
|
name?: string | { bp?: string; rp?: string };
|
|
215
222
|
}
|
|
216
223
|
>;
|
|
224
|
+
/**
|
|
225
|
+
* 复制到开发目录时也生成 __brarchive 归档,方便实机验证"打包后的形态"。
|
|
226
|
+
* 默认关闭;要求与 pack.optimize 相同的 min_engine_version >= 1.26.40。
|
|
227
|
+
*/
|
|
228
|
+
optimize?: boolean | PackOptimizeOptions;
|
|
217
229
|
};
|
|
218
230
|
|
|
219
231
|
dev?: {
|
|
220
232
|
copy?: false | true | string;
|
|
221
233
|
watch?: {
|
|
222
234
|
include?: string[];
|
|
223
|
-
include?: string[];
|
|
224
235
|
};
|
|
225
236
|
};
|
|
226
237
|
|
|
227
238
|
pack?: {
|
|
228
239
|
name?: string;
|
|
229
240
|
outDir?: string;
|
|
241
|
+
/**
|
|
242
|
+
* 把包内散文件打成 __brarchive 归档(Minecraft 官方 pack optimizer 的行为)。
|
|
243
|
+
* 默认关闭。开启后 BePack 会往产物 manifest 写入
|
|
244
|
+
* header.pack_optimization_version = "0.1.0"(这是让引擎读归档的开关)。
|
|
245
|
+
* 只影响 pack 产物;复制到开发目录默认不优化,可用 copy.optimize 开启。
|
|
246
|
+
*/
|
|
247
|
+
optimize?: boolean | {
|
|
248
|
+
/** 额外保留"散文件 + 归档存根"的目录(默认按包类型内置列表)。传 false 表示全部只进归档。 */
|
|
249
|
+
keepLoose?: string[] | false;
|
|
250
|
+
/** 这些目录完全不归档,只留散文件。默认无。 */
|
|
251
|
+
exclude?: string[];
|
|
252
|
+
/** 是否压缩 JSON 条目。默认 true。 */
|
|
253
|
+
minifyJson?: boolean;
|
|
254
|
+
/** 产物 manifest 里 header.pack_optimization_version 的取值。默认 "0.1.0"。 */
|
|
255
|
+
packOptimizationVersion?: string;
|
|
256
|
+
/** 关闭 min_engine_version < 1.26.40 时的兼容性警告。默认 false(会警告但照常输出)。 */
|
|
257
|
+
allowUnsupportedTarget?: boolean;
|
|
258
|
+
};
|
|
230
259
|
};
|
|
231
260
|
};
|
|
232
261
|
```
|
|
@@ -336,6 +365,25 @@ dependencies: {
|
|
|
336
365
|
|
|
337
366
|
当清单依赖中使用 `preview` 或 `beta` 说明符而未先运行 `bepack install` 时,BePack 会抛出 `DEPENDENCY_REQUIRES_INSTALL`。这与 `stable` 的行为相同——说明符本身永远不会直接写入 `manifest.json`。
|
|
338
367
|
|
|
368
|
+
### manifest 依赖版本的权威来源与日志
|
|
369
|
+
|
|
370
|
+
写入 `manifest.json` 的受管依赖版本按以下优先级决定(高 → 低):
|
|
371
|
+
|
|
372
|
+
1. **配置里的精确版本**:`packs.bp.dependencies` 写成 `"2.10.0"` 时,它就是最终值。`bepack install` 的结果(包括注册表解析结果)与现有 manifest 里的旧值都**不会**覆盖它。
|
|
373
|
+
2. **`bepack install` / `build --install` 解析出的版本**:仅用于 `stable` / `beta` / `preview` 这类频道说明符。
|
|
374
|
+
3. **现有 manifest 中已写入的版本**:`bepack build` / `bepack manifest` / `bepack dev` **不访问网络**,频道说明符在离线时会复用 manifest 里已有的具体版本。
|
|
375
|
+
|
|
376
|
+
第 3 条曾经是最大的排查陷阱:`build` 会静默沿用旧版本,看起来像是"版本被写死"。现在每条受管依赖的最终版本都会打印出来:
|
|
377
|
+
|
|
378
|
+
```txt
|
|
379
|
+
manifest @minecraft/server: 2.0.0 -> 2.10.0 (specifier "stable", install)
|
|
380
|
+
manifest @minecraft/server-ui 2.0.0 kept from manifest (specifier "stable") — run `bepack install` to refresh
|
|
381
|
+
```
|
|
382
|
+
|
|
383
|
+
`bepack manifest --json` / `bepack build --json` 的 `files.bpManifest.dependencies` 也会返回 `{ module_name, specifier, version, source, previous }`,其中 `source` 是 `"config"`、`"install"` 或 `"manifest"`,可直接用于判断版本是谁写的。
|
|
384
|
+
|
|
385
|
+
所以:**要刷新频道依赖的具体版本,必须联网执行 `bepack install`(或 `bepack build --install`)**;只想固定某个版本,就在配置里写精确版本号。
|
|
386
|
+
|
|
339
387
|
### 安装日志
|
|
340
388
|
|
|
341
389
|
常规安装日志显示简洁的进度:
|
|
@@ -348,6 +396,19 @@ dependencies: {
|
|
|
348
396
|
|
|
349
397
|
使用 `--verbose` 可查看更底层的详细信息,如缓存命中、版本数量和推断过程。
|
|
350
398
|
|
|
399
|
+
### npm 12 与 `--allow-scripts`
|
|
400
|
+
|
|
401
|
+
npm 12 会把 `--allow-scripts` 当作 CLI 层策略,并**拒绝在项目级安装中使用**:
|
|
402
|
+
|
|
403
|
+
```txt
|
|
404
|
+
npm error code EALLOWSCRIPTS
|
|
405
|
+
npm error --allow-scripts is not allowed in project-scoped installs.
|
|
406
|
+
```
|
|
407
|
+
|
|
408
|
+
`npm run <script>` 会把解析出的 npm 配置导出成 `npm_config_*` 环境变量,所以只要用户级/全局 `.npmrc` 里写了 `allow-scripts=...`,这个值就会泄漏到 `bepack install` 子进程里,让它调用的 `npm install` 直接失败。BePack 在启动包管理器前会剔除继承来的 `npm_config_allow_scripts` 并打印一条提示;允许列表本身仍然通过 `.npmrc` 或 `package.json` 的 `allowScripts` 字段生效(这正是 npm 报错里建议的做法)。其它 npm 配置(registry、认证等)不受影响,仍会传给子进程。
|
|
409
|
+
|
|
410
|
+
需要完全跳过包管理器时用 `install.runPackageManager: false`,或 CLI `bepack install --skip-pm`。
|
|
411
|
+
|
|
351
412
|
### 依赖目录与解析器扩展点
|
|
352
413
|
|
|
353
414
|
安装解析分为依赖目录和解析器注册表两部分。
|
|
@@ -453,7 +514,6 @@ BP 清单受控字段:
|
|
|
453
514
|
- 脚本模块
|
|
454
515
|
- BePack 管理的 `@minecraft/*` 依赖
|
|
455
516
|
- BP/RP 相互依赖
|
|
456
|
-
- `metadata.product_type`(仅在 `achievement: true` 时)
|
|
457
517
|
|
|
458
518
|
RP 清单受控字段:
|
|
459
519
|
|
|
@@ -472,12 +532,6 @@ RP 清单受控字段:
|
|
|
472
532
|
|
|
473
533
|
当同时配置了 BP 和 RP 时,BePack 会维护它们 header UUID 之间的相互依赖。
|
|
474
534
|
|
|
475
|
-
成就元数据:
|
|
476
|
-
|
|
477
|
-
- `packs.bp.achievement: true` 添加 `metadata.product_type = "addon"`。
|
|
478
|
-
- 每个受管理的 Script API 依赖必须使用 `stable` 说明符。
|
|
479
|
-
- 如果在启用成就时使用了 `beta` 或 `preview` 依赖,BePack 会抛出 `ACHIEVEMENT_REQUIRES_STABLE_API`。
|
|
480
|
-
|
|
481
535
|
### manifest 生成策略
|
|
482
536
|
|
|
483
537
|
`packs.bp.manifest` / `packs.rp.manifest` 控制清单如何与已有文件合并:
|
|
@@ -485,14 +539,16 @@ RP 清单受控字段:
|
|
|
485
539
|
| 条目来源 | `merge: "preserve"`(默认) | `merge: "clean"` |
|
|
486
540
|
| -------- | --------------------------- | ---------------- |
|
|
487
541
|
| `header.name` / `description` / `uuid` / `version` | config | config |
|
|
488
|
-
| `header.min_engine_version` |
|
|
542
|
+
| `header.min_engine_version` | 保留旧文件值;配置了 `minEngineVersion` 时以配置为准 | config(缺省用默认值,可用 `minEngineVersion` 显式指定) |
|
|
489
543
|
| managed 依赖 / module | 重建 | 重建 |
|
|
490
544
|
| 非 managed 条目(手写依赖、额外 module、capabilities 等) | **保留** | **丢弃**,改用 `extra*` 字段显式声明 |
|
|
491
545
|
| 其他 config 的残留(双配置交替构建) | 保留 → 污染 | **清除** |
|
|
492
546
|
|
|
547
|
+
`minEngineVersion` 在两种模式下都生效:`preserve` 下它覆盖 manifest 里已有的值(不改配置就继续保留旧值),`clean` 下它就是生成值。
|
|
548
|
+
|
|
493
549
|
`clean` 模式下可用的补充字段:
|
|
494
550
|
|
|
495
|
-
- `minEngineVersion`:写 `header.min_engine_version`。SemVer 字符串(如 `"1.21.80"`),format 2 自动转 `[1, 21, 80]
|
|
551
|
+
- `minEngineVersion`:写 `header.min_engine_version`。SemVer 字符串(如 `"1.21.80"`),format 2 自动转 `[1, 21, 80]`。两种 merge 模式都可用。
|
|
496
552
|
- `extraDependencies`:原样追加到 `dependencies`(非 catalog 依赖)。
|
|
497
553
|
- `extraModules`:原样追加到 `modules`(如自定义 script 模块)。
|
|
498
554
|
- `extraHeader`:合并进 `header`(如 `pack_scope`)。
|
|
@@ -518,25 +574,30 @@ client 侧保持默认 `preserve`(尊重手写 manifest),server 侧 `clean
|
|
|
518
574
|
`bepack build` 执行以下步骤:
|
|
519
575
|
|
|
520
576
|
```txt
|
|
521
|
-
|
|
577
|
+
清单修补(hooks.beforeManifest / afterManifest)
|
|
522
578
|
hooks.beforeBuild
|
|
523
|
-
|
|
579
|
+
类型检查(tsc --noEmit,默认开启)
|
|
524
580
|
Rolldown 构建
|
|
525
581
|
hooks.afterBuild
|
|
526
|
-
|
|
527
|
-
|
|
582
|
+
可选复制(hooks.beforeCopy / afterCopy)
|
|
583
|
+
可选打包(hooks.beforePack / afterPack)
|
|
528
584
|
```
|
|
529
585
|
|
|
586
|
+
> **默认会运行 TypeScript 类型检查。** 只要配置了 `packs.bp.compile`,`bepack build` 与 `bepack dev` 都会在 Rolldown 打包**之前**执行 `tsc --noEmit`;检查失败会以 `TYPECHECK_FAILED` 终止本次构建,不会产出残缺脚本。跳过方式:CLI `--skip-typecheck`,或 `packs.bp.compile.typecheck: false`。注意类型检查与打包是两件独立的事——自定义 Rolldown 选项、替换 `rolldown` 配置都不会关闭它,要关只能显式配置。
|
|
587
|
+
|
|
530
588
|
CLI 选项:
|
|
531
589
|
|
|
532
590
|
- `--mode <value>`:执行模式,透传给 Hook 上下文(`HookContext.mode`)。不设则为 `undefined`。Hook 内自行判断是否执行特定逻辑。
|
|
591
|
+
- `--rolldown-config <path>`:临时指定 Rolldown 配置文件,覆盖 `packs.bp.compile.rolldownConfig`(`bepack dev` 同样支持)。
|
|
592
|
+
- `--optimize`:与 `--pack` / `--copy` 一起使用时,把产物(或开发目录)优化为 `__brarchive/` 归档(`--no-optimize` 可覆盖配置)。详见《打包》一节的 Pack 优化。
|
|
533
593
|
|
|
534
594
|
类型检查行为:
|
|
535
595
|
|
|
536
|
-
-
|
|
596
|
+
- **默认:系统 `tsc --noEmit`(`packs.bp.compile.typecheck` 默认为 `true`)。** 只有显式设置 `typecheck: false` 或传 `--skip-typecheck` 才会跳过。
|
|
537
597
|
- `build.useNpx: true` 或 `--use-npx`:`npx tsc --noEmit`。
|
|
538
598
|
- `packs.bp.compile.cache`:增量编译缓存配置。`cache.dev`(默认 `true`)控制 dev 模式;`cache.build`(默认 `false`)控制 build 模式。`cache.file` 指定 `.tsbuildinfo` 路径。`bepack build --cache` / `--no-cache` 可覆盖 build 模式。`dev` 命令默认启用缓存。
|
|
539
599
|
- 缺少 `tsconfig.json` 会提前失败,返回 `TYPECHECK_FAILED`。
|
|
600
|
+
- 类型检查在 `hooks.beforeBuild` 之后、Rolldown 之前运行;`--dry-run` 会跳过它。
|
|
540
601
|
|
|
541
602
|
Rolldown 行为:
|
|
542
603
|
|
|
@@ -552,7 +613,7 @@ Rolldown 行为:
|
|
|
552
613
|
|
|
553
614
|
> 注意:构建命令(`build` / `dev`)不再要求 BP 必须存在。如果项目只有 RP 或 BP 没有配置 `compile`,则跳过编译流程,只执行 manifest 修补和可选的文件复制/打包。
|
|
554
615
|
|
|
555
|
-
`
|
|
616
|
+
`manifest: true` 的受管理包(例如 `@minecraft/server`、`@minecraft/server-ui`、`@minecraft/server-net`)**始终**作为 external 写入 rolldown,不会被内联打包;`manifest: false` 的包(例如 `@minecraft/vanilla-data`)可以被打包进产物。需要额外的 external 时,通过 `packs.bp.compile.external` 追加字符串或正则。
|
|
556
617
|
|
|
557
618
|
`build.timing: true` 或 `--timing` 可在构建时显示各步骤的耗时明细,便于排查性能瓶颈:
|
|
558
619
|
|
|
@@ -564,6 +625,95 @@ timing rolldown 45 ms
|
|
|
564
625
|
|
|
565
626
|
`--timing` 同样支持 `bepack dev` 命令。
|
|
566
627
|
|
|
628
|
+
## 自定义 Rolldown 配置
|
|
629
|
+
|
|
630
|
+
`packs.bp.compile` 覆盖了常见场景,Rolldown 的完整能力通过三个入口开放:
|
|
631
|
+
|
|
632
|
+
- `packs.bp.compile.rolldown`:内联选项对象,或自定义函数;
|
|
633
|
+
- `packs.bp.compile.rolldownConfig`:Rolldown 配置文件路径(相对项目根或绝对路径);
|
|
634
|
+
- CLI:`bepack build --rolldown-config <path>` / `bepack dev --rolldown-config <path>`,临时替换配置文件。
|
|
635
|
+
|
|
636
|
+
> 自定义 Rolldown 配置**不会**关闭类型检查:`bepack build` / `bepack dev` 依然会先执行 `tsc --noEmit`(默认开启,详见《构建》一节)。
|
|
637
|
+
|
|
638
|
+
### 对象形式
|
|
639
|
+
|
|
640
|
+
```ts
|
|
641
|
+
packs: {
|
|
642
|
+
bp: {
|
|
643
|
+
compile: {
|
|
644
|
+
entry: "src/main.ts",
|
|
645
|
+
rolldown: {
|
|
646
|
+
resolve: { alias: { "@lib": "./src/lib" } },
|
|
647
|
+
treeshake: { moduleSideEffects: false },
|
|
648
|
+
output: { sourcemap: true },
|
|
649
|
+
},
|
|
650
|
+
},
|
|
651
|
+
},
|
|
652
|
+
}
|
|
653
|
+
```
|
|
654
|
+
|
|
655
|
+
### 函数形式
|
|
656
|
+
|
|
657
|
+
函数接收当前已合并的选项与上下文,返回值再按同样的规则合并一次;返回空则不做改动:
|
|
658
|
+
|
|
659
|
+
```ts
|
|
660
|
+
packs: {
|
|
661
|
+
bp: {
|
|
662
|
+
compile: {
|
|
663
|
+
rolldown(options, context) {
|
|
664
|
+
if (context.command === "dev") return { output: { sourcemap: true } };
|
|
665
|
+
return {};
|
|
666
|
+
},
|
|
667
|
+
},
|
|
668
|
+
},
|
|
669
|
+
}
|
|
670
|
+
```
|
|
671
|
+
|
|
672
|
+
上下文 `RolldownCustomizeContext` 字段:`command`(`"build"` / `"dev"`)、`mode`(CLI `--mode`)、`target`、`entry`、`outDir`、`outFile`、`preserveModules`,路径均为绝对路径。
|
|
673
|
+
|
|
674
|
+
### 配置文件
|
|
675
|
+
|
|
676
|
+
配置文件由 Rolldown 自带的加载器读取,因此 `.ts` / `.mts` / `.js` / `.mjs` 都支持,默认导出可以是选项对象、单元素数组或函数(与 `rolldown.config.ts` 用法一致):
|
|
677
|
+
|
|
678
|
+
```ts
|
|
679
|
+
// rolldown.bp.config.ts
|
|
680
|
+
import { defineConfig } from "rolldown";
|
|
681
|
+
|
|
682
|
+
export default defineConfig({
|
|
683
|
+
resolve: { alias: { "@lib": "./src/lib" } },
|
|
684
|
+
});
|
|
685
|
+
```
|
|
686
|
+
|
|
687
|
+
- 只支持**单个**配置:导出多元素数组会报 `CONFIG_INVALID`(BePack 每次只构建一个 BP)。
|
|
688
|
+
- `.ts` 配置文件会先被 Rolldown 打包成 `rolldown.config.<hash>.js` 再导入,随后删除;`dev` watcher 已忽略该临时文件。
|
|
689
|
+
- 优先级:`--rolldown-config` > `compile.rolldownConfig` > `compile.rolldown`。
|
|
690
|
+
|
|
691
|
+
### 合并规则
|
|
692
|
+
|
|
693
|
+
BePack 先生成基础选项,再把自定义选项合并上去:
|
|
694
|
+
|
|
695
|
+
| 字段 | 规则 |
|
|
696
|
+
| --- | --- |
|
|
697
|
+
| `plugins` | 追加在 BePack 插件(replace / define)之后 |
|
|
698
|
+
| `external` | 取并集(字符串去重,`RegExp` 原样保留) |
|
|
699
|
+
| `transform`、`resolve`、`experimental`、`checks`、`optimization`、`watch`、`moduleTypes`、`output` | 一层深合并;其中 `transform.define` 按 key 合并,不会清掉 `compile.define` |
|
|
700
|
+
| 其它字段 | 用户值直接覆盖 |
|
|
701
|
+
|
|
702
|
+
函数返回值按同一规则合并——因此只能追加,不能移除 BePack 的插件或受管理的外部依赖。
|
|
703
|
+
|
|
704
|
+
### 受保护字段
|
|
705
|
+
|
|
706
|
+
以下字段由 BePack 管理,配成其它值会报 `CONFIG_INVALID`(manifest 的 script entry、复制、打包、dev 监听都依赖它们):
|
|
707
|
+
|
|
708
|
+
| 字段 | 替代方式 |
|
|
709
|
+
| --- | --- |
|
|
710
|
+
| `input` | `packs.bp.compile.entry` |
|
|
711
|
+
| `output.file` / `output.dir` | `packs.bp.compile.scriptOutputDir` |
|
|
712
|
+
| `output.preserveModules` / `output.preserveModulesRoot` | `packs.bp.compile.preserveModules` |
|
|
713
|
+
| `output.entryFileNames` | manifest script entry 假定"每个源模块一个 `.js`" |
|
|
714
|
+
| `output.format` | Script API 只支持 ESM |
|
|
715
|
+
| `output` 数组(多输出) | 不支持,BePack 只写一个输出 |
|
|
716
|
+
|
|
567
717
|
## 构建注入与条件编译
|
|
568
718
|
|
|
569
719
|
BePack 提供两种编译期注入机制,**建议按用途选择**:
|
|
@@ -658,6 +808,7 @@ BePack 默认 `preserveModules: true`,Rolldown 仍会做 tree-shaking:
|
|
|
658
808
|
- 在监视前先执行一次初始构建(manifest + 若有 compile 则编译)。
|
|
659
809
|
- 支持 `--skip-typecheck` 跳过类型检查(与 `build` 命令一致)。
|
|
660
810
|
- 支持 `--mode <value>`,用法与 `build` 命令相同,透传给 Hook 上下文。初始构建和后续增量重建均会传入该值。
|
|
811
|
+
- 支持 `--optimize`:每次自动复制都生成 `__brarchive/` 归档(等价于 `copy.optimize: true`,`--no-optimize` 可覆盖配置)。
|
|
661
812
|
- 默认监视的路径:
|
|
662
813
|
- `packs.bp.compile.entry` 所在目录(仅在 BP 配置了 compile 时,TypeScript 源码变化 → 触发编译)
|
|
663
814
|
- BP 的默认 include 列表 + `packs.bp.include` 中的文件/文件夹(不含 `scripts` 和 `manifest.json`)
|
|
@@ -670,6 +821,8 @@ BePack 默认 `preserveModules: true`,Rolldown 仍会做 tree-shaking:
|
|
|
670
821
|
- 每次更改时清空终端输出,显示每次更新的耗时。
|
|
671
822
|
- 构建锁:构建过程中来的其他文件变化会排队,构建结束后统一处理一次,不会并发构建。
|
|
672
823
|
- src 文件变化触发重建 + 复制,非 src 文件变化只触发复制。不涉及的文件不触发任何操作。
|
|
824
|
+
- 自动复制同样会触发 `beforeCopy` / `afterCopy`,重建会触发 `beforeManifest` / `afterManifest` / `beforeBuild` / `afterBuild`(`ctx.command === "dev"`)。
|
|
825
|
+
- 如果最终没有任何可监听路径(没配 compile、复制关闭、`dev.watch.include` 为空),`bepack dev` 会直接以 `DEV_NO_WATCH_TARGETS` 报错,而不是打印一行空的 "watching" 后静默退出。
|
|
673
826
|
|
|
674
827
|
BP 的监听范围精确匹配 copy 的 include 规则,编辑不会被复制的文件不会触发重构建。
|
|
675
828
|
可通过 `dev.watch.include` 添加额外监听路径:
|
|
@@ -691,6 +844,12 @@ export default defineConfig({
|
|
|
691
844
|
|
|
692
845
|
**如果没有配置任何复制目标,`bepack copy` 会报错。** 复制前会验证目标目录是否存在,不存在则报错。
|
|
693
846
|
|
|
847
|
+
CLI 选项:
|
|
848
|
+
|
|
849
|
+
- `--target <target>`:指定复制目标。
|
|
850
|
+
- `--all`:复制到所有目标。
|
|
851
|
+
- `--optimize`:复制时生成 `__brarchive/` 归档(`--no-optimize` 覆盖配置),详见下文《复制时也做 Pack 优化》。
|
|
852
|
+
|
|
694
853
|
### 内置目标
|
|
695
854
|
|
|
696
855
|
- `win`
|
|
@@ -782,10 +941,10 @@ copy: {
|
|
|
782
941
|
|
|
783
942
|
复制 BP 时,默认只复制以下文件/文件夹:
|
|
784
943
|
|
|
785
|
-
```
|
|
944
|
+
```txt
|
|
786
945
|
scripts manifest.json animation_controllers animations biomes
|
|
787
|
-
blocks entities functions items loot_tables
|
|
788
|
-
recipes spawn_rules structures texts trading
|
|
946
|
+
blocks cameras dialogue entities functions items loot_tables
|
|
947
|
+
pack_icon.png recipes shapes spawn_rules structures texts trading
|
|
789
948
|
feature_rules features worldgen
|
|
790
949
|
```
|
|
791
950
|
|
|
@@ -813,6 +972,15 @@ packs: {
|
|
|
813
972
|
|
|
814
973
|
复制项不存在时会被静默跳过,不会报错。
|
|
815
974
|
|
|
975
|
+
**不在 include 列表里的顶层条目会被跳过,并且现在会打印警告**(复制和打包都会):
|
|
976
|
+
|
|
977
|
+
```txt
|
|
978
|
+
behavior pack pack only includes 20 configured item(s); 2 entries in "bp" are skipped:
|
|
979
|
+
README_中文.md, custom_data. Add them to packs.bp.include to include them.
|
|
980
|
+
```
|
|
981
|
+
|
|
982
|
+
BP 与 RP 的默认行为不对称(BP 是白名单收,RP 默认整目录),但只要有条目被跳过就会有上面这条警告,不会再无声丢文件。隐藏条目(`.` 开头)和 `node_modules` 不计入警告,避免噪音。
|
|
983
|
+
|
|
816
984
|
Dev 模式使用相同的 include 规则来决定监听哪些文件,详见「开发模式」章节。
|
|
817
985
|
|
|
818
986
|
### 复制与构建/开发联动
|
|
@@ -833,6 +1001,25 @@ dev: {
|
|
|
833
1001
|
|
|
834
1002
|
`build.copy` 和 `dev.copy` 默认为 `false`(不复制)。`true` 表示使用 `copy.defaultTarget`,字符串表示使用指定目标。
|
|
835
1003
|
|
|
1004
|
+
### 复制时也做 Pack 优化
|
|
1005
|
+
|
|
1006
|
+
复制到开发目录默认是"散文件"形态,与发布产物(可能带 `__brarchive/`)不同。为了让开发者能在实机里提前验证**打包后的形态**,可以单独开启 `copy.optimize`:
|
|
1007
|
+
|
|
1008
|
+
```ts
|
|
1009
|
+
copy: {
|
|
1010
|
+
defaultTarget: "minecraft",
|
|
1011
|
+
optimize: true, // 或与 pack.optimize 相同的选项对象
|
|
1012
|
+
},
|
|
1013
|
+
```
|
|
1014
|
+
|
|
1015
|
+
```bash
|
|
1016
|
+
bepack copy --optimize # 临时开启(--no-optimize 覆盖配置)
|
|
1017
|
+
bepack build --copy --optimize # build 的 --optimize 同时作用于 pack 与 copy
|
|
1018
|
+
bepack dev --optimize # dev 的每次自动复制也生成归档
|
|
1019
|
+
```
|
|
1020
|
+
|
|
1021
|
+
行为与 `pack.optimize` 完全一致(同一套镜像规则、排除表、JSON 压缩、1.26.40 门槛),区别只是输出到开发目录而不是 `.mcpack`。默认不保留散文件,因此开发目录里的形态与发布产物一致;需要同时保留散文件时用 `optimize: { keepLooseFiles: true }`。
|
|
1022
|
+
|
|
836
1023
|
## 打包
|
|
837
1024
|
|
|
838
1025
|
`bepack pack` 创建:
|
|
@@ -840,10 +1027,33 @@ dev: {
|
|
|
840
1027
|
- 仅配置 BP 时创建 `.mcpack`。
|
|
841
1028
|
- 同时配置 BP 和 RP 时创建 `.mcaddon`。
|
|
842
1029
|
|
|
1030
|
+
**`bepack pack` 默认先构建再打包**:打包只是把磁盘上的文件收进压缩包,不重新编译,所以单独执行 `pack` 曾经可能把旧的 `scripts/*.js` 打进产物。现在它会先跑一次完整的构建(manifest 修补、类型检查、Rolldown),再打包,因此下面两条命令等价:
|
|
1031
|
+
|
|
1032
|
+
```bash
|
|
1033
|
+
bepack pack
|
|
1034
|
+
bepack build --pack
|
|
1035
|
+
```
|
|
1036
|
+
|
|
1037
|
+
需要"只压缩当前目录、不要构建"时用 `--no-build`(或 `--skip-build`):
|
|
1038
|
+
|
|
1039
|
+
```bash
|
|
1040
|
+
bepack pack --no-build
|
|
1041
|
+
```
|
|
1042
|
+
|
|
1043
|
+
因为多了一次构建,`pack` 也会触发构建与清单钩子:`beforeManifest` / `afterManifest` / `beforeBuild` / `afterBuild`(`ctx.command === "build"`),随后是 `beforePack` / `afterPack`(`ctx.command === "pack"`)。`--no-build` 时只触发打包钩子。
|
|
1044
|
+
|
|
1045
|
+
`--dry-run` 只汇报将要产出的文件,不写盘:
|
|
1046
|
+
|
|
1047
|
+
```txt
|
|
1048
|
+
√ pack dry-run: would pack dist/my-addon-1.0.0.mcpack (no file written)
|
|
1049
|
+
```
|
|
1050
|
+
|
|
843
1051
|
**BP 始终使用选择性打包**:只打包默认 include 列表(`scripts`、`manifest.json`、`animation_controllers` 等)和 `packs.bp.include` 中配置的额外文件。即使 `bp.root = "."`(项目根目录即行为包),也不会将整个项目打包进去。
|
|
844
1052
|
|
|
845
1053
|
RP 默认打包整个目录;如果配置了 `packs.rp.include`,则改用选择性打包。
|
|
846
1054
|
|
|
1055
|
+
两种模式下被跳过的顶层条目都会打印警告,详见「选择性复制」一节。
|
|
1056
|
+
|
|
847
1057
|
输出文件名默认为:
|
|
848
1058
|
|
|
849
1059
|
```txt
|
|
@@ -860,6 +1070,72 @@ pack: {
|
|
|
860
1070
|
|
|
861
1071
|
打包输入配置必须显式指定,且输入路径必须存在。这可以防止意外打包猜测的默认目录。
|
|
862
1072
|
|
|
1073
|
+
### Pack 优化(`__brarchive`)
|
|
1074
|
+
|
|
1075
|
+
Minecraft 1.26.40 起官方提供 **Pack Optimization**:把包里的散文件装进 `__brarchive/` 归档,并对 JSON 做压缩。BePack 可以在打包时做同样的事:
|
|
1076
|
+
|
|
1077
|
+
```ts
|
|
1078
|
+
pack: {
|
|
1079
|
+
outDir: "dist",
|
|
1080
|
+
optimize: true, // 或传入下面的选项对象
|
|
1081
|
+
}
|
|
1082
|
+
```
|
|
1083
|
+
|
|
1084
|
+
```bash
|
|
1085
|
+
bepack pack --optimize # 临时开启(--no-optimize 可覆盖配置里的开启状态)
|
|
1086
|
+
bepack build --pack --optimize # 构建后打包并优化
|
|
1087
|
+
```
|
|
1088
|
+
|
|
1089
|
+
产物结构(只影响 `.mcpack` / `.mcaddon` 内部,磁盘上的包目录**不会被修改**):
|
|
1090
|
+
|
|
1091
|
+
```txt
|
|
1092
|
+
manifest.json # 包根散文件保持原样,并写入 pack_optimization_version
|
|
1093
|
+
functions/diag_fn.mcfunction # 按路径引用的目录:散文件保留(归档里只登记文件名)
|
|
1094
|
+
texts/en_US.lang
|
|
1095
|
+
__brarchive/entities.brarchive # 注册表型目录:完整内容进归档,散文件删除
|
|
1096
|
+
__brarchive/entities/sub.brarchive # 每个目录一个归档,镜像目录树
|
|
1097
|
+
```
|
|
1098
|
+
|
|
1099
|
+
规则:
|
|
1100
|
+
|
|
1101
|
+
- **开关是产物 `manifest.json` 里的 `header.pack_optimization_version`**,BePack 默认写入 `"0.1.0"`。只有这个字段能让引擎从 `__brarchive/` 读取注册表;写成游戏版本号(如 `"1.26.40"`)无效。它只写进产物,磁盘上的 `manifest.json` 不受影响。
|
|
1102
|
+
- `header.min_engine_version` **不参与判断**(原版 `vanilla` 行为包是 `[1,13,0]` 且带归档)。低于 1.26.40 时只是打印一条警告:旧客户端没有归档支持,只能看到保留散文件的那部分。
|
|
1103
|
+
- 每个目录(递归)生成 `<包根>/__brarchive/<相对目录>.brarchive`,条目名是**裸文件名**(如 `entities.brarchive` 里是 `zombie.json`),按名称排序;文件名最多 247 字节。
|
|
1104
|
+
- 包根散文件(`manifest.json`、`pack_icon.png` 等)不归档;已存在的 `__brarchive/` 内容原样保留。
|
|
1105
|
+
- **按路径引用**的目录会把散文件留在原处,归档里只写一条 **0 字节存根**(登记文件名)——这是原版 `structures/**`、`sounds/**`、`texts` 的做法。默认列表:
|
|
1106
|
+
- 行为包:`functions`、`loot_tables`、`structures`、`texts`
|
|
1107
|
+
- 资源包:`font`、`materials`、`sounds`、`texts`、`textures`
|
|
1108
|
+
- 其余目录(`entities`、`items`、`blocks`、`recipes`、`shapes`、`spawn_rules`、`trading`、`models`、`ui`、`particles`、`render_controllers` 等)归档**完整内容并删除散文件**。
|
|
1109
|
+
- JSON 条目会被压缩(`{ "a": 1 }` → `{"a":1}`),非 JSON(`.lang`、二进制、`MCB`)原样存储;JSON 解析失败时也原样存储,不会损坏文件。
|
|
1110
|
+
|
|
1111
|
+
想调整时用这些选项:
|
|
1112
|
+
|
|
1113
|
+
| 选项 | 作用 |
|
|
1114
|
+
| --- | --- |
|
|
1115
|
+
| `keepLoose: ["blocks"]` | 额外把某些目录改成"散文件 + 存根" |
|
|
1116
|
+
| `keepLoose: false` | 不保留任何散文件(产物最小,全部只进归档) |
|
|
1117
|
+
| `exclude: ["blocks"]` | 这些目录完全不归档,只留散文件 |
|
|
1118
|
+
| `keepLooseFiles: true` | 归档 + 完整散文件都写(体积最大,兼容 1.26.40 之前的旧客户端) |
|
|
1119
|
+
| `minifyJson: false` | 不压缩 JSON 条目(排查问题用) |
|
|
1120
|
+
| `packOptimizationVersion: "0.2.0"` | 改用其它优化版本号 |
|
|
1121
|
+
|
|
1122
|
+
**实机验证(1.26.40 客户端,内置 `@minecraft/server` 探针脚本)**:
|
|
1123
|
+
|
|
1124
|
+
| 内容 | 存放方式 | 结果 |
|
|
1125
|
+
| --- | --- | --- |
|
|
1126
|
+
| `blocks/`、`items/`、`entities/`、`recipes/` | 归档完整内容、删除散文件 | ✅ `BlockTypes/ItemTypes/EntityTypes.get()` 与 `spawnEntity()` 全部通过;配方也从归档正常解析 |
|
|
1127
|
+
| `functions/`、`loot_tables/` | 散文件 + 归档存根 | ✅ `/function`、`/loot spawn … loot …` 均返回 success=1 |
|
|
1128
|
+
| `structures/` | 散文件 + 归档存根 | ⚠️ `/place structure` 在本机返回 success=0(原版对照名称带 `/` 需要加引号,未能取得正向对照),建议自行用结构方块验证 |
|
|
1129
|
+
| `texts/` | 散文件 + 归档存根 | ✅ 散文件 `.lang` 正常(中文客户端需自带 `zh_CN.lang`,否则显示 key) |
|
|
1130
|
+
|
|
1131
|
+
> **`scripts/` 默认也会归档**(官方 `behavior_packs/editor` 就是这样,且实测脚本模块可从归档加载);上面的探针为了确保一定输出,用的是 `keepLoose: ["scripts"]`。如果你的脚本在归档后不执行,加 `keepLoose: ["scripts"]` 即可。
|
|
1132
|
+
>
|
|
1133
|
+
> **注意模块 UUID 不能重复**:手写 `manifest.json` 里的 `data`/`resources` 模块 UUID 必须和 `packs.bp.moduleUuid`(脚本模块)不同,否则引擎会丢掉脚本模块且没有明显报错。
|
|
1134
|
+
|
|
1135
|
+
> **兼容性**:能读 `__brarchive/` 的客户端才有完整内容;1.26.40 之前的客户端只能看到"保留散文件"的目录。设 `allowUnsupportedTarget: true` 可关闭 min_engine_version 警告。
|
|
1136
|
+
>
|
|
1137
|
+
> 同一套选项也适用于复制:见《复制》一节的[复制时也做 Pack 优化](#复制时也做-pack-优化)。
|
|
1138
|
+
|
|
863
1139
|
## 钩子
|
|
864
1140
|
|
|
865
1141
|
支持的钩子:
|
|
@@ -879,14 +1155,40 @@ hooks: {
|
|
|
879
1155
|
}
|
|
880
1156
|
```
|
|
881
1157
|
|
|
1158
|
+
### 每个命令实际触发哪些钩子
|
|
1159
|
+
|
|
1160
|
+
钩子不是"配置了就一定会在每条命令里跑",而是挂在具体的步骤上。当前实现(`ctx.command` 标明是谁触发的):
|
|
1161
|
+
|
|
1162
|
+
| 命令 | 触发的钩子(按顺序) |
|
|
1163
|
+
| --- | --- |
|
|
1164
|
+
| `manifest` | beforeManifest, afterManifest |
|
|
1165
|
+
| `install` | beforeInstall, afterInstall;`install.updateManifest` 为真时中间还有 beforeManifest, afterManifest |
|
|
1166
|
+
| `copy` | beforeCopy, afterCopy |
|
|
1167
|
+
| `pack` | beforeManifest, afterManifest, beforeBuild, afterBuild(来自先构建的步骤)→ beforePack, afterPack |
|
|
1168
|
+
| `pack --no-build` | beforePack, afterPack |
|
|
1169
|
+
| `build` | beforeManifest, afterManifest, beforeBuild, afterBuild |
|
|
1170
|
+
| `build --copy` | 上面 4 个 + beforeCopy, afterCopy |
|
|
1171
|
+
| `build --pack` | 上面 4 个 + beforePack, afterPack |
|
|
1172
|
+
| `build --copy --pack` | 上面 4 个 + beforeCopy, afterCopy + beforePack, afterPack |
|
|
1173
|
+
| `build --install` | beforeInstall, afterInstall(含 manifest 钩子)→ 再走 build 的完整流程 |
|
|
1174
|
+
| `dev`(首次构建、src 变化重建) | beforeManifest, afterManifest, beforeBuild, afterBuild;自动复制时还有 beforeCopy, afterCopy |
|
|
1175
|
+
| `dev`(非 src 变化,仅刷新包) | beforeManifest, afterManifest;自动复制时还有 beforeCopy, afterCopy |
|
|
1176
|
+
|
|
1177
|
+
规则总结:
|
|
1178
|
+
|
|
1179
|
+
- **任何会改写 `manifest.json` 的命令都会触发 `beforeManifest` / `afterManifest`**,包括 `build`、`dev`、`install` 和先构建的 `pack`——不再是只有 `manifest` 命令。
|
|
1180
|
+
- **`build --copy` 与 `dev` 的自动复制都会触发 `beforeCopy` / `afterCopy`**,因此"复制前改文件"的钩子对所有复制路径都有效。
|
|
1181
|
+
- 打包钩子只由 `runPack` 触发,所以 `build --pack`、`pack` 都会走。
|
|
1182
|
+
|
|
882
1183
|
钩子上下文类型:
|
|
883
1184
|
|
|
884
1185
|
```ts
|
|
885
1186
|
type HookContext = {
|
|
886
|
-
command: CommandName; // "build" | "dev" | "install" | ...
|
|
1187
|
+
command: CommandName; // "build" | "dev" | "install" | "pack" | ...
|
|
887
1188
|
cwd: string;
|
|
888
1189
|
mode?: string; // 通过 --mode <value> 传入的执行模式
|
|
889
1190
|
target: string;
|
|
1191
|
+
dryRun: boolean; // 本次命令是否 --dry-run(此时不会写任何文件)
|
|
890
1192
|
config: ResolvedConfig;
|
|
891
1193
|
paths: {
|
|
892
1194
|
dist: string;
|
|
@@ -902,6 +1204,8 @@ type HookContext = {
|
|
|
902
1204
|
};
|
|
903
1205
|
```
|
|
904
1206
|
|
|
1207
|
+
`dryRun` 由命令的 `--dry-run` 决定,钩子内可直接 `if (ctx.dryRun) return;`,不必再读 `process.argv`。
|
|
1208
|
+
|
|
905
1209
|
钩子可以是同步或异步的。在钩子中抛出异常会导致命令失败,返回 `HOOK_FAILED`。
|
|
906
1210
|
|
|
907
1211
|
`mode` 来自 CLI `--mode <value>` 选项(目前 `build` 和 `dev` 命令支持),BEPack 不做语义判断,由用户在钩子内自行决定是否执行特定逻辑:
|
|
@@ -958,9 +1262,9 @@ UNSUPPORTED_DEPENDENCY
|
|
|
958
1262
|
DEPENDENCY_VERSION_INVALID
|
|
959
1263
|
DEPENDENCY_REQUIRES_INSTALL
|
|
960
1264
|
SAPI_VERSION_NOT_FOUND
|
|
961
|
-
ACHIEVEMENT_REQUIRES_STABLE_API
|
|
962
1265
|
TYPECHECK_FAILED
|
|
963
1266
|
BUILD_FAILED
|
|
1267
|
+
DEV_NO_WATCH_TARGETS
|
|
964
1268
|
COPY_TARGET_NOT_FOUND
|
|
965
1269
|
COPY_FAILED
|
|
966
1270
|
PACK_FAILED
|
|
@@ -1005,9 +1309,11 @@ bepack init --from-bp ./bp/manifest.json --from-rp ./rp/manifest.json
|
|
|
1005
1309
|
| UUID | 直接读取 manifest 中的值,不重新生成 |
|
|
1006
1310
|
| 版本 | 从 manifest header 读取(支持数组 `[1,0,0]` 和字符串 `"1.0.0"`)。两个包版本不同时取最高者,并给出警告 |
|
|
1007
1311
|
| 依赖 | manifest 中的 `module_name` 依赖如果在 BePack 内置 catalog 中,自动写入配置 |
|
|
1008
|
-
| 编译脚本 |
|
|
1312
|
+
| 编译脚本 | 只有在磁盘上确实存在匹配源文件(`src/<入口>.ts` / `.mts` / `.js` / `.mjs`)时才开启 compile,并根据模块 `entry` 推断输出目录:`"scripts/main.js"` → `entry: "src/main.ts"`, `scriptOutputDir: "scripts"`;`"custom/app.js"` → `entry: "src/app.ts"`, `scriptOutputDir: "custom"`。源文件存在但没有 `tsconfig.json` 时生成 `typecheck: false` 并警告;脚本已在包内且没有源文件时不生成 `compile`(包内 `scripts/` 原样复制/打包),避免生成首次构建就失败的配置 |
|
|
1009
1313
|
| Windows | 自动添加 `copy: { defaultTarget: "win" }" |
|
|
1010
1314
|
|
|
1011
1315
|
manifest 路径必须在当前目录内,否则报错。
|
|
1012
1316
|
|
|
1013
1317
|
如果配置文件已存在,init 会报错提示使用 `--force` 覆盖。
|
|
1318
|
+
|
|
1319
|
+
`--dry-run` 只打印将要创建的文件(`init dry-run: would create …`),既不写文件也不创建目录。
|