# 使用 wu pack 打包应用

从原生构建创建签名 .wuapp，并准备在其他宿主中安装。

需要 WU CLI `1.2.0`，应用 API 需要 WU Framework `4.0.0`。请检查 `wu --version` 和项目依赖。

```sh
wu build --native
wu pack --keygen keys/catalog.pem --json
wu pack catalog --sign keys/catalog.pem --version 1.2.0 --out catalog-1.2.0.wuapp --json
```

在工作区运行命令。`catalog` 是 `dist/wu-manifest.json` 中的名称，不一定是目录名。`--keygen` 输出宿主 `trust` 使用的公钥 JWK，私钥保存在 PEM 文件中。

| 参数 | 行为约定 |
| --- | --- |
| `<app>` | 构建清单中的应用名称。 |
| `--dist <dir>` | 构建目录，默认为 `dist`。 |
| `--out <file>` | 输出文件，默认为 `<name>-<version>.wuapp`。 |
| `--version <version>` | 包中的应用版本。 |
| `--sign <key.pem>` | 使用 ECDSA P-256 私钥签名。 |
| `--keygen <key.pem>` | 生成私钥并输出公钥，不执行打包。 |
| `--json` | 以 JSON 输出结果或错误。 |

<span id="formato-y-resolución-de-módulos"></span>

<span class="section-anchor" id="section-1"></span>

## 格式与模块解析

`wuapp/1` 格式为 gzip 压缩的 JSON，包含名称、版本、入口、清单以及具有类型、编码、内容和 SHA-256 的文件。内部 JavaScript 导入改为相对路径，并移除 `?v=<build>`。`/@modules/` 引用保留以使用宿主共享模块；不会自动包含宿主的所有依赖。

版本依次来自 `--version`、应用清单、应用 `package.json`，最终回退到 `0.0.0`。签名覆盖格式、身份、入口、清单和哈希的规范化表示。不使用 `--sign` 时生成无签名包，安装器需要显式授权才会接受。

<span id="resultado-y-errores"></span>

<span class="section-anchor" id="section-2"></span>

## 结果与错误

JSON 输出包含 `out`、`name`、`version`、`entry`、`files`、`bytes`、`signed` 和 `publicKey`。缺少构建清单、未知应用、缺少入口或密钥无效时退出码为 `1`。`--version` 指打包应用的版本，不是 WU CLI 版本。验证签名和挂载内容见[安装 .wuapp 文件](/zh-cn/docs/framework/installable-apps/)。

在 1.2.0 中，`--keygen` 拒绝覆盖现有密钥；`--force` 允许显式替换。签名仅接受 ECDSA P-256。打包器按扩展名分配 MIME，并根据安装器规则验证路径、类型和限制。原生构建的哈希名称在包内保留身份。

<span id="referencia-de-implementación"></span>

<span class="section-anchor" id="section-3"></span>

## 实现参考

- `wu-cli/src/commands/pack.cjs`
- `wu-cli/tests/pack-safety.test.cjs`
- `wu-cli/tests/pack.test.cjs`