include/XBase/Package.h · XBase::Package
每个 mod 在自己的数据目录放一份 XBase\Mods\<模组名>\package.json,声明身份信息与运行环境约束。Bootstrap 挂载 mod 时读取并校验;文件不存在视为无约束,旧目录照常挂载。
{
"name": "XMenu",
"version": "v0.1.0-alpha1",
"author": "鼠子(YuiNijika)",
"description": "XMenu 模组菜单",
"homepage": "https://gtamodx.com/mods/xmenu",
"engines": {
"xbase": ">=0.1.0"
},
"dependencies": {
"SomeMod": "^1.0.0"
}
}| 字段 | 说明 |
|---|---|
name | mod 名称,缺省用目录名 |
version | mod 自身版本,mod 的版本号以这里为唯一真源 |
author / description / homepage | 展示信息,宿主界面的关于页直接取用 |
engines.xbase | 对 XBase 运行库的版本约束 |
dependencies | 对其它 mod 的版本约束,键是对方目录名,值是版本区间 |
对齐 npm 的 node-semver 子集:
>= > <= < == 与精确版本^1.2.3 锁定最左非零分量(^0.2.3 只允许补丁位变化)~1.2.3 只允许补丁位变化1.2.3 - 2.0.01.x / 1.2.x / *|| 分隔的组任一满足,组内空格分隔的条件同时满足v 忽略,预发布后缀(如 alpha1)不参与数字比较挂载时依次校验:
engines.xbase 不满足 → 拒绝挂载,弹窗列出所需版本与已装版本dependencies 里每个依赖按名字找 Mods\<依赖名>\package.json 的 version,依赖缺失或版本不符 → 拒绝挂载并列出全部问题namespace XBase::Package {
struct Info {
bool valid;
std::string name, version, author, description, homepage;
std::string xbaseRequirement;
std::vector<std::pair<std::string, std::string>> dependencies;
};
bool Load(const std::string& modName, Info& out);
bool Satisfies(const std::string& requirement, std::uint32_t runtimeNumber);
bool ParseVersion(const std::string& text, std::uint32_t& number);
bool Validate(const std::string& modName, std::string& failureReason);
} // namespace XBase::Package宿主要展示 mod 的名称版本作者时走 Load() 取字段,不要在源码里再写一份;版本判定用 Satisfies() 配合 Version.h 的 kVersionNumber,不要解析字符串。
评论