zcode-idea 0.0.0-stage → 0.0.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 +295 -2
- package/bin/zcode-idea.mjs +463 -0
- package/lib/download.mjs +294 -0
- package/lib/errors.mjs +17 -0
- package/lib/installed.mjs +86 -0
- package/lib/launch.mjs +214 -0
- package/lib/log.mjs +36 -0
- package/lib/manifest.mjs +301 -0
- package/lib/plugin-signing-public.pem +3 -0
- package/lib/processes.mjs +194 -0
- package/lib/products.mjs +352 -0
- package/lib/prompt.mjs +37 -0
- package/lib/remote.mjs +356 -0
- package/lib/targets.mjs +415 -0
- package/lib/unzip.mjs +157 -0
- package/package.json +35 -4
package/README.md
CHANGED
|
@@ -1,3 +1,296 @@
|
|
|
1
|
-
#
|
|
1
|
+
# zcode-idea
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
把 **ZCode IDE 插件** 安装到本机已安装的 JetBrains IDE:自动发现 IDE、对比版本、
|
|
4
|
+
关闭对应进程、从七牛 CDN 下载插件包(Ed25519 验签 + sha256 校验)、删除旧版本、
|
|
5
|
+
解压,并在安装完成后重新启动 IDE。
|
|
6
|
+
|
|
7
|
+
npm 包只包含安装器代码与内置公钥(约 **33 KB**),不携带插件 zip。
|
|
8
|
+
|
|
9
|
+
```bash
|
|
10
|
+
npx zcode-idea
|
|
11
|
+
```
|
|
12
|
+
|
|
13
|
+
> 安装器只替换 `<IDE>/plugins/zcode-ide/`,不会改动 IDE 的其它配置、项目或插件。
|
|
14
|
+
|
|
15
|
+
## 插件来源
|
|
16
|
+
|
|
17
|
+
| 方式 | 说明 |
|
|
18
|
+
|---|---|
|
|
19
|
+
| 默认源 | `http://tnbe4cmeo.hn-bkt.clouddn.com/zcode-ide/plugin/stable`(七牛测试域名,HTTP) |
|
|
20
|
+
| `--source <url>` | 覆盖默认源,例如 `https://cdn.example.com/zcode-ide/plugin/stable` |
|
|
21
|
+
| `ZCODE_IDE_PLUGIN_BASE_URL` | 与 `--source` 等价的环境变量(`--source` 优先) |
|
|
22
|
+
| `--zip <path>` | 离线:直接使用本地插件 zip,跳过 manifest 与下载 |
|
|
23
|
+
|
|
24
|
+
使用默认的七牛测试域名时**不需要** `--allow-http`,但每次启动会打印一次醒目警告;
|
|
25
|
+
用 `--source` / 环境变量指定其他 HTTP 源时必须显式加 `--allow-http`(仅联调用),
|
|
26
|
+
HTTPS 源直接允许。
|
|
27
|
+
|
|
28
|
+
远端目录结构(对象键含 `QINIU_PREFIX`):
|
|
29
|
+
|
|
30
|
+
```
|
|
31
|
+
zcode-ide/plugin/stable/manifest.json
|
|
32
|
+
zcode-ide/plugin/stable/manifest.sig
|
|
33
|
+
zcode-ide/plugin/stable/0.1.0/zcode-ide-0.1.0-b3bb4620163c.zip
|
|
34
|
+
```
|
|
35
|
+
|
|
36
|
+
`manifest.archivePath` 是**相对 CDN 根**的对象键(含 prefix),例如
|
|
37
|
+
`zcode-ide/plugin/stable/0.1.0/zcode-ide-0.1.0-b3bb4620163c.zip`。
|
|
38
|
+
zip 使用**内容寻址**:同一版本重新构建会得到新的 `sha12`,旧 zip 保留不覆盖;
|
|
39
|
+
manifest/sig 是唯一可变指针,因此即使边缘 manifest 短暂滞后,也只会指向旧 zip,
|
|
40
|
+
不会出现“清单与包不配对”。安装器会拒绝绝对 URL、`..`、反斜杠、以 `/` 开头
|
|
41
|
+
或带查询参数的值。
|
|
42
|
+
|
|
43
|
+
## 选项
|
|
44
|
+
|
|
45
|
+
```
|
|
46
|
+
npx zcode-idea [--all] [--dry-run] [--check] [--yes] [--force] [--no-launch]
|
|
47
|
+
[--source <url>] [--zip <path>] [--allow-http]
|
|
48
|
+
[--target <dir>] [--timeout <秒>] [--clean-cache]
|
|
49
|
+
```
|
|
50
|
+
|
|
51
|
+
| 选项 | 说明 |
|
|
52
|
+
|---|---|
|
|
53
|
+
| `--all` | 处理全部发现的 IDE,跳过交互选择 |
|
|
54
|
+
| `--check` | 只拉取并校验 manifest、打印版本对比表后退出;不下载、不关 IDE、不安装 |
|
|
55
|
+
| `--dry-run` | 拉取 manifest + 版本对比 + 安装计划;不下载、不关 IDE、不解压、不启动 |
|
|
56
|
+
| `--force` | 已是最新或远端版本更低时也强制安装 |
|
|
57
|
+
| `--yes` | 跳过“关闭 IDE”前的二次确认 |
|
|
58
|
+
| `--no-launch` | 安装完成后不启动 IDE(默认会启动) |
|
|
59
|
+
| `--source <url>` | 插件分发根 URL(覆盖默认源/环境变量) |
|
|
60
|
+
| `--zip <path>` | 使用本地插件 zip(离线逃生口;仍做 zip 结构/jar 校验) |
|
|
61
|
+
| `--allow-http` | 允许非默认的 HTTP 插件源(仅测试域名联调) |
|
|
62
|
+
| `--target <dir>` | 直接指定 **plugins 目录**;可重复或逗号分隔,跳过发现与选择 |
|
|
63
|
+
| `--timeout <秒>` | 等待 IDE 退出的时间,默认 30,范围 1–600 |
|
|
64
|
+
| `--clean-cache` | 安装结束后清理其它版本的插件包缓存(只处理 sha256 命名的缓存文件;保留本次使用的版本;仅在至少一个目标安装成功后清理);`--check` / `--dry-run` 只读,不删除 |
|
|
65
|
+
| `--help` / `--version` | 中文帮助 / npm 包版本 |
|
|
66
|
+
|
|
67
|
+
示例:
|
|
68
|
+
|
|
69
|
+
```bash
|
|
70
|
+
# 只看版本对比,不做任何安装动作
|
|
71
|
+
npx zcode-idea --check --all
|
|
72
|
+
|
|
73
|
+
# 安装到全部发现的 IDE
|
|
74
|
+
npx zcode-idea --all --yes
|
|
75
|
+
|
|
76
|
+
# 离线安装(CI / 内网)
|
|
77
|
+
npx zcode-idea --zip ./build/distributions/zcode-ide-0.1.0.zip --all --no-launch
|
|
78
|
+
```
|
|
79
|
+
|
|
80
|
+
**非交互环境(CI、管道):** 必须提供 `--all` 或 `--target`,否则以退出码 2 结束。
|
|
81
|
+
未传 `--yes` 时不会自动关闭 IDE,而是提示“请先手动退出 IDE”。
|
|
82
|
+
|
|
83
|
+
## 版本语义
|
|
84
|
+
|
|
85
|
+
对每个目标读取已安装插件版本(`<pluginsDir>/zcode-ide/lib/zcode-ide-*.jar` 内
|
|
86
|
+
`META-INF/plugin.xml` 的 `<version>`),与远端 manifest 的 `pluginVersion` 比较:
|
|
87
|
+
|
|
88
|
+
| 情况 | 默认行为 |
|
|
89
|
+
|---|---|
|
|
90
|
+
| 未安装 / 远端更高 | 安装或更新 |
|
|
91
|
+
| 相同 | 显示“已是最新”,跳过(`--force` 可重装) |
|
|
92
|
+
| 远端更低 | 拒绝降级并提示(`--force` 可强制降级) |
|
|
93
|
+
|
|
94
|
+
`--check` 只打印对比表;`--dry-run` 额外打印安装计划与缓存状态。
|
|
95
|
+
|
|
96
|
+
## 安装流程
|
|
97
|
+
|
|
98
|
+
1. 拉取 `manifest.json` + `manifest.sig`,用 **内置公钥** 验证 Ed25519 签名
|
|
99
|
+
(对 manifest 原始字节),校验字段、`schemaVersion`、`archivePath`、sha256 格式;
|
|
100
|
+
2. 发现 IDE(配置目录优先;安装目录需通过真实写探针,不可写的跳过并提示);
|
|
101
|
+
3. 选择目标(`--all` / `--target` 可跳过);
|
|
102
|
+
4. 对比版本,决定安装 / 跳过;
|
|
103
|
+
5. 关闭所选目标对应的 IDE 进程:先优雅关闭,超时后强制结束;
|
|
104
|
+
6. 下载插件包到缓存并校验 sha256/size,再校验 zip 结构(zip-slip、符号链接、
|
|
105
|
+
主 jar 内 `dev.zcode.ide`、runtime 完整性);
|
|
106
|
+
7. 删除 `<pluginsDir>/zcode-ide` 后解压,保留 unix 权限位;
|
|
107
|
+
某个目标失败不阻断其它目标,最终有失败则退出码 1;
|
|
108
|
+
8. 打印安装路径与文件数,并按目标版本查找可执行文件启动 IDE。
|
|
109
|
+
|
|
110
|
+
退出码:`0` 成功;`1` 校验/下载/安装失败;`2` 参数或环境用法错误;`130` 用户取消。
|
|
111
|
+
|
|
112
|
+
## 缓存与离线
|
|
113
|
+
|
|
114
|
+
- 缓存路径:`${ZCODE_DATA_BASE_DIR:-~/.zcode}/ide/plugin-cache/<sha256>.zip`
|
|
115
|
+
(`ZCODE_DATA_BASE_DIR` 用于覆盖 `~/.zcode` 根目录);
|
|
116
|
+
- 命中缓存且 sha256/size 一致时直接复用;不一致则删除重新下载;
|
|
117
|
+
- 下载先写 `<sha256>.zip.part`,校验通过后原子改名;
|
|
118
|
+
- 每个版本在缓存中约占 49 MB;加 `--clean-cache` 可在安装结束后自动清理:
|
|
119
|
+
- **仅在至少一个目标安装成功后清理**;全部目标安装失败时跳过清理并告警,
|
|
120
|
+
保留旧版本缓存以便回滚或重试;
|
|
121
|
+
- 只处理 sha256 命名的缓存文件:保留本次使用(远端 manifest 的 sha256;
|
|
122
|
+
`--zip` 时为本地包的 sha256)对应的 `<64位十六进制>.zip`,删除其它缓存 zip
|
|
123
|
+
与全部缓存 `.part`;缓存目录里的其它文件(包括 `backup.zip` 这类非 sha256
|
|
124
|
+
命名的 zip)一律不动;
|
|
125
|
+
- **`--check` 与 `--dry-run` 是只读模式,绝不删除文件**;`--dry-run` 只打印
|
|
126
|
+
“安装后将清理 N 个旧缓存(释放约 X)”一行预览(即使所有目标已是最新也会打印);
|
|
127
|
+
- 单个文件删除失败只打印警告,不影响安装结果与退出码;
|
|
128
|
+
- 不传 `--clean-cache` 时不做任何清理,缓存行为与之前一致;
|
|
129
|
+
- 不要与其他 `zcode-idea` 安装进程并发运行 `--clean-cache`,否则可能删掉对方
|
|
130
|
+
正在写入的 `.part` 或待解压的 zip;
|
|
131
|
+
- 也可以直接删除整个 `plugin-cache` 目录(安全);
|
|
132
|
+
- 完全离线时用 `--zip <本地 zip>`,不访问网络;此时仍会校验 zip 结构与主 jar。
|
|
133
|
+
|
|
134
|
+
## 安全模型
|
|
135
|
+
|
|
136
|
+
- **信任根**是 npm 包内的 `lib/plugin-signing-public.pem`(与仓库
|
|
137
|
+
`src/main/resources/runtime-signing-public.pem` 同一把 Ed25519 公钥);
|
|
138
|
+
- manifest 验签失败立即中止,不会使用其中的 sha256/version;
|
|
139
|
+
- zip 必须与验签后的 manifest 的 sha256、size、pluginVersion 一致;
|
|
140
|
+
- zip 条目拒绝绝对路径、`..`、反斜杠、符号链接、重复文件、非 `zcode-ide/` 前缀;
|
|
141
|
+
- 发布侧 zip 使用内容寻址 key(`<version>/zcode-ide-<version>-<sha12>.zip`),
|
|
142
|
+
同版本重发不会覆盖旧对象;manifest/sig 是唯一可变指针,生产 CDN 需支持刷新;
|
|
143
|
+
- 发布脚本从不打印 AK/SK/token。
|
|
144
|
+
|
|
145
|
+
## 支持的 IDE
|
|
146
|
+
|
|
147
|
+
| 产品 | 配置目录前缀 | Windows 进程 |
|
|
148
|
+
|---|---|---|
|
|
149
|
+
| IntelliJ IDEA Ultimate | `IntelliJIdea<年.版本>` | `idea64.exe` / `idea.exe` |
|
|
150
|
+
| IntelliJ IDEA Community | `IdeaIC<年.版本>` | `idea64.exe` / `idea.exe` |
|
|
151
|
+
| WebStorm | `WebStorm<年.版本>` | `webstorm64.exe` |
|
|
152
|
+
| PhpStorm | `PhpStorm<年.版本>` | `phpstorm64.exe` |
|
|
153
|
+
| PyCharm Professional / Community | `PyCharm<年.版本>` / `PyCharmCE<年.版本>` | `pycharm64.exe` |
|
|
154
|
+
| GoLand | `GoLand<年.版本>` | `goland64.exe` |
|
|
155
|
+
| CLion | `CLion<年.版本>` | `clion64.exe` |
|
|
156
|
+
| DataGrip | `DataGrip<年.版本>` | `datagrip64.exe` |
|
|
157
|
+
| Rider | `Rider<年.版本>` | `rider64.exe` |
|
|
158
|
+
| RubyMine | `RubyMine<年.版本>` | `rubymine64.exe` |
|
|
159
|
+
| Aqua | `Aqua<年.版本>` | `aqua64.exe` |
|
|
160
|
+
| RustRover | `RustRover<年.版本>` | `rustrover64.exe` |
|
|
161
|
+
| DataSpell | `DataSpell<年.版本>` | `dataspell64.exe` |
|
|
162
|
+
| Writerside | `Writerside<年.版本>` | `writerside64.exe` |
|
|
163
|
+
| MPS | `MPS<年.版本>` | `mps64.exe` |
|
|
164
|
+
| Android Studio | `AndroidStudio<年.版本>` | `studio64.exe` |
|
|
165
|
+
|
|
166
|
+
macOS / Linux 使用对应的小写进程名(`idea`、`webstorm`、`studio` 等)。
|
|
167
|
+
|
|
168
|
+
## 支持的平台
|
|
169
|
+
|
|
170
|
+
- **Windows**:`%APPDATA%\JetBrains\*`、`%APPDATA%\Google\AndroidStudio*`;
|
|
171
|
+
次级选项为 `%PROGRAMFILES%\JetBrains\*`、`%LOCALAPPDATA%\Programs\*`、
|
|
172
|
+
`%LOCALAPPDATA%\JetBrains\Toolbox\apps\<Product>\<channel>\<version>`。
|
|
173
|
+
- **macOS**:`~/Library/Application Support/JetBrains/*`、
|
|
174
|
+
`~/Library/Application Support/Google/AndroidStudio*`;
|
|
175
|
+
次级选项为 `/Applications/*.app`、`~/Applications/*.app` 与 Toolbox。
|
|
176
|
+
- **Linux**:`$XDG_CONFIG_HOME`(默认 `~/.config`)下的 `JetBrains/*`、`Google/AndroidStudio*`;
|
|
177
|
+
次级选项为 `/opt/*`、`/snap/*/current` 与 Toolbox。
|
|
178
|
+
|
|
179
|
+
“次级选项”指 IDE 安装目录里的 `plugins/`,升级或重装 IDE 时可能被清掉。
|
|
180
|
+
安装器会对这类目录做一次真实写探针(创建并立即删除临时文件);
|
|
181
|
+
不可写时跳过并提示“已跳过 N 个不可写的 IDE 安装目录(需要管理员权限)”。
|
|
182
|
+
配置目录(`config`)不受写探针影响,始终保留。
|
|
183
|
+
|
|
184
|
+
## 常用命令(仓库根 npm scripts)
|
|
185
|
+
|
|
186
|
+
在仓库根目录执行:
|
|
187
|
+
|
|
188
|
+
| 命令 | 作用 |
|
|
189
|
+
|---|---|
|
|
190
|
+
| `npm run release` | 发布流程 dry-run:只读版本/环境、打印计划,不构建、不上传 |
|
|
191
|
+
| `npm run release:push` | `release.mjs --apply --push`:构建/复用 zip + 上传七牛 |
|
|
192
|
+
| `npm run release:npm` | `release.mjs --apply --push --npm`:再发布 npm(版本需手动 bump) |
|
|
193
|
+
| `npm run plugin:build` | 只构建插件 zip(build-runtime + gradlew),不发布 |
|
|
194
|
+
| `npm run plugin:pack` | 只打 npm tarball(`scripts/npm` 下 `npm pack`) |
|
|
195
|
+
| `npm run plugin:local-update` | 本地打包并用 tarball 强制更新已安装插件 |
|
|
196
|
+
|
|
197
|
+
`plugin:local-update` 会先 `npm pack`(输出到独立临时目录),再用
|
|
198
|
+
`npx --yes --package <tarball> -- zcode-idea --all --yes --force` 运行本地安装器;
|
|
199
|
+
默认强制重装,并会从插件源(默认七牛测试域名)下载 zip。
|
|
200
|
+
透传参数追加在命令末尾,可覆盖默认行为:
|
|
201
|
+
|
|
202
|
+
```bash
|
|
203
|
+
# 只对临时目录测试,不关 IDE、不启动
|
|
204
|
+
npm run plugin:local-update -- --target "C:\Temp\zcode-plugin-test\plugins" --no-launch
|
|
205
|
+
|
|
206
|
+
# 指定其他源
|
|
207
|
+
npm run plugin:local-update -- --source https://cdn.example.com/zcode-ide/plugin/stable --allow-http
|
|
208
|
+
```
|
|
209
|
+
|
|
210
|
+
## 发布链路(维护者)
|
|
211
|
+
|
|
212
|
+
一条命令完成版本检查、构建、manifest 签名、七牛上传与 npm 发布:
|
|
213
|
+
|
|
214
|
+
```bash
|
|
215
|
+
# 默认 dry-run:只读版本/环境并打印计划,不构建、不写文件、不上传
|
|
216
|
+
node scripts/release.mjs
|
|
217
|
+
|
|
218
|
+
# 只构建插件 zip(build-runtime + gradlew),不发布
|
|
219
|
+
node scripts/release.mjs --build-only
|
|
220
|
+
|
|
221
|
+
# 本地执行:构建(或复用)zip + 生成 manifest/sig,不上传
|
|
222
|
+
node scripts/release.mjs --apply
|
|
223
|
+
|
|
224
|
+
# 真正上传七牛 + 发布 npm(唯一的远端写入开关)
|
|
225
|
+
node scripts/release.mjs --apply --push --npm
|
|
226
|
+
|
|
227
|
+
# 复用 build/distributions 里最新的 zip(仍校验版本一致性)
|
|
228
|
+
node scripts/release.mjs --apply --skip-build
|
|
229
|
+
```
|
|
230
|
+
|
|
231
|
+
版本唯一来源是 `scripts/npm/package.json` 的 `version`:同一版本同时作为
|
|
232
|
+
插件版本、OSS 对象路径版本、`manifest.pluginVersion` 与 npm 包版本。
|
|
233
|
+
构建使用 `./gradlew buildPlugin -PpluginVersion=<version>`,并校验 jar 内
|
|
234
|
+
`META-INF/plugin.xml` 的 `<id>/<version>`;**不修改 package.json 的 version
|
|
235
|
+
就不要发新版**(npm 同版本不可覆盖,`--npm` 发布前会检查远端并报错)。
|
|
236
|
+
|
|
237
|
+
`--apply` 只做本地步骤(构建/复用 zip、写入
|
|
238
|
+
`build/plugin-release/{zip, manifest.json, manifest.sig}`);只有再加 `--push`
|
|
239
|
+
才会写远端。`--allow-downgrade` 仅联调使用:允许 package 版本低于 gradle 版本、
|
|
240
|
+
或复用与 package 版本不一致的 zip。签名私钥优先取 `RUNTIME_SIGNING_KEY`,
|
|
241
|
+
否则读 `~/.zcode/keys/runtime-signing-private.pem`;脚本会校验 npm 包内置公钥与仓库公钥一致。
|
|
242
|
+
|
|
243
|
+
七牛环境变量(`--apply --push` 必需):
|
|
244
|
+
|
|
245
|
+
| 变量 | 说明 |
|
|
246
|
+
|---|---|
|
|
247
|
+
| `QINIU_ACCESS_KEY` / `QINIU_SECRET_KEY` | 七牛密钥,绝不打印 |
|
|
248
|
+
| `QINIU_BUCKET` | bucket 名称(默认 `zcode-ide`) |
|
|
249
|
+
| `QINIU_DOMAIN` | CDN 根(生产必须 `https://`;HTTP 测试域名需 `--allow-http`) |
|
|
250
|
+
| `QINIU_PREFIX` | 对象键前缀(默认 `zcode-ide`,必须与 manifest.archivePath 一致) |
|
|
251
|
+
| `QINIU_UPLOAD_HOST` | 区域发现失败时的兜底上传域名(默认 `https://up-z2.qiniup.com`) |
|
|
252
|
+
|
|
253
|
+
上传顺序固定:**zip → manifest.sig → manifest.json**(manifest 最后)。
|
|
254
|
+
zip 使用内容寻址,可长期缓存(`Cache-Control: public, max-age=31536000, immutable`),
|
|
255
|
+
同版本重发会写新的 key,不覆盖旧对象。manifest/sig 是可变指针(`no-cache`):
|
|
256
|
+
上传后逐对象 HEAD 对账,失败重试 3 次(1s/2s/4s);zip 失败视为致命,
|
|
257
|
+
manifest/sig 重试后仍不一致只警告,因为 zip 已成功且清单指向不可变对象。
|
|
258
|
+
生产 CDN 需要支持刷新;测试域名刷新失败属已知情况。
|
|
259
|
+
|
|
260
|
+
## 网络 / 离线注意事项
|
|
261
|
+
|
|
262
|
+
- 安装器运行期只访问插件源与(首次)下载 zip;不访问 npm registry;
|
|
263
|
+
- npm 包发布到**官方 registry** `https://registry.npmjs.org/`,
|
|
264
|
+
`npx zcode-idea` 默认即可解析本包及 `cac`/`yauzl`/`@inquirer/prompts` 依赖;
|
|
265
|
+
- 发布认证沿用 `~/.npmrc`(或 `NODE_AUTH_TOKEN`);`npm whoami --registry https://registry.npmjs.org/` 应返回账号名;
|
|
266
|
+
- 内网无法访问官方 npm 时,可临时指定镜像,或用下面的本地 tarball 方式验证:
|
|
267
|
+
```bash
|
|
268
|
+
npm_config_registry=https://registry.npmmirror.com npx zcode-idea
|
|
269
|
+
```
|
|
270
|
+
- 插件源为 HTTP 测试域名时,生产使用必须换成 HTTPS 自有域名;
|
|
271
|
+
- 无法访问 CDN 时使用 `--zip` 本地包,或预先准备缓存文件。
|
|
272
|
+
|
|
273
|
+
## 开发
|
|
274
|
+
|
|
275
|
+
```bash
|
|
276
|
+
cd scripts/npm
|
|
277
|
+
npm install # Node >= 18
|
|
278
|
+
npm test # node:test(含本地随机端口 HTTP 集成测试)
|
|
279
|
+
npm pack --dry-run # 查看 tarball(应约 33 KB,不含 zip)
|
|
280
|
+
```
|
|
281
|
+
|
|
282
|
+
不发布时直接用本地 tarball 跑(与 `npx zcode-idea` 行为一致):
|
|
283
|
+
|
|
284
|
+
```bash
|
|
285
|
+
cd scripts/npm
|
|
286
|
+
npm pack
|
|
287
|
+
npx --yes ./zcode-idea-0.0.1.tgz --check --all # 只看版本对比
|
|
288
|
+
npx --yes ./zcode-idea-0.0.1.tgz --all --yes # 下载并安装(--force 可重装)
|
|
289
|
+
npx --yes ./zcode-idea-0.0.1.tgz --zip ../../build/distributions/zcode-ide-0.1.0.zip --all --yes
|
|
290
|
+
```
|
|
291
|
+
|
|
292
|
+
默认源是七牛测试域名(HTTP),首次安装会下载约 49MB;之后命中
|
|
293
|
+
`~/.zcode/ide/plugin-cache/<sha256>.zip`,不会重复下载。
|
|
294
|
+
|
|
295
|
+
依赖版本固定为 `cac@6.7.14`、`@inquirer/prompts@7.10.1`、`yauzl@3.4.0`,
|
|
296
|
+
以匹配 `engines.node: ">=18"`(这两个包的最新大版本要求 Node >= 20)。
|