简单、快速和多功能的Minecraft服务端安装器
AutoInstall使用镜像源BMCLAPI与MCIM API,得以在国内也能像各大启动器快速安装完成
支持Forge,NeoForge,Fabric,Vanilla,或是使用CurseForge,Modrinth类型的整合包的安装
感谢DeEarthX为排除客户端Mod提供了参考
- 从 GitHub Release 下载对应系统和架构的程序并解压,准备所需 Java 环境。
- 在服务端目录执行程序。可以直接提供命令行参数,也可以使用可选的
inst.json,或导入 CurseForge、Modrinth、ServerPackCreator 整合包。 - 安装成功并校验产物后生成
run.sh。安装器不会自动启动 Minecraft;在 Linux 上可检查脚本后执行bash run.sh。
以下命令以 Linux 的 ./AutoInstall 为例,实际程序文件名以下载结果为准。
# 普通原版安装;--no-modpack 禁止扫描目录中的旧整合包
./AutoInstall --no-modpack --mc-version 1.21.1 --loader vanilla
# 普通 NeoForge 安装
./AutoInstall --no-modpack --mc-version 1.21.1 --loader neoforge --loader-version 21.1.123
# 整合包决定 Minecraft 和加载器版本,命令行只调整执行选项
./AutoInstall --modpack ./modpack.mrpack --download bmclapi --maxconnections 10 --maxretries 3
# 查看帮助或 AutoInstall 自身版本,不进行安装
./AutoInstall --help
./AutoInstall --version- 普通安装:显式目标参数优先于
inst.json的version、loader、loaderVersion。必须明确 Minecraft 版本;加载器缺省为vanilla。非原版加载器还需指定版本,可以使用latest;原版不使用加载器版本。 - 整合包安装:默认目标来自包内依赖声明,不使用
inst.json中旧的 Minecraft/加载器/加载器版本。包自身的发布版本号不作为 Minecraft 版本。整合包安装不会创建、改写或删除用户inst.json,也不会通过包内 overrides 覆盖它。 - 输入选择:
--modpack <路径>只处理指定整合包或清单,失败不会回退到其他输入。支持归档.mrpack/.zip和清单modrinth.index.json/manifest.json/variables.txt。 - 没有
--modpack时,只要显式提供任意目标参数(--mc-version、--loader、--loader-version),就进入普通安装,不会被目录中的旧包抢占。--no-modpack也可强制普通安装,不能与--modpack同用。 - 未提供目标参数且没有
--no-modpack时,保留自动发现:优先查找包归档;多个归档可命名为modpack.mrpack/modpack.zip指定优先项,否则报歧义错误。无归档时尝试受支持的散装清单。损坏或不可识别的输入会报错,不作为“无包”忽略。 - 要覆盖整合包目标,必须同时显式指定
--modpack和对应目标参数。切换到另一非原版加载器时还需明确--loader-version(可用latest),不能沿用原加载器的版本。
# 显式覆盖会输出原目标、新目标及兼容性警告
./AutoInstall --modpack ./modpack.mrpack --mc-version 1.21.1覆盖只改变服务端安装目标,不会转换或升级包内模组,兼容性需自行确认。latest 保留各加载器各自的选择规则,不统一为同一种“最新版”;请优先使用整合包声明或已确认兼容的固定版本。
Forge 查询 latest 时,official(含兼容值 none)优先读取官方 promotions_slim.json 的 <Minecraft版本>-latest,失败、数据无效或缺少对应项时回退 BMCLAPI;bmclapi 则优先使用镜像 API,仅在失败或缺项时回退官方 promotions。不会把 recommended 当作 latest。Minecraft 与 Forge 均为 latest 时,官方 promotions 按版本比较选择最新的有效 Minecraft -latest 项;显式固定的 Forge 版本不会被替换。
文件不是必需的。普通安装可使用以下示例;也可仅保留执行选项用于整合包安装。
{
"version": "1.21.1",
"loader": "neoforge",
"loaderVersion": "21.1.123",
"download": "official",
"maxconnections": 4,
"maxretries": 3,
"argsment": "",
"followModpackFilenames": true,
"enableModClassifier": true
}执行选项的优先级是 显式命令行参数 > 可选配置字段 > 默认值,但整合包模式有一项例外:配置中的 download 不参与,下载源由 --download 或默认 official 决定。包模式只读取配置中的并发、重试、JVM 参数和两个开关;旧的目标字段不参与目标选择。配置文件仍必须是合法 JSON 对象。
| 配置字段 | 命令行参数 | 默认值 / 说明 |
|---|---|---|
version |
--mc-version |
无默认 Minecraft 版本,缺少目标时报错 |
loader |
--loader |
vanilla;支持 vanilla / fabric / forge / neoforge |
loaderVersion |
--loader-version |
非原版必须提供,支持 latest |
download |
--download |
official;支持 bmclapi,旧值 none 等同 official |
maxconnections |
--maxconnections |
4,必须为正整数 |
maxretries |
--maxretries |
3,每个来源的最多尝试次数,包含首次尝试,必须为正整数 |
argsment |
--argsment |
空字符串;显式空值可清空配置中的 JVM 参数 |
followModpackFilenames |
--follow-modpack-filenames |
true |
enableModClassifier |
--mod-classifier |
true |
其他参数:--clean 在安装成功后清理本次拥有的临时内容;--help 显示帮助;--version 输出 AutoInstall 版本而非 Minecraft 版本。显式空目标/包路径以及非正并发或重试次数会报错。
两个开关都默认开启。JSON 中使用布尔值 true / false,不要写成字符串。命令行关闭时必须使用 =false,不能写成 --mod-classifier false。
./AutoInstall --modpack ./modpack.mrpack --follow-modpack-filenames=false --mod-classifier=false
# JVM 参数以 - 开头时推荐使用等号;显式空值清空配置
./AutoInstall --no-modpack --mc-version 1.21.1 --argsment="-Xms2G -Xmx4G"
./AutoInstall --no-modpack --mc-version 1.21.1 --argsment=""- 跟随命名开启:模组使用包内声明的路径。关闭时保留声明目录,仅将模组文件名改为实际传输并校验成功的原始候选 URL 中的文件名,不使用重定向目标或响应头改名。非模组资源、配置及 overrides 不改名;同目标不同内容会报冲突,不静默覆盖。CurseForge 继续使用其可获得的文件来源和校验能力。
- 分类器开启:保留 JAR/Mixin/Modrinth 等客户端检测和移入
.rubbish的处理。重复回收时相同内容复用,不同内容另取编号文件名,不覆盖历史文件。关闭后跳过这类额外检测、相关 API 请求及移动,但不保证模组能在服务端运行。Modrinth 明确声明env.server=unsupported的文件仍会在下载前排除,Forge/NeoForge 的服务端依赖筛选也始终执行。
包内下载文件先在 staging 校验,再依次应用 overrides 和 Modrinth 的 server-overrides;包内覆盖顺序与既有用户文件的冲突保护分开处理。最终内容与目标目录已有文件不同时仍报冲突。暂不支持的 Modrinth 加载器依赖(例如 Quilt)会明确报错,不静默降级为原版。
下载会重试并在需要时使用备用源;不同候选不混用未完成分片,有可用哈希时校验后才接受结果。Forge/NeoForge 继续使用官方安装器执行处理器,不将客户端生成产物误当成远程服务端依赖。安装器退出成功后仍检查启动参数和元数据声明的关键产物,缺失或校验失败不会作为安装成功。
Java 选择保留简幻欢和 mise 支持;简幻欢/mise 的安装器和启动脚本均按目标 Minecraft 版本选择 Java 8/16/17/21/25,不再为现代加载器强制使用 Java 8。其他环境在可用时使用 JAVA_HOME/bin/java,否则使用 PATH 中的 Java,自行安装的 Java 仍需与目标版本兼容。自有启动脚本只在产物校验通过后替换;官方安装器自身可能留下脚本,失败时不能仅凭目录内是否有 run.sh 判断安装是否成功。
internal/app:按安装会话编排发现、配置、包准备、加载器安装和清理;依赖可注入,离线测试不需要启动 Java。internal/config/internal/model:可选配置、CLI 显式参数、统一请求、文件任务和安装计划。internal/download:独立 HTTP 客户端、重试、候选与哈希、续传及取消;不依赖旧core/pkg全局状态。internal/modpack/internal/workspace:CF/MR/SPC 输入适配、规划、安全 staging、受保护路径与冲突部署。下载、CF Key、日志及分类回调按会话传入。internal/runtime/internal/loader:Java 环境和版本策略、纯 Maven 兼容逻辑;Forge/NeoForge 共用明确的安装后半段,Fabric 保持独立流程。
本次采用渐进迁移:core / pkg 保留旧加载器、元数据和兼容入口,不是一次性目录重命名。旧加载器执行仍要求安装根目录为当前工作目录,CLI 没有额外的输出目录参数;兼容层的 HTTP/日志仍按单会话使用,不支持在同一进程并发执行多个真实加载器安装。新增整合包适配不应重新引入写回 inst.json 或全局等待组。
Go 版本以 go.mod 为准。正常构建(包括依赖准备)需要相应工具链及依赖:
go test ./...
go vet ./...
go build ./...
# build.sh 使用包级构建并注入版本;不会把 API Key 编进二进制
# 安装 CurseForge 包时,在运行环境中设置 CF_API_KEY,不要提交密钥
BUILD_NAME=AutoInstall bash ./build.sh依赖和对应 Go 工具链已在本机缓存时,可离线验证:
GOTOOLCHAIN=local GOPROXY=off go test ./...
GOTOOLCHAIN=local GOPROXY=off go vet ./...
GOTOOLCHAIN=local GOPROXY=off go build ./...Race 检测需要支持的平台、CGO 和 C 编译器,可运行 CGO_ENABLED=1 go test -race ./...。CI 先在 Linux amd64 上执行测试、vet 和 race 检测,通过后才交叉构建现有 Linux amd64/386/arm64/arm 发布产物,注入版本但不嵌入 API Key。离线单元测试使用临时目录及本地假服务/命令执行器,不代表已完成所有版本的真实联网安装验收。
工作流按职责拆分:
.github/workflows/go.yml:推送到master时执行测试和多架构构建、保存构建附件;同时提供可复用的workflow_call入口。.github/workflows/release.yml:仅在 GitHub Release 发布(published)时触发,解析版本后调用go.yml完成测试构建,再上传发布附件并补全空白说明。仅创建 tag 或保存草稿不会触发发布。
测试与构建逻辑只维护一份;只有 release.yml 的发布 job 具有 contents: write 权限。
- 创建并发布 Release,tag 使用
v1.4.2、v1.4.2-14200或v1.1.5.2-11520这类格式:以v开头,三至四段数字,可附加-数字构建号。 - 测试、vet 和 race 检测通过后构建四种 Linux 架构。Release tag 去掉
v后完整注入main.gitversion,例如v1.4.2-14200对应AutoInstall-1.4.2-14200。 - 所有架构构建成功后,将
AutoInstall-linux-{amd64,386,arm64,arm}-v1和SHA256SUMS上传到该 Release。重跑会替换同名附件。 - 发布说明为空或只有空白时,使用上一个可达 tag 以来的非 merge 提交标题补充;首次发布最多取最近 50 条。已有说明保持不变。
公开构建不读取或嵌入 CF_API_KEY,无需在仓库 Actions Secrets 配置该 Key。安装 CurseForge 包时,请在实际运行程序的环境中设置 CF_API_KEY(例如通过面板的受保护环境变量),程序按会话读取,显式空值可禁用旧私有构建内置的 Key。不要把包含密钥的私有构建上传到公开附件。
Release 上传使用自动提供的 GITHUB_TOKEN,只有发布 job 获得 contents: write 权限,无需另配个人 token。Go 项目不需要示例中的 Gradle、APK 签名或 Bugly 步骤。
普通推送和本地构建仍默认使用 1.4.2-<git hash>,也可通过 BUILD_VERSION 显式覆盖;发布流程不会为改版本而修改或提交源码。