GMod 后端
GMod 不是普通 Lua 运行环境。一个插件同时涉及服务端 include、客户端文件分发、
autorun 顺序、AddCSLuaFile、lua/ 挂载命名冲突和 Workshop 打包。Lux 的
GMod 后端把这些规则从手写 loader 迁移到编译器构建计划里。
后端负责什么
luxc gmod build 会执行这些步骤:
- 递归发现
source_root下的.lux文件。 - 按目录和文件名前缀推断每个 part 的默认运行域。
- 把同一模块目录下的 part 合并成一个逻辑模块。
- 解析相对导入、包导入、导出映射和运行域可用性。
- 按客户端/服务端生成需要的模块产物。
- 编译依赖到的运行时包,例如
@lux/std、@lux/gmod,以及项目安装的外部包。 - 写出
.lua、.lua.map.json、Lux loader tree 和可选autorunforwarder。 - 可选地生成
gmad打包命令。
后端不会自动发布 Workshop,也不会在没有 --run 的情况下调用 gmad。
后端不会假设所有项目都必须拥有 lua/autorun。普通 init 默认生成 addon-friendly
配置;当已有 gamemode、框架或手写入口负责启动时,设置 autorun = false 即可。
最小配置
必要字段只有 source_root 和 out。其余字段建议在真实项目中显式写出:
package_id:项目模块 ID 前缀。bundle_id:生成私有注册表命名空间,省略时默认使用package_id。out:物理输出根,所有产物都写在这里下面。runtime_base:生成include/AddCSLuaFile使用的 GMod 相对路径。autorun:是否额外生成 addon 风格autorunforwarder。source_comments:源码注释模式。unknown_external:未知外部符号策略。
如果不写 package_id,编译器会从源码目录或其父目录推断。团队项目建议显式指定,
避免目录改名导致生成路径变化。
生成布局
以 package_id = "my_addon"、bundle_id = "my_addon" 为例:
autorun/my_addon.lua 只是薄入口。真正的模块注册、__lux_import、load order 和
客户端文件分发都在 runtime_base 下的 Lux loader tree 里。设置 autorun = false
只会关闭这个薄入口,不会关闭 Lux loader。
构建命令
使用配置文件:
查看计划但不写文件:
临时测试时也可以直接给路径:
构建输出会报告模块数量、产物数量和三个 loader 路径:
运行域产物
共享模块会在客户端和服务端都注册。客户端模块只进入客户端 loader,服务端模块只进入 服务端 loader。源码里可以混合运行域。
后端会把 server { ... } 的内容只发往服务端产物。共享部分仍然进入双方产物。
打包为 GMA
默认只打印打包命令计划,不执行:
确认无误后再加 --run:
开发建议
- 先让
out指向独立目录,确认生成内容后再复制到 live addon 或 gamemode 入口目录。 - 保留
.lua.map.json,GMod 报错时用map-error查回 Lux 源码。 - 迁移早期使用
unknown_external = "warn",整理完第三方 API 后在 CI 中改成error。 - 不要手写生成目录里的 loader;这些文件每次构建都会被覆盖。需要自有入口时设置
autorun = false,再从入口 include 生成的 loader。