development - mclucy/lucy GitHub Wiki
本文档面向 Lucy 的内部维护者与贡献者,覆盖以下内容:
- 代码库结构与关键模块职责
- 本地开发的标准工作流
- 常见功能扩展的代码入口
建议在阅读本页前,先了解 架构总览。
lucy 仓库遵循标准 Go module 布局:
├── cmd/ # CLI 定义与命令处理器(urfave/cli)
├── probe/ # 服务端环境检测与拓扑构建
├── types/ # 核心领域模型与数据结构
├── exttype/ # 外部/第三方类型定义(如 Modrinth、MCDR schema)
├── install/ # 平台特定的安装逻辑
├── dependency/ # 版本解析与约束求解
├── upstream/ # 外部 API 客户端(Modrinth、CurseForge 等)
│ └── routing/ # 数据源选择与并行抓取逻辑
├── cache/ # 本地下载与元数据缓存
├── logger/ # 应用日志
└── tools/ # 共享工具函数
开发前请确保已安装 Task 与 Go 工具链,并在仓库根目录写入 CurseForge API 密钥:
# 在 lucy/ 根目录创建 .env 文件(该文件已被 .gitignore 忽略)
echo 'CF_API_KEY=your_key_here' > .env# 构建 macOS arm64 开发版(输出到 dist/lucy-darwin-arm64-dev)
task build-dev构建产物位于 dist/lucy-darwin-arm64-dev,包含 -tags debug 标记并保留完整符号信息,适合本地调试。
# 监听 .go 文件变化并执行增量重建(不会清空 dist/)
task build-watchWarning
build-watch 使用 interval: 700ms 轮询;在大量文件变更时可能出现短暂延迟。
# 在任意 Minecraft 服务端目录中运行开发版
./dist/lucy-darwin-arm64-dev status
# 启用调试日志
./dist/lucy-darwin-arm64-dev --debug status
# 退出时打印完整日志历史
./dist/lucy-darwin-arm64-dev --print-logs add fabric/fabric-api@latest
# 输出日志文件路径并启用调试日志
./dist/lucy-darwin-arm64-dev -l --debug search carpet# 运行全部测试
go test ./...
# 仅测试指定包
go test ./dependency/...
# 指定包测试(详细输出)
go test -v ./upstream/curseforge/...# 清理开发版构建产物
task cleanup-dist
# 生成 bash / zsh / fish shell 补全脚本
task gen-completions
# 构建多平台 Release 版本(需要有效 CF_API_KEY)
task build-release以下是最常见扩展点及其代码入口。
注册入口:cmd/cmd.go(参见第 54-61 行 Commands 数组)
Cli 变量定义了完整 CLI 入口,包括全局 flag、子命令列表和 shell 补全配置:
// ../lucy/cmd/cmd.go:18-69
// Cli is the main command for lucy
var Cli = &cli.Command{
Name: "lucy",
Usage: "The Minecraft server-side package manager",
Action: tools.Decorate(
actionEmpty,
decoratorBaseCommandFlags,
decoratorGlobalFlags,
decoratorHelpAndExitOnNoArg,
decoratorHelpAndExitOnError,
),
Flags: []cli.Flag{
&cli.BoolFlag{
Name: flagLogFileName,
Aliases: []string{"l"},
Usage: "Output the path to logfile",
Value: false,
},
&cli.BoolFlag{
Name: flagPrintLogsName,
Usage: "Print logs to console",
Value: false,
},
&cli.BoolFlag{
Name: flagDebugName,
Usage: "Show debug logs",
Value: false,
},
&cli.BoolFlag{
Name: flagDumpLogsName,
Usage: "Dump the log history to console before exit",
Value: false,
Hidden: true,
},
flagNoStyle,
},
Commands: []*cli.Command{
subcmdStatus,
subcmdInfo,
subcmdSearch,
subcmdAdd,
subcmdInit,
subcmdCache,
},
// Shell completion scripts are generated at runtime via `lucy completion <shell>`.
// Use `lucy completion bash|fish|pwsh|zsh`; `--generate-shell-completion` is internal.
EnableShellCompletion: true,
Suggest: true,
UseShortOptionHandling: true,
DefaultCommand: "help",
OnUsageError: helpOnUsageError,
}操作步骤:
- 在
cmd/新建cmd_<name>.go,定义*cli.Command和对应Action。 - 用
tools.Decorate包装 action,挂载标准装饰器(错误处理、flag 解析等)。 - 在
cmd/cmd.go的Cli.Commands末尾追加新命令变量。
示例(新增 sync 命令):
# 创建命令文件
touch cmd/cmd_sync.go并在 cmd/cmd.go 中追加:
// cmd/cmd.go, Cli.Commands array
Commands: []*cli.Command{
subcmdStatus,
subcmdInfo,
subcmdSearch,
subcmdAdd,
subcmdInit,
subcmdCache,
subcmdSync, // <- new
},注册入口:install/install.go(参见第 18 行 registerInstaller)
操作步骤:
-
在
types/中确认或新增平台常量。 -
在
probe/中补充对应平台环境探测逻辑,并更新RuntimeTopology。 -
新建
install/install_<platform>.go,实现下列函数签名:type platformInstaller func(p types.Package) error
-
在
install/install.go顶层调用registerInstaller,绑定平台常量与实现。
Warning
此功能尚未完整/正确实现
install/install.go 第 131 行处,安装 Vanilla(minecraft)平台时若已存在服务端,当前会直接返回错误,尚未提供覆盖确认提示(以 TODO 注释标注)。
注册入口:upstream/routing/routing.go(参见第 46-51 行 providerBySource map)
操作步骤:
- 在
upstream/下新建子包目录(例如upstream/mysource/)。 - 实现
upstream.Provider接口(Search、Fetch、Information等方法)。 - 在
upstream/routing/routing.go的providerBySource中添加Source -> Provider映射。 - 若需参与自动路由(
SourceAuto),按需更新autoProviders切片或ResolveProviders的 switch 分支。
可参考现有实现:upstream/modrinth/、upstream/curseforge/。
包路径:dependency/
Warning
新增版本方言(如特定平台版本格式)应在 dependency/ 包中实现对应解析器,并注册到版本解析入口;具体接口以该包现有实现为准。
以下事项在当前开发阶段仍处于未完成状态,贡献时请重点关注:
-
本地安装方法:
probe包中包含.lucy目录检测占位符,本地安装状态管理尚未最终确定。 -
流式处理改造:
main.go中有注释REPLACE ALL io.ReadAll WITH STREAMING METHODS,大文件下载/读取的内存效率仍待优化。 -
优先首次响应:
upstream/routing/routing_execution.go中FirstFetch当前为panic("not implemented");目标是首个 provider 成功即返回,而不是等待全部并行请求结束。 -
服务端覆盖确认:
install/install.go在 Vanilla 平台安装场景下,若已存在服务端仍是直接报错,需补充用户确认流程。
- Lucy 基于 Charm 生态(
bubbletea、lipgloss、huh、glamour)构建终端 UI。 - 输出风格应保持简洁且可读:信息性消息优先通过
logger输出,交互式提示使用huh。 - 必须遵循
--no-styleflag,保证 CI/CD 环境可禁用样式输出并保持兼容。
| 文件 | 说明 |
|---|---|
cmd/cmd.go |
CLI 主命令定义,Commands 数组注册入口 |
install/install.go |
平台安装器注册入口(registerInstaller) |
upstream/routing/routing.go |
上游数据源路由绑定(providerBySource) |
Taskfile.yml |
构建、测试、清理等开发任务定义 |
dependency/ |
版本解析与约束求解包 |