运行时与生态工具
本页覆盖 Node.js、Python、Java/JRE、Go、Rust,以及 Maven、Gradle、Kotlin。 JavaScript 包管理器另见专页,任意 GitHub Release 工具见 下载源与供应链安全。
通用命令形态
osdk install TOOL[@VERSION]... [-o|--opt KEY=VALUE ...]
osdk lock [TOOL[@VERSION] ...] [-o|--opt KEY=VALUE ...]
osdk upgrade [TOOL[@VERSION] ...] [-o|--opt KEY=VALUE ...]
osdk use|u TOOL[@VERSION] [-g|--global] [-o|--opt KEY=VALUE ...]
osdk exec (-t|--tool TOOL[@VERSION])... -- COMMAND [ARG ...]
osdk list|ls [TOOL]
osdk list-remote|lsr TOOL [FILTER]
osdk current [TOOL]
osdk where TOOL[@VERSION]
osdk uninstall|rm TOOL@VERSION-o/--opt 可重复,必须写成 KEY=VALUE。它会应用到本次调用中的每个工具; 一次命令混合不同 backend 时,不要传只适用于其中一个 backend 的选项。
已有结构化工具若被 when 排除在当前平台之外,osdk use TOOL@VERSION 只更新它的 version,并保留 when、lazy 与 backend 选项;它不会绕过平台条件执行安装,也不会 为当前平台生成该工具的 lock 条目。此时不能同时修改 -o/--opt,backend 选项应在匹配的 平台上更新并验证。
内联选项块写成 tool[key=value,...]@selector,选项块在 @ 之前。在 PowerShell 下要给 整个操作数加引号:它把参数内未加引号的逗号当数组分隔符,会把一个表达式拆成两个参数。
osdk install 'npm:esbuild[installer=pnpm,allow_builds=true]@0.21'选项值本身含逗号时再套一层引号:allow_builds="a,b"。不加引号被拆开时,osdk 会识别出 这种情况并给出加好引号的完整命令,而不是报括号没写完。
后端速览
| backend | 工具名别名 | 生态版本文件 | 专用安装选项 |
|---|---|---|---|
node | nodejs | .nvmrc、.node-version、package.json | arch、corepack |
python | py、cpython | .python-version | variant、tag |
java | jdk、openjdk | .java-version、.sdkmanrc | distribution、package-type |
go | golang | go.mod、.go-version | 无 |
rust | rustup | rust-toolchain.toml、rust-toolchain | profile、components、targets |
maven | mvn | .mvn-version | 无 |
gradle | — | .gradle-version | 无 |
kotlin | kotlinc | .kotlin-version | 无 |
zig | — | .zig-version | 无 |
活动版本的完整来源优先级,以及无参数生命周期命令对生态文件的当前限制,见 项目版本发现。
Node.js
osdk install node@20
osdk install node@20.19.0 -o corepack=true
osdk lock node@20 -o arch=arm64| 选项 | 值 | 作用 |
|---|---|---|
arch | x64、arm64、x86、arm | 选择目标 Node artifact;默认 host 架构 |
corepack | `true | 1 |
corepack 未显式传入时取 [settings.node].corepack,默认 false。启用失败会删除 本次安装,不留下完成标记。Node 的 shim 只负责 node 和 corepack;npm/npx 由 独立 npm backend 或相应 Node 安装的路由 shim 协调。执行环境还会在用户未设置时 提供共享 npm_config_cache。
arch 可用于生成其他架构的 lock 区段,但 osdk 没有只下载模式;实际安装会拒绝 不能在当前 host 执行的 Node artifact。
Node 版本列表会合并所有可达 source 的 index,并保留排序靠前来源对重复版本的 LTS 标记;因此一个响应正常但同步落后的镜像不会隐藏后续 source 已发布的版本。下载阶段再 按同一顺序逐个校验 SHASUMS256.txt 对应的归档。
Node 也提供全局包迁移:
osdk node migrate-packages --from VERSION --to VERSION [--apply]# 只生成计划
osdk node migrate-packages --from 20.19.0 --to 22.17.0
# 执行迁移
osdk node migrate-packages --from 20.19.0 --to 22.17.0 --apply源、目标都必须是已安装且含 npm 的受管 Node。osdk 通过源版本的 npm ls -g --depth=0 --json --long 枚举,跳过 npm 自身、目标已存在的包,以及声明 hasInstallScript=true 或 gypfile=true 的原生/安装脚本包。--apply 按精确版本安装; 失败时恢复目标原有的全局包集合。
Python
python@3.14 是默认 CPython 的简写。完整请求为 python@IMPLEMENTATION-VERSION+VARIANT:
osdk install python@3.14
osdk install python@cpython-3.14+freethreaded
osdk install python@cpython-3.14+debug
osdk install python@cpython-3.14+freethreaded+debug
osdk install python@pypy-3.11
osdk install python@graalpy-3.12
osdk install python@pyodide-3.14| 实现 | 支持的变体 | identity 示例 |
|---|---|---|
cpython | default、freethreaded、debug、freethreaded+debug | 3.14.7、cpython-3.14.7+debug |
pypy | default | pypy-3.11.x |
graalpy | default | graalpy-3.12.x |
pyodide | default | pyodide-3.14.x |
| 选项 | 值 | 作用 |
|---|---|---|
variant | 上表中的变体 | 与请求中的 +VARIANT 等价;显式选项优先 |
tag | python-build-standalone 发布日期,如 20240224 | 为经典 CPython 下载固定历史 PBS release |
实现、精确 Python 版本、变体和 catalog artifact 都会进入 lock,不同 identity 可 并存。普通 CPython 使用内置 python-build-standalone 版本索引;多实现、变体和预发布 使用内置的已校验 catalog。自定义 catalog 必须同时指定内容摘要:
[settings.python]
catalog_url = "/approved/python-catalog.json"
catalog_sha256 = "0123456789abcdef..."catalog_url 可为 HTTP(S) 或本地路径。只有 SHA-256、schema 与每个 artifact checksum 全部有效才更新 last-good;刷新失败会尝试 last-good,再回退内置 catalog。 预发布策略见预发布版本。
经典 CPython 的同一 release tag 会合并所有可达 source 的 SHA256SUMS,排序靠前来源 的同名条目优先;因此首个镜像缺少某个平台的归档时,后续来源仍可补齐并进入下载回退。
查找解释器:
osdk python find [REQUEST]osdk python find
osdk python find pypy-3.11
osdk python find 3.14+freethreadedmanaged 结果按可选请求筛选;随后仍扫描 PATH 与系统候选并去重,按 managed、PATH、system 标记输出。完全找不到时返回错误。
Java JDK 与 JRE
osdk install java@21
osdk install java@zulu-17.0.1
osdk install java@21 -o distribution=zulu -o package-type=jdk
osdk install java@21 -o package-type=jre| 选项 | 值 | 默认值 |
|---|---|---|
distribution | Foojay distribution ID,如 temurin、zulu | temurin |
package-type | jdk 或 jre | jdk |
发行版也可写进版本请求,例如 java@temurin-21。Foojay 查询按发行版、操作系统、 架构、archive 类型、JDK/JRE 和 Linux libc 过滤。JRE identity 为 jre-<resolved-version>,可与相同版本的 JDK 共存;执行 JDK/JRE 时导出 JAVA_HOME。
Temurin 版本带 build 号(如 21.0.12+8),PSU 还会有第四段(如 21.0.12.1+1)。 版本请求可以省略 build 号:java@21.0.12 会匹配同一核心版本的 21.0.12+8;只有当 同一核心版本不存在时,才回退匹配四段式 PSU。
内置 Temurin LTS catalog 包含 8、11、17、21、25,可在空 metadata 缓存下解析; 已锁定的 artifact 在 Foojay 不可用时也可安装。可设置兼容 Foojay /packages 的 端点或静态镜像:
[settings.java]
catalog_url = "https://mirror.example/disco/v3.0/packages"未设置这个单一显式 catalog 时,Java 会按 source 排序逐个查询 Foojay-compatible endpoint;某个 endpoint 可访问但没有请求的 distribution/JDK/JRE 组合时继续后备源。 对应的 checksum detail 也按相同顺序回退,最终 vendor 归档仍由通用校验下载管线处理。
JVM 工具
osdk install maven@3.9.16
osdk install "gradle@=9.3.1"
osdk install kotlin@2.4.10Gradle 按上游版本索引解析,因此任何历史版本都可安装:osdk list-remote gradle 列出全部正式发布(2026-09-14 实测 179 个),每个版本的下载地址与 SHA-256 都取自索引, 无需在 osdk 内逐版本硬编码。索引里的 nightly、-rc-N 与 -milestone-N 会被判为非 稳定,所以 latest 只会落到正式版;需要预览版请按名字显式指定。若某条记录没有校验和, 安装会被拒绝而不是降级为不校验。
Maven 与 Kotlin 的上游没有同类的可机读索引,仍是固定集合:Maven 仅 3.9.16 (SHA-512)、Kotlin 仅 2.4.10(SHA-256),请求其他版本会失败。三者都拥有独立安装 目录和 shim;Kotlin 的 GitHub 下载还提供代理候选。Maven/Kotlin 使用排序后的有效 source URL;Gradle 会逐源读取 index,并把 index 中的绝对 distribution URL 重映射到 每个排序 source,因此 index 可读但该源缺少目标 zip 时仍会回退。
与 Gradle Wrapper 的关系
项目里已有 gradle/wrapper/gradle-wrapper.properties 时,wrapper 仍是权威来源 —— 它的 distributionSha256Sum 是比版本 pin 更强的保障。osdk 的 gradle pin 适用于没有 wrapper 的场景(例如新建项目或直接用 gradle 命令)。两者的摘要同源:实测索引中 9.3.1 的 checksum 与 wrapper 声明的 distributionSha256Sum 逐字符一致。
Go
osdk install go@1.22
osdk use -g golang@1.23Go 没有 backend 专用 -o。osdk 从 go.dev JSON index 选择当前 OS/架构的 archive 并验证索引中的 SHA-256;下载候选包括 go.dev、Aliyun 和 golang.google.cn。执行时导出 GOROOT,并提供 go、gofmt。
Rust
Rust backend 委托给安装在 osdk 隔离目录中的 rustup:
osdk install rust@stable
osdk install rust@nightly -o profile=minimal \
-o components=clippy,rustfmt \
-o targets=wasm32-unknown-unknown,x86_64-pc-windows-gnu| 选项 | 值 | 默认值 |
|---|---|---|
profile | rustup 接受的 profile | default |
components | 逗号分隔的 rustup component | 空 |
targets | 逗号分隔的 rustup target | 空 |
latest、lts 和 system 都映射为 stable;stable、beta、nightly 与精确 工具链基本原样交给隔离 rustup。rustup bootstrap 自身固定使用 minimal 且不装默认 toolchain。运行时导出 RUSTUP_HOME=<data>/rustup 和 CARGO_HOME=<data>/cargo。 Lock 也会原样保存这些浮动 channel,因此以后重装 stable、beta 或 nightly 可能 得到更新 toolchain;需要不可变结果时请写明确版本或带日期的 toolchain。
source probe 只用通用 stable manifest 排序,不代表镜像已经同步请求的精确 toolchain、 component 或 target。所有会下载的 rustup 操作都会按排序逐个运行完整命令;某个源返回 404、下载失败或 rustup 拒绝其内容时会继续下一个源,直到命令真正成功。
暴露的命令与 cargo install
安装和 osdk reshim 时,osdk 会为活动工具链 bin 与隔离 CARGO_HOME/bin 里的全部 可执行文件生成 shim,而不只是 rustc、cargo、rustup、rustfmt、clippy-driver 五个核心命令:rustdoc、rust-analyzer、cargo-miri 等 rustup 代理,以及之后用受管 cargo 安装的 CLI 都会被暴露。这些 shim 运行时同样注入隔离的 RUSTUP_HOME、CARGO_HOME, 不会误连到系统 rustup。
用受管 cargo install 安装的第三方工具进入 <data>/cargo/bin(而不是系统 ~/.cargo), 装完执行一次 osdk reshim 即可让新命令在 shell 中直接可用;cargo <子命令> 形式 (如 cargo tauri)无需 reshim,cargo 会直接在隔离 CARGO_HOME/bin 找到对应程序。
与系统 rustup 的管理边界
osdk 只驱动数据目录下的隔离 rustup,不接管已经安装在系统 PATH 上的 rustup:
- 未执行过
osdk install rust时,隔离 rustup 不存在,osdk rust *会明确报错并 提示先安装;它不会转而调用系统 rustup。 osdk source pin rust <源>与一次性的--source <源>只改变 osdk 驱动受管 rustup 时注入的RUSTUP_DIST_SERVER,不会修改外部 rustup 的环境变量或配置;未安装 受管 Rust 时命令会额外打印这条作用域提示。要让系统 rustup 走镜像,请自行配置RUSTUP_DIST_SERVER、RUSTUP_UPDATE_ROOT等环境变量。- 会下载的受管操作(
osdk install rust、osdk rust component add、osdk rust target add)共用同一套源选择,因此固定的源对补装 component、target 同样生效;pin 只把该源排到第一位,目标在该源不可用时仍会回退。 - 受管 rustup 始终使用 osdk 选定的源:shell 中已经导出的
RUSTUP_DIST_SERVER、RUSTUP_UPDATE_ROOT不会影响受管操作,避免外部镜像覆盖 osdk 的选择。若要临时改用 其他源,请使用--source <源>,而不是导出环境变量。
Component 与 target
osdk rust component add NAME [--toolchain TOOLCHAIN]
osdk rust component remove NAME [--toolchain TOOLCHAIN]
osdk rust component list [--toolchain TOOLCHAIN]
osdk rust target add NAME [--toolchain TOOLCHAIN]
osdk rust target remove NAME [--toolchain TOOLCHAIN]
osdk rust target list [--toolchain TOOLCHAIN]--toolchain 默认 stable,命令直接作用于隔离 rustup。
osdk rust component add rustfmt --toolchain stable
osdk rust target add wasm32-unknown-unknown --toolchain stable状态、override 与本地工具链
osdk rust check [--repair]
osdk rust override import [PATH]
osdk rust override export [PATH]
osdk rust toolchain link NAME PATHcheck先执行隔离rustup check;--repair再按真实 toolchain 目录补建缺失 marker, 并移除没有对应 toolchain 的 marker。override import从可选目录(默认当前目录)的隔离 rustup override 读取 toolchain, 写入最近项目osdk.toml。override export把该目录的活动 osdk Rust pin 写成隔离 rustup 的目录 override。toolchain link要求PATH可规范化且包含bin/;NAME不能有空白、斜杠, 也不能是.或..。
linked toolchain 可被 shim 和 shell 使用,但它是本机路径,osdk lock 会拒绝把它 写成可复现 artifact。
Zig
osdk install zig@latest
osdk use zig@0.16
osdk exec --tool zig -- zig version版本来自 ziglang.org/download/index.json,该索引把每个发布的归档 URL 与 SHA-256 放在一起,因此每次安装都经过校验、也可被锁定。Zig 的 GitHub release 只提供源码和 bootstrap 归档,所以通用 github: backend 无法安装它。index 中虽然写的是绝对 tarball URL,osdk 仍会按相对发布路径把它重映射到每个排序 source;镜像 index 正常但 目标归档缺失、损坏或无法解包时会继续后备源。
master 是滚动 nightly 而非发布版本,按预发布处理:zig@latest 只会选中带 tag 的 版本;需要 nightly 时在允许预发布的策略下显式执行 osdk install zig@master。
用 Zig 做 C / C++ 交叉编译
zig cc 和 zig c++ 是自带 libc 的 Clang 驱动:musl、多个 glibc 版本、mingw-w64 和 wasi-libc 都已内置。因此装一份就能交叉编译到多个目标,不需要为每个目标准备 sysroot —— 这正是 Android NDK 在 Android 之外做不到的事。
# 同一份源码,无需额外下载,也不用指定 sysroot。
osdk exec --tool zig -- zig cc -target aarch64-linux-musl -o hello hello.c
osdk exec --tool zig -- zig cc -target x86_64-windows-gnu -o hello.exe hello.c在 Windows x86-64 主机上用包含 <stdio.h> 的源码实测,以下目标均产出了对应架构的 二进制:
-target | 产物 |
|---|---|
x86_64-linux-gnu | ELF,x86-64 |
aarch64-linux-gnu | ELF,aarch64 |
x86_64-linux-musl | ELF,x86-64,静态 |
aarch64-linux-musl | ELF,aarch64,静态 |
riscv64-linux-musl | ELF,riscv |
x86_64-windows-gnu | PE |
wasm32-wasi | wasm |
把 CC 指向 zig 后,它也可以充当其他构建系统的 C 编译器,这对带 C 依赖的 Rust crate 很有用:
osdk exec --tool zig -- cargo build # 环境中设置 CC="zig cc"ZIG_GLOBAL_CACHE_DIR 会指向 osdk 缓存内的目录,避免构建产物堆积在用户主目录; 若该变量已有值则不覆盖。