@wwkit/opm 1.0.21 → 1.0.23
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/docs/managers/mise.md +38 -0
- package/docs/managers/node.md +16 -16
- package/docs/opm.html +21 -20
- package/package.json +6 -4
- package/src/cli/groups/mise.js +128 -0
- package/src/cli/groups/package.js +54 -10
- package/src/cli/groups/version-manager.js +2 -2
- package/src/cli/index.js +2 -2
- package/src/config.json5 +15 -11
- package/src/index.js +4 -4
- package/src/managers/node.js +263 -78
- package/src/managers/runtime.js +4 -4
- package/src/presets.js +0 -1
- package/src/tools/webwork/index.js +325 -26
- package/docs/managers/nvm.md +0 -36
- package/src/cli/groups/nvm.js +0 -81
|
@@ -0,0 +1,38 @@
|
|
|
1
|
+
# mise 命令对照表
|
|
2
|
+
|
|
3
|
+
`@wwkit/opm` 统一命令管理 mise 自身(安装/升级/卸载)。
|
|
4
|
+
|
|
5
|
+
mise 通过官方 GitHub release 二进制安装(npm 分发的 preinstall 引用的 platform 包在 Windows 上不可用,故不采用)。下载源依次尝试 `active` → 其余预设 → `official`,自动回退到可用镜像(如 `ghproxy.net`)。
|
|
6
|
+
|
|
7
|
+
## 命令对照
|
|
8
|
+
|
|
9
|
+
| 统一命令 | 原始命令 | 说明 |
|
|
10
|
+
|---------|---------|------|
|
|
11
|
+
| `opm mise version` | `mise --version` | 查看 mise 版本 |
|
|
12
|
+
| `opm mise install` | `mise use -g node@<version>` | 安装 mise(下载官方 release 二进制到 `~/.local/bin`) |
|
|
13
|
+
| `opm mise upgrade` | `mise self-update` | 更新 mise |
|
|
14
|
+
| `opm mise uninstall` | `npm uninstall -g mise` + 清理数据目录 | 卸载 mise |
|
|
15
|
+
| `opm mise dir` | 返回 `~/.local/bin/mise` | 显示二进制路径 |
|
|
16
|
+
| `opm mise list` | `mise ls --json` | 列出已安装的工具版本 |
|
|
17
|
+
|
|
18
|
+
## 下载镜像预设
|
|
19
|
+
|
|
20
|
+
| 预设名 | 地址 |
|
|
21
|
+
|--------|------|
|
|
22
|
+
| `official` | `https://github.com/jdx/mise/releases/download` |
|
|
23
|
+
| `ghproxy` | `https://ghproxy.com/https://github.com/jdx/mise/releases/download` |
|
|
24
|
+
| `gh-proxy` | `https://ghproxy.net/https://github.com/jdx/mise/releases/download` |
|
|
25
|
+
|
|
26
|
+
> 安装时按 `<base>/v<version>/mise-v<version>-<platform>-<arch>[.exe]` 下载二进制;
|
|
27
|
+
> 依次尝试 `active` → 其余预设 → `official`,首个成功即停。
|
|
28
|
+
|
|
29
|
+
## 示例
|
|
30
|
+
|
|
31
|
+
```bash
|
|
32
|
+
opm mise version
|
|
33
|
+
opm mise install
|
|
34
|
+
opm mise upgrade
|
|
35
|
+
opm mise list
|
|
36
|
+
opm mise dir
|
|
37
|
+
opm mise uninstall
|
|
38
|
+
```
|
package/docs/managers/node.md
CHANGED
|
@@ -1,25 +1,25 @@
|
|
|
1
1
|
# node 命令对照表
|
|
2
2
|
|
|
3
|
-
`@wwkit/opm` 统一命令通过
|
|
3
|
+
`@wwkit/opm` 统一命令通过 mise 管理 Node.js 版本(mise 是原生跨平台二进制,无需 bash)。
|
|
4
4
|
|
|
5
5
|
## 命令对照
|
|
6
6
|
|
|
7
7
|
| 统一命令 | 原始命令 | 说明 |
|
|
8
8
|
|---------|---------|------|
|
|
9
|
-
| `opm node version` | `
|
|
9
|
+
| `opm node version` | `mise current node` | 当前激活的 Node.js 版本 |
|
|
10
10
|
| `opm node registry` | 读 `~/.config/opm/config.json5` 的 `node.registry.active` | 查询 Node.js dist 镜像 |
|
|
11
|
-
| `opm node registry set <url\|preset>` | 写 `~/.config/opm/config.json5` | 设置 Node.js dist 镜像(传给 `
|
|
11
|
+
| `opm node registry set <url\|preset>` | 写 `~/.config/opm/config.json5` | 设置 Node.js dist 镜像(传给 `MISE_NODE_MIRROR_URL`) |
|
|
12
12
|
| `opm node registry presets` | — | 列出可用镜像预设 |
|
|
13
|
-
| `opm node search <version>` | `
|
|
14
|
-
| `opm node view <version>` | `
|
|
15
|
-
| `opm node versions` | `
|
|
16
|
-
| `opm node list` | `
|
|
17
|
-
| `opm node install <version>` | `
|
|
18
|
-
| `opm node uninstall <version>` | `
|
|
19
|
-
| `opm node upgrade` | `
|
|
20
|
-
| `opm node use <version>` | `
|
|
21
|
-
| `opm node current` | `
|
|
22
|
-
| `opm node default <version>` | `
|
|
13
|
+
| `opm node search <version>` | `mise ls-remote node` 过滤 | 查询版本是否可下载 |
|
|
14
|
+
| `opm node view <version>` | `mise ls node --json` 过滤 | 查询版本是否已安装 |
|
|
15
|
+
| `opm node versions` | `mise ls-remote node` | 列出所有可用版本 |
|
|
16
|
+
| `opm node list` | `mise ls node --json` | 列出已安装版本 |
|
|
17
|
+
| `opm node install <version>` | `mise install node@<version>` | 安装 Node.js 版本 |
|
|
18
|
+
| `opm node uninstall <version>` | `mise uninstall node@<version>` | 卸载 Node.js 版本 |
|
|
19
|
+
| `opm node upgrade` | `mise install node@lts` | 安装最新 LTS |
|
|
20
|
+
| `opm node use <version>` | `mise use -g node@<version>` | 切换全局版本 |
|
|
21
|
+
| `opm node current` | `mise current node` | 显示当前版本 |
|
|
22
|
+
| `opm node default <version>` | `mise use -g node@<version>` | 设置全局默认版本 |
|
|
23
23
|
|
|
24
24
|
## 镜像预设
|
|
25
25
|
|
|
@@ -29,7 +29,7 @@
|
|
|
29
29
|
| `taobao` | `https://npmmirror.com/mirrors/node` |
|
|
30
30
|
| `tsinghua` | `https://mirrors.tuna.tsinghua.edu.cn/nodejs-release/` |
|
|
31
31
|
|
|
32
|
-
> 镜像通过 `
|
|
32
|
+
> 镜像通过 `MISE_NODE_MIRROR_URL` 环境变量传递给 mise install。
|
|
33
33
|
|
|
34
34
|
## 示例
|
|
35
35
|
|
|
@@ -42,8 +42,8 @@ opm node install 20
|
|
|
42
42
|
opm node install --lts
|
|
43
43
|
opm node use 20
|
|
44
44
|
opm node default 20
|
|
45
|
-
opm node search
|
|
46
|
-
opm node view
|
|
45
|
+
opm node search v24.21.0
|
|
46
|
+
opm node view v24.21.0
|
|
47
47
|
opm node uninstall 18
|
|
48
48
|
opm node upgrade
|
|
49
49
|
```
|
package/docs/opm.html
CHANGED
|
@@ -101,9 +101,9 @@
|
|
|
101
101
|
<a class="menu-item" href="#" onclick="show('managers_config');return false;">config</a>
|
|
102
102
|
<a class="menu-item" href="#" onclick="show('managers_dnf');return false;">dnf</a>
|
|
103
103
|
<a class="menu-item" href="#" onclick="show('managers_git');return false;">git</a>
|
|
104
|
+
<a class="menu-item" href="#" onclick="show('managers_mise');return false;">mise</a>
|
|
104
105
|
<a class="menu-item" href="#" onclick="show('managers_node');return false;">node</a>
|
|
105
106
|
<a class="menu-item" href="#" onclick="show('managers_npm');return false;">npm</a>
|
|
106
|
-
<a class="menu-item" href="#" onclick="show('managers_nvm');return false;">nvm</a>
|
|
107
107
|
<a class="menu-item" href="#" onclick="show('managers_php');return false;">php</a>
|
|
108
108
|
<a class="menu-item" href="#" onclick="show('managers_phpenv');return false;">phpenv</a>
|
|
109
109
|
<a class="menu-item" href="#" onclick="show('managers_pip');return false;">pip</a>
|
|
@@ -363,13 +363,28 @@ opm git export -d /path/to/repo # 指定仓库目录
|
|
|
363
363
|
# diff 导入
|
|
364
364
|
opm git import changes-abc-to-def.diff # 导入 diff 文件
|
|
365
365
|
opm git import file.diff -d /repo # 导入到指定仓库</code></pre></div>
|
|
366
|
+
<div id="managers_mise" class="doc-content" style="display:none;"><h1>mise 命令对照表</h1>
|
|
367
|
+
<p><code>@wwkit/opm</code> 统一命令管理 mise 自身(安装/升级/卸载)。</p>
|
|
368
|
+
<p>mise 通过官方 GitHub release 二进制安装(npm 分发的 preinstall 引用的 platform 包在 Windows 上不可用,故不采用)。下载源依次尝试 <code>active</code> → 其余预设 → <code>official</code>,自动回退到可用镜像(如 <code>ghproxy.net</code>)。</p>
|
|
369
|
+
<h2>命令对照</h2>
|
|
370
|
+
<table><thead><tr><th>统一命令</th><th>原始命令</th><th>说明</th></tr></thead><tbody><tr><td><code>opm mise version</code></td><td><code>mise --version</code></td><td>查看 mise 版本</td></tr><tr><td><code>opm mise install</code></td><td><code>mise use -g node@<version></code></td><td>安装 mise(下载官方 release 二进制到 <code>~/.local/bin</code>)</td></tr><tr><td><code>opm mise upgrade</code></td><td><code>mise self-update</code></td><td>更新 mise</td></tr><tr><td><code>opm mise uninstall</code></td><td><code>npm uninstall -g mise</code> + 清理数据目录</td><td>卸载 mise</td></tr><tr><td><code>opm mise dir</code></td><td>返回 <code>~/.local/bin/mise</code></td><td>显示二进制路径</td></tr><tr><td><code>opm mise list</code></td><td><code>mise ls --json</code></td><td>列出已安装的工具版本</td></tr></tbody></table>
|
|
371
|
+
<h2>下载镜像预设</h2>
|
|
372
|
+
<table><thead><tr><th>预设名</th><th>地址</th></tr></thead><tbody><tr><td><code>official</code></td><td><code>https://github.com/jdx/mise/releases/download</code></td></tr><tr><td><code>ghproxy</code></td><td><code>https://ghproxy.com/https://github.com/jdx/mise/releases/download</code></td></tr><tr><td><code>gh-proxy</code></td><td><code>https://ghproxy.net/https://github.com/jdx/mise/releases/download</code></td></tr></tbody></table>
|
|
373
|
+
<blockquote>安装时按 <code><base>/v<version>/mise-v<version>-<platform>-<arch>[.exe]</code> 下载二进制;<br>依次尝试 <code>active</code> → 其余预设 → <code>official</code>,首个成功即停。</blockquote>
|
|
374
|
+
<h2>示例</h2>
|
|
375
|
+
<pre><code class="lang-bash">opm mise version
|
|
376
|
+
opm mise install
|
|
377
|
+
opm mise upgrade
|
|
378
|
+
opm mise list
|
|
379
|
+
opm mise dir
|
|
380
|
+
opm mise uninstall</code></pre></div>
|
|
366
381
|
<div id="managers_node" class="doc-content" style="display:none;"><h1>node 命令对照表</h1>
|
|
367
|
-
<p><code>@wwkit/opm</code> 统一命令通过
|
|
382
|
+
<p><code>@wwkit/opm</code> 统一命令通过 mise 管理 Node.js 版本(mise 是原生跨平台二进制,无需 bash)。</p>
|
|
368
383
|
<h2>命令对照</h2>
|
|
369
|
-
<table><thead><tr><th>统一命令</th><th>原始命令</th><th>说明</th></tr></thead><tbody><tr><td><code>opm node version</code></td><td><code>
|
|
384
|
+
<table><thead><tr><th>统一命令</th><th>原始命令</th><th>说明</th></tr></thead><tbody><tr><td><code>opm node version</code></td><td><code>mise current node</code></td><td>当前激活的 Node.js 版本</td></tr><tr><td><code>opm node registry</code></td><td>读 <code>~/.config/opm/config.json5</code> 的 <code>node.registry.active</code></td><td>查询 Node.js dist 镜像</td></tr><tr><td><code>opm node registry set <url|preset></code></td><td>写 <code>~/.config/opm/config.json5</code></td><td>设置 Node.js dist 镜像(传给 <code>MISE_NODE_MIRROR_URL</code>)</td></tr><tr><td><code>opm node registry presets</code></td><td>—</td><td>列出可用镜像预设</td></tr><tr><td><code>opm node search <version></code></td><td><code>mise ls-remote node</code> 过滤</td><td>查询版本是否可下载</td></tr><tr><td><code>opm node view <version></code></td><td><code>mise ls node --json</code> 过滤</td><td>查询版本是否已安装</td></tr><tr><td><code>opm node versions</code></td><td><code>mise ls-remote node</code></td><td>列出所有可用版本</td></tr><tr><td><code>opm node list</code></td><td><code>mise ls node --json</code></td><td>列出已安装版本</td></tr><tr><td><code>opm node install <version></code></td><td><code>mise install node@<version></code></td><td>安装 Node.js 版本</td></tr><tr><td><code>opm node uninstall <version></code></td><td><code>mise uninstall node@<version></code></td><td>卸载 Node.js 版本</td></tr><tr><td><code>opm node upgrade</code></td><td><code>mise install node@lts</code></td><td>安装最新 LTS</td></tr><tr><td><code>opm node use <version></code></td><td><code>mise use -g node@<version></code></td><td>切换全局版本</td></tr><tr><td><code>opm node current</code></td><td><code>mise current node</code></td><td>显示当前版本</td></tr><tr><td><code>opm node default <version></code></td><td><code>mise use -g node@<version></code></td><td>设置全局默认版本</td></tr></tbody></table>
|
|
370
385
|
<h2>镜像预设</h2>
|
|
371
386
|
<table><thead><tr><th>预设名</th><th>地址</th></tr></thead><tbody><tr><td><code>official</code></td><td><code>https://nodejs.org/dist</code></td></tr><tr><td><code>taobao</code></td><td><code>https://npmmirror.com/mirrors/node</code></td></tr><tr><td><code>tsinghua</code></td><td><code>https://mirrors.tuna.tsinghua.edu.cn/nodejs-release/</code></td></tr></tbody></table>
|
|
372
|
-
<blockquote>镜像通过 <code>
|
|
387
|
+
<blockquote>镜像通过 <code>MISE_NODE_MIRROR_URL</code> 环境变量传递给 mise install。</blockquote>
|
|
373
388
|
<h2>示例</h2>
|
|
374
389
|
<pre><code class="lang-bash">opm node current
|
|
375
390
|
opm node version
|
|
@@ -379,8 +394,8 @@ opm node install 20
|
|
|
379
394
|
opm node install --lts
|
|
380
395
|
opm node use 20
|
|
381
396
|
opm node default 20
|
|
382
|
-
opm node search
|
|
383
|
-
opm node view
|
|
397
|
+
opm node search v24.21.0
|
|
398
|
+
opm node view v24.21.0
|
|
384
399
|
opm node uninstall 18
|
|
385
400
|
opm node upgrade</code></pre></div>
|
|
386
401
|
<div id="managers_npm" class="doc-content" style="display:none;"><h1>npm 命令对照表</h1>
|
|
@@ -437,20 +452,6 @@ opm npm cache clean
|
|
|
437
452
|
|
|
438
453
|
# 显示帮助
|
|
439
454
|
opm npm help</code></pre></div>
|
|
440
|
-
<div id="managers_nvm" class="doc-content" style="display:none;"><h1>nvm 命令对照表</h1>
|
|
441
|
-
<p><code>@wwkit/opm</code> 统一命令管理 nvm 自身(安装/升级/卸载)。</p>
|
|
442
|
-
<h2>命令对照</h2>
|
|
443
|
-
<table><thead><tr><th>统一命令</th><th>原始命令</th><th>说明</th></tr></thead><tbody><tr><td><code>opm nvm version</code></td><td><code>nvm --version</code></td><td>查看 nvm 版本</td></tr><tr><td><code>opm nvm registry</code></td><td>读 <code>~/.config/opm/config.json5</code> 的 <code>nvm.registry.active</code></td><td>查询 nvm git 镜像</td></tr><tr><td><code>opm nvm registry set <url|preset></code></td><td>写 <code>~/.config/opm/config.json5</code></td><td>设置 nvm git 镜像</td></tr><tr><td><code>opm nvm registry presets</code></td><td>—</td><td>列出可用镜像预设</td></tr><tr><td><code>opm nvm install</code></td><td><code>git clone <mirror> ~/.nvm</code> + 写 shell profile</td><td>安装 nvm</td></tr><tr><td><code>opm nvm upgrade</code></td><td><code>cd ~/.nvm && git pull --tags</code></td><td>更新 nvm</td></tr><tr><td><code>opm nvm uninstall</code></td><td><code>rm -rf ~/.nvm</code></td><td>卸载 nvm</td></tr><tr><td><code>opm nvm dir</code></td><td>返回 <code>~/.nvm</code> 安装目录</td></tr><tr><td><code>opm nvm list</code></td><td><code>nvm ls --no-colors</code></td><td>列出已安装 Node.js 版本</td></tr></tbody></table>
|
|
444
|
-
<h2>镜像预设</h2>
|
|
445
|
-
<table><thead><tr><th>预设名</th><th>地址</th></tr></thead><tbody><tr><td><code>official</code></td><td><code>https://github.com/nvm-sh/nvm.git</code></td></tr><tr><td><code>gitee</code></td><td><code>https://gitee.com/mirrors/nvm.git</code></td></tr></tbody></table>
|
|
446
|
-
<h2>示例</h2>
|
|
447
|
-
<pre><code class="lang-bash">opm nvm version
|
|
448
|
-
opm nvm registry set gitee
|
|
449
|
-
opm nvm install
|
|
450
|
-
opm nvm upgrade
|
|
451
|
-
opm nvm list
|
|
452
|
-
opm nvm dir
|
|
453
|
-
opm nvm uninstall</code></pre></div>
|
|
454
455
|
<div id="managers_php" class="doc-content" style="display:none;"><h1>php 命令对照表</h1>
|
|
455
456
|
<p><code>@wwkit/opm</code> 统一命令通过 phpenv 管理 PHP 版本。</p>
|
|
456
457
|
<h2>命令对照</h2>
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@wwkit/opm",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.23",
|
|
4
4
|
"author": "bluesliu <langcai163@163.com>",
|
|
5
5
|
"description": "Unified CLI — package management (npm/pip/dnf/apt) + config view + opencode maintenance",
|
|
6
6
|
"type": "module",
|
|
@@ -35,7 +35,7 @@
|
|
|
35
35
|
"basic-ftp": "^6.2.1",
|
|
36
36
|
"extract-zip": "^2.0.1",
|
|
37
37
|
"systeminformation": "^5.23.0",
|
|
38
|
-
"@wwkit/shared": "1.0.
|
|
38
|
+
"@wwkit/shared": "1.0.28"
|
|
39
39
|
},
|
|
40
40
|
"devDependencies": {
|
|
41
41
|
"jest": "^29.7.0"
|
|
@@ -54,8 +54,10 @@
|
|
|
54
54
|
"postinstall": "node scripts/postinstall.js",
|
|
55
55
|
"check": "node --check bin/index.js",
|
|
56
56
|
"start": "node bin/index.js",
|
|
57
|
-
"
|
|
58
|
-
"
|
|
57
|
+
"ut": "node ../../scripts/run-tests.js unit",
|
|
58
|
+
"it": "node ../../scripts/run-tests.js integration",
|
|
59
|
+
"e2e": "node ../../scripts/run-tests.js e2e",
|
|
60
|
+
"test": "pnpm run ut",
|
|
59
61
|
"doc": "node -e \"import('./src/cli/doc.js').then(m => m.generateDocHtml({ open: false }))\"",
|
|
60
62
|
"release": "node ../../packages/shared/bin/release-pkg.js"
|
|
61
63
|
}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* mise 命令组 — 管理 mise 自身
|
|
3
|
+
*
|
|
4
|
+
* mise 是原生跨平台二进制(Rust),安装方式为下载官方 GitHub release 二进制
|
|
5
|
+
* (见 managers/node.js installMise);upgrade = mise self-update;
|
|
6
|
+
* uninstall = 删二进制 + 清理数据目录。
|
|
7
|
+
* 无 registry 概念(node 镜像在 opm node 组管理,传给 MISE_NODE_MIRROR_URL)。
|
|
8
|
+
*/
|
|
9
|
+
|
|
10
|
+
import { execSync } from 'node:child_process'
|
|
11
|
+
import fs from 'node:fs'
|
|
12
|
+
import path from 'node:path'
|
|
13
|
+
import os from 'node:os'
|
|
14
|
+
import { ToolManagerGroup } from './version-manager.js'
|
|
15
|
+
import { getMiseBin, installMise } from '../../managers/node.js'
|
|
16
|
+
|
|
17
|
+
/**
|
|
18
|
+
* 获取 mise 数据目录(Unix ~/.local/share/mise,Windows %LOCALAPPDATA%\mise)
|
|
19
|
+
* @returns {string}
|
|
20
|
+
*/
|
|
21
|
+
export function getMiseDataDir() {
|
|
22
|
+
if (process.platform === 'win32') {
|
|
23
|
+
return process.env.LOCALAPPDATA
|
|
24
|
+
? path.join(process.env.LOCALAPPDATA, 'mise')
|
|
25
|
+
: path.join(os.homedir(), 'AppData', 'Local', 'mise')
|
|
26
|
+
}
|
|
27
|
+
return process.env.XDG_DATA_HOME
|
|
28
|
+
? path.join(process.env.XDG_DATA_HOME, 'mise')
|
|
29
|
+
: path.join(os.homedir(), '.local', 'share', 'mise')
|
|
30
|
+
}
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* 获取 mise shims 目录(Windows %LOCALAPPDATA%\mise\shims,Unix ~/.local/share/mise/shims)
|
|
34
|
+
*
|
|
35
|
+
* mise 为激活的工具(如 node/npm)在 shims 目录创建 shim(Windows 下含 .cmd),
|
|
36
|
+
* 把该目录加入用户 PATH 后,任意新 shell 即可直接调用 mise 管理的命令。
|
|
37
|
+
* @returns {string}
|
|
38
|
+
*/
|
|
39
|
+
export function getMiseShimsDir() {
|
|
40
|
+
return path.join(getMiseDataDir(), 'shims')
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* 解析 mise ls --json 输出为已安装工具版本列表
|
|
45
|
+
* 输出为对象 keyed by tool name,值是版本记录数组(含 installed/active)。
|
|
46
|
+
* @param {string} out
|
|
47
|
+
* @returns {{ name: string, version: string, current: boolean }[]}
|
|
48
|
+
*/
|
|
49
|
+
export function parseMiseLsAll(out) {
|
|
50
|
+
let data
|
|
51
|
+
try {
|
|
52
|
+
data = JSON.parse(out)
|
|
53
|
+
} catch {
|
|
54
|
+
return []
|
|
55
|
+
}
|
|
56
|
+
if (!data || typeof data !== 'object' || Array.isArray(data)) return []
|
|
57
|
+
const items = []
|
|
58
|
+
for (const [tool, records] of Object.entries(data)) {
|
|
59
|
+
if (!Array.isArray(records)) continue
|
|
60
|
+
for (const rec of records) {
|
|
61
|
+
if (!rec || typeof rec.version !== 'string') continue
|
|
62
|
+
if (rec.installed === false) continue
|
|
63
|
+
const version = rec.version.replace(/^v/, '')
|
|
64
|
+
items.push({ name: `${tool} ${version}`, version, current: !!rec.active })
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
return items
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export class MiseGroup extends ToolManagerGroup {
|
|
71
|
+
constructor() {
|
|
72
|
+
super({
|
|
73
|
+
name: 'mise',
|
|
74
|
+
desc: 'mise version manager (manage mise itself)',
|
|
75
|
+
hasRegistry: false,
|
|
76
|
+
isInstalled: () => {
|
|
77
|
+
try {
|
|
78
|
+
execSync(`${getMiseBin()} --version`, { encoding: 'utf8', stdio: ['pipe', 'pipe', 'pipe'] })
|
|
79
|
+
return true
|
|
80
|
+
} catch {
|
|
81
|
+
return false
|
|
82
|
+
}
|
|
83
|
+
},
|
|
84
|
+
getPath: () => getMiseBin(),
|
|
85
|
+
versionCmd: () => `${getMiseBin()} --version`,
|
|
86
|
+
parseVersion: (out) => out.trim(),
|
|
87
|
+
listCmd: () => `${getMiseBin()} ls --json`,
|
|
88
|
+
parseList: parseMiseLsAll,
|
|
89
|
+
install: (proxy) => installMise(proxy),
|
|
90
|
+
upgrade: () => {
|
|
91
|
+
execSync(`${getMiseBin()} self-update`, { stdio: 'inherit' })
|
|
92
|
+
return { action: 'upgraded' }
|
|
93
|
+
},
|
|
94
|
+
uninstall: () => {
|
|
95
|
+
// mise 由 installMise 下载 release 二进制到 ~/.local/bin,非 npm 全局安装
|
|
96
|
+
const binPath = getMiseBin()
|
|
97
|
+
if (binPath !== 'mise' && fs.existsSync(binPath)) {
|
|
98
|
+
fs.rmSync(binPath, { force: true })
|
|
99
|
+
}
|
|
100
|
+
const dataDir = getMiseDataDir()
|
|
101
|
+
if (fs.existsSync(dataDir)) {
|
|
102
|
+
fs.rmSync(dataDir, { recursive: true, force: true })
|
|
103
|
+
}
|
|
104
|
+
return { action: 'uninstalled', hint: 'mise removed (binary + data dir)' }
|
|
105
|
+
},
|
|
106
|
+
usage: 'opm mise <action> [options]',
|
|
107
|
+
actions: [
|
|
108
|
+
['version', 'Show mise version'],
|
|
109
|
+
['installed', 'Check if mise is installed'],
|
|
110
|
+
['install', 'Install mise (download GitHub release binary)'],
|
|
111
|
+
['upgrade', 'Update mise (mise self-update)'],
|
|
112
|
+
['uninstall', 'Remove mise (binary + data dir)'],
|
|
113
|
+
['dir', 'Show mise binary path'],
|
|
114
|
+
['list', 'List installed tool versions (mise ls --json)'],
|
|
115
|
+
['help', 'Show this help'],
|
|
116
|
+
],
|
|
117
|
+
examples: [
|
|
118
|
+
'opm mise version',
|
|
119
|
+
'opm mise installed',
|
|
120
|
+
'opm mise install',
|
|
121
|
+
'opm mise upgrade',
|
|
122
|
+
'opm mise dir',
|
|
123
|
+
'opm mise list',
|
|
124
|
+
'opm mise uninstall',
|
|
125
|
+
],
|
|
126
|
+
})
|
|
127
|
+
}
|
|
128
|
+
}
|
|
@@ -5,6 +5,7 @@
|
|
|
5
5
|
* 新增包管理器:实现 src/managers/base.js 接口后在此 MANAGERS 注册。
|
|
6
6
|
*/
|
|
7
7
|
|
|
8
|
+
import { spawnSync } from 'node:child_process'
|
|
8
9
|
import { parseFlags } from '../helpers/args.js'
|
|
9
10
|
import { NpmManager } from '../../managers/npm.js'
|
|
10
11
|
import { PipManager } from '../../managers/pip.js'
|
|
@@ -14,7 +15,8 @@ import { BrewManager } from '../../managers/brew.js'
|
|
|
14
15
|
import { ComposerManager } from '../../managers/composer.js'
|
|
15
16
|
import { BunManager } from '../../managers/bun.js'
|
|
16
17
|
import { WingetManager } from '../../managers/winget.js'
|
|
17
|
-
import { NodeManager } from '../../managers/node.js'
|
|
18
|
+
import { NodeManager, getMiseInstallDir, isMiseInstalled, detectSystemNodeConflict, prependSystemPathDirs } from '../../managers/node.js'
|
|
19
|
+
import { getMiseShimsDir } from './mise.js'
|
|
18
20
|
import { PhpManager } from '../../managers/php.js'
|
|
19
21
|
import { PythonManager } from '../../managers/python.js'
|
|
20
22
|
import { getPresets } from '../../presets.js'
|
|
@@ -65,7 +67,7 @@ const MANAGER_DESC = {
|
|
|
65
67
|
composer: 'composer package manager (PHP)',
|
|
66
68
|
bun: 'bun package manager (Bun runtime)',
|
|
67
69
|
winget: 'winget package manager (Windows)',
|
|
68
|
-
node: 'node version manager (via
|
|
70
|
+
node: 'node version manager (via mise)',
|
|
69
71
|
php: 'php version manager (via phpenv)',
|
|
70
72
|
python: 'python version manager (via uv)',
|
|
71
73
|
}
|
|
@@ -350,16 +352,16 @@ Examples:
|
|
|
350
352
|
const RUNTIME_META = {
|
|
351
353
|
node: {
|
|
352
354
|
label: 'Node.js',
|
|
353
|
-
tool: '
|
|
354
|
-
versionsHint: '
|
|
355
|
-
listHint: '
|
|
356
|
-
useHint: '
|
|
357
|
-
currentHint: '
|
|
358
|
-
defaultHint: '
|
|
355
|
+
tool: 'mise',
|
|
356
|
+
versionsHint: 'mise ls-remote node',
|
|
357
|
+
listHint: 'mise ls node --json',
|
|
358
|
+
useHint: 'mise use node@<version>',
|
|
359
|
+
currentHint: 'mise current node',
|
|
360
|
+
defaultHint: 'mise use -g node@<version>',
|
|
359
361
|
latest: 'LTS',
|
|
360
362
|
installExample: '20',
|
|
361
363
|
useExample: '20',
|
|
362
|
-
searchExample: '
|
|
364
|
+
searchExample: 'v24.21.0',
|
|
363
365
|
uninstallExample: '18',
|
|
364
366
|
},
|
|
365
367
|
php: {
|
|
@@ -411,7 +413,7 @@ export class RuntimeGroup extends PackageGroup {
|
|
|
411
413
|
return
|
|
412
414
|
}
|
|
413
415
|
|
|
414
|
-
const runtimeActions = new Set(['use', 'current', 'default', 'installed', 'dir', 'install', 'upgrade', 'search', 'versions', 'version', 'view', 'list', 'info', 'cache'])
|
|
416
|
+
const runtimeActions = new Set(['use', 'current', 'default', 'installed', 'dir', 'install', 'upgrade', 'search', 'versions', 'version', 'view', 'list', 'info', 'cache', 'fix-path'])
|
|
415
417
|
if (runtimeActions.has(action)) {
|
|
416
418
|
const manager = MANAGERS[this.name]()
|
|
417
419
|
const parsed = parseFlags(rest)
|
|
@@ -479,6 +481,26 @@ export class RuntimeGroup extends PackageGroup {
|
|
|
479
481
|
break
|
|
480
482
|
}
|
|
481
483
|
|
|
484
|
+
case 'fix-path': {
|
|
485
|
+
// 仅 node(mise 场景)有效:把 mise 目录前置到系统 PATH(HKLM),
|
|
486
|
+
// 让新终端优先用 mise 管理的 node,而非系统残留的旧版 node。
|
|
487
|
+
if (this.name !== 'node') {
|
|
488
|
+
console.error(`fix-path 仅对 node(mise 管理)有效`)
|
|
489
|
+
process.exit(1)
|
|
490
|
+
}
|
|
491
|
+
const r = this._fixPath()
|
|
492
|
+
if (r.status === 'mise-missing') {
|
|
493
|
+
console.error('mise 未安装,无需 fix-path')
|
|
494
|
+
process.exit(1)
|
|
495
|
+
}
|
|
496
|
+
if (r.status === 'needs-admin') {
|
|
497
|
+
console.error(`系统 PATH 修改需要管理员权限。请以管理员身份运行:\n opm ${this.name} fix-path\n或手动编辑系统环境变量,把以下目录前置到 Path:\n ${r.dirs.join('\n ')}`)
|
|
498
|
+
process.exit(1)
|
|
499
|
+
}
|
|
500
|
+
output({ name: this.name, action: 'fix-path', ...r })
|
|
501
|
+
break
|
|
502
|
+
}
|
|
503
|
+
|
|
482
504
|
case 'install': {
|
|
483
505
|
const version = positional[0] || (manager.getDefaultVersion ? manager.getDefaultVersion() : '')
|
|
484
506
|
if (!version) {
|
|
@@ -555,6 +577,28 @@ export class RuntimeGroup extends PackageGroup {
|
|
|
555
577
|
}
|
|
556
578
|
}
|
|
557
579
|
|
|
580
|
+
/**
|
|
581
|
+
* 修复系统 PATH 冲突:把 mise 目录(安装目录 + shims)前置到系统 PATH(HKLM)。
|
|
582
|
+
*
|
|
583
|
+
* Windows 新终端 PATH = 系统 PATH + 用户 PATH,系统 PATH 优先。系统 PATH 若有
|
|
584
|
+
* 旧版 node 会抢先于 mise shims,导致用户终端 node 与 webwork install 使用的不一致。
|
|
585
|
+
* 写 HKLM 需管理员权限;失败返回 needs-admin 由调用方提示。
|
|
586
|
+
*
|
|
587
|
+
* @param {object} [deps] - 可注入依赖(测试用)
|
|
588
|
+
* @param {Function} [deps.spawnSyncImpl] - spawnSync 实现(reg 读写走数组参数,不经 cmd)
|
|
589
|
+
* @param {Function} [deps.isMiseOk] - mise 安装检测
|
|
590
|
+
* @param {string[]} [deps.dirs] - 需前置的目录
|
|
591
|
+
* @returns {{ status: 'mise-missing'|'no-conflict'|'fixed'|'needs-admin', systemNode?: string, prepended?: string[], dirs?: string[], message?: string }}
|
|
592
|
+
*/
|
|
593
|
+
_fixPath({ spawnSyncImpl = spawnSync, isMiseOk = isMiseInstalled, dirs = [getMiseInstallDir(), getMiseShimsDir()] } = {}) {
|
|
594
|
+
if (!isMiseOk()) return { status: 'mise-missing' }
|
|
595
|
+
const sysNode = detectSystemNodeConflict(spawnSyncImpl)
|
|
596
|
+
if (!sysNode) return { status: 'no-conflict', message: '系统 PATH 无旧版 node,无需修复' }
|
|
597
|
+
const ok = prependSystemPathDirs(dirs, spawnSyncImpl)
|
|
598
|
+
if (!ok) return { status: 'needs-admin', systemNode: sysNode, dirs }
|
|
599
|
+
return { status: 'fixed', systemNode: sysNode, prepended: dirs, message: '已把 mise 目录前置到系统 PATH,新终端将优先用 mise 管理的 node(需重启终端生效)' }
|
|
600
|
+
}
|
|
601
|
+
|
|
558
602
|
/**
|
|
559
603
|
* 依据元数据生成一致的运行时帮助文本
|
|
560
604
|
*/
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
/**
|
|
2
|
-
* 版本管理器自身命令组基类(
|
|
2
|
+
* 版本管理器自身命令组基类(mise / phpenv / uv 共用)
|
|
3
3
|
*
|
|
4
4
|
* 三个版本管理器均提供 version / registry / install / upgrade / uninstall / view 动作,
|
|
5
5
|
* 差异仅在底层命令与安装/升级/卸载方式,故抽象为数据驱动基类。
|
|
@@ -21,7 +21,7 @@ const shell = new Shell()
|
|
|
21
21
|
* @property {string} desc - 顶层帮助描述
|
|
22
22
|
* @property {boolean} [hasRegistry=true] - 是否支持 registry 动作(uv 为 false)
|
|
23
23
|
* @property {() => boolean} isInstalled
|
|
24
|
-
* @property {boolean} [needsBash=false] - versionCmd 是否需要 bash(
|
|
24
|
+
* @property {boolean} [needsBash=false] - versionCmd 是否需要 bash(phpenv 脚本);mise/uv 为 false
|
|
25
25
|
* @property {() => string} getPath - view 展示的安装路径
|
|
26
26
|
* @property {() => string} versionCmd - 返回查询版本的 shell 命令
|
|
27
27
|
* @property {(out: string) => string} [parseVersion] - 解析版本输出
|
package/src/cli/index.js
CHANGED
|
@@ -11,7 +11,7 @@ import { pathToFileURL } from 'node:url'
|
|
|
11
11
|
import { realpathSync, readFileSync } from 'node:fs'
|
|
12
12
|
import { PackageGroup, RuntimeGroup } from './groups/package.js'
|
|
13
13
|
import { ConfigGroup } from './groups/config.js'
|
|
14
|
-
import {
|
|
14
|
+
import { MiseGroup } from './groups/mise.js'
|
|
15
15
|
import { PhpenvGroup } from './groups/phpenv.js'
|
|
16
16
|
import { UvGroup } from './groups/uv.js'
|
|
17
17
|
import { HomebrewGroup } from './groups/homebrew.js'
|
|
@@ -54,7 +54,7 @@ const GROUPS = {
|
|
|
54
54
|
bun: new PackageGroup('bun'),
|
|
55
55
|
winget: new PackageGroup('winget'),
|
|
56
56
|
node: new RuntimeGroup('node'),
|
|
57
|
-
|
|
57
|
+
mise: new MiseGroup(),
|
|
58
58
|
php: new RuntimeGroup('php'),
|
|
59
59
|
phpenv: new PhpenvGroup(),
|
|
60
60
|
python: new RuntimeGroup('python'),
|
package/src/config.json5
CHANGED
|
@@ -95,17 +95,7 @@
|
|
|
95
95
|
},
|
|
96
96
|
},
|
|
97
97
|
|
|
98
|
-
//
|
|
99
|
-
nvm: {
|
|
100
|
-
registry: {
|
|
101
|
-
official: "https://github.com/nvm-sh/nvm.git",
|
|
102
|
-
gitee: "https://gitee.com/mirrors/nvm.git",
|
|
103
|
-
huawei: "https://gitee.com/mirrors/nvm.git",
|
|
104
|
-
active: "huawei",
|
|
105
|
-
},
|
|
106
|
-
},
|
|
107
|
-
|
|
108
|
-
// node(Node.js)镜像预设(dist 下载地址,传给 NVM_NODEJS_ORG_MIRROR)
|
|
98
|
+
// node(Node.js)镜像预设(dist 下载地址,传给 MISE_NODE_MIRROR_URL)
|
|
109
99
|
node: {
|
|
110
100
|
defaultVersion: "24",
|
|
111
101
|
registry: {
|
|
@@ -117,6 +107,20 @@
|
|
|
117
107
|
},
|
|
118
108
|
},
|
|
119
109
|
|
|
110
|
+
// mise 自身(版本管理器二进制)下载镜像预设(GitHub release 资产 base URL)
|
|
111
|
+
// install 时按 <base>/v<version>/mise-v<version>-<platform>-<arch>[.exe] 下载二进制,
|
|
112
|
+
// 依次尝试 active → 其余预设 → official,直到成功(自动回退到可用镜像)。
|
|
113
|
+
// 官方 npm 分发(npm install -g mise)的 preinstall 引用的 platform 包在 Windows 上不可用,
|
|
114
|
+
// 故默认直接下载官方 release 二进制;无法直连 GitHub 时会自动回退到 ghproxy.net 等镜像。
|
|
115
|
+
mise: {
|
|
116
|
+
registry: {
|
|
117
|
+
official: "https://github.com/jdx/mise/releases/download",
|
|
118
|
+
ghproxy: "https://ghproxy.com/https://github.com/jdx/mise/releases/download",
|
|
119
|
+
"gh-proxy": "https://ghproxy.net/https://github.com/jdx/mise/releases/download",
|
|
120
|
+
active: "gh-proxy",
|
|
121
|
+
},
|
|
122
|
+
},
|
|
123
|
+
|
|
120
124
|
// phpenv 自身镜像预设(git clone 地址)
|
|
121
125
|
phpenv: {
|
|
122
126
|
registry: {
|
package/src/index.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* @wwkit/opm 库入口
|
|
3
3
|
*
|
|
4
4
|
* 统一命令行工具(包管理 npm/pip/dnf/apt/brew/composer/bun + 运行时版本管理
|
|
5
|
-
* node/php/python + 版本管理器
|
|
5
|
+
* node/php/python + 版本管理器 mise/phpenv/uv + opencode 运维),
|
|
6
6
|
* CLI 与各组件的可复用 API 均从此导出。
|
|
7
7
|
*/
|
|
8
8
|
|
|
@@ -14,7 +14,7 @@ export { opencodeHarness } from './harnesses/opencode/index.js'
|
|
|
14
14
|
export { harnessCfg } from './harnesses/harness/index.js'
|
|
15
15
|
export { BinaryGroup } from './binaries/base.js'
|
|
16
16
|
export { CftGroup } from './binaries/cft/index.js'
|
|
17
|
-
export {
|
|
17
|
+
export { MiseGroup } from './cli/groups/mise.js'
|
|
18
18
|
export { PhpenvGroup } from './cli/groups/phpenv.js'
|
|
19
19
|
export { UvGroup } from './cli/groups/uv.js'
|
|
20
20
|
export { HomebrewGroup } from './cli/groups/homebrew.js'
|
|
@@ -40,7 +40,7 @@ export { AptManager } from './managers/apt.js'
|
|
|
40
40
|
export { BrewManager } from './managers/brew.js'
|
|
41
41
|
export { ComposerManager } from './managers/composer.js'
|
|
42
42
|
export { BunManager } from './managers/bun.js'
|
|
43
|
-
export { NodeManager,
|
|
43
|
+
export { NodeManager, isMiseInstalled, getMiseBin } from './managers/node.js'
|
|
44
44
|
export { PhpManager, isPhpenvInstalled, getPhpenvBin } from './managers/php.js'
|
|
45
45
|
export { PythonManager, isUvInstalled, getUvBin } from './managers/python.js'
|
|
46
46
|
export {
|
|
@@ -57,7 +57,7 @@ export {
|
|
|
57
57
|
|
|
58
58
|
export {
|
|
59
59
|
NPM_PRESETS, PIP_PRESETS, DNF_PRESETS, APT_PRESETS, BREW_PRESETS, COMPOSER_PRESETS,
|
|
60
|
-
BUN_PRESETS,
|
|
60
|
+
BUN_PRESETS, NODE_PRESETS, PHPENV_PRESETS, PHP_PRESETS, PYTHON_PRESETS,
|
|
61
61
|
UV_PRESETS, DOCKER_PRESETS, HOMEBREW_PRESETS,
|
|
62
62
|
getPresets, resolveRegistryInput,
|
|
63
63
|
} from './presets.js'
|