skynet我的一种lua代码组织方式

请注意本文讨论的是Lua代码的目录组织而非C代码

之前参与的几个项目都是直接以origin/skynet作为工程根目录。但当在创建新工程时,我开始思考工程目录结构的问题。

此前,为了更加方便,我给debug_console的性能参数增加排序功能

但我不想直接修改原有代码,也不希望在内网维护修改后的skynet分支。

基于搜索优先级,加载lua代码

假设此时我有另外一份debug_console代码放在./app/service/debug_console.lua。根据启动config和https://github.com/cloudwu/skynet/blob/master/lualib/loader.lua#L11,只需将./app/serviceluaservice选项中靠前定义,即可优先加载./app/service/debug_console.lua而不是skynet/service/debug_console.lua

更进一步

  • 为了保持skynet原有的目录风格:
    • lualib存放纯Lua代码
    • service存放skynet service
    • luaclib存放动态库
  • skynet作为新项目的submodule
    ├── skynet
    │   ├── service
    │   ├── cservice
    │   └── lualib
    │   └── luaclib
    │   └── ...
    │
    ├── my_app
    │   ├── service
    │   ├── cservice
    │   └── lualib
    │   └── luaclib
    │   └── ...
    │
    ├── service
    ├── cservice
    └── lualib
    └── luaclib
    └── ...
    
  • skynet启动配置的解析实现使用了luaL_newstate(参见https://github.com/cloudwu/skynet/blob/master/skynet-src/skynet_main.c#L144-L157)。即启动配置可以包含Lua代码。不过assert(load(code,[[@]]..filename,[[t]],result))()\n\, result参数用于收集配置选项,占用env参数,导致_G缺失,无法使用辅助函数。如果你计划让启动配置设计得更为复杂,迫切需要用到辅助函数,给result再做一层元表索引到_G即可。
	setmetatable(result, { __index = { include = include } })\n\

修改后

	local meta = { include = include }\n\
	setmetatable(meta, {__index = _G})\n\

	setmetatable(result, { __index = meta})\n\

优先级加载示例

local function append_search_paths(root)
    luaservice = root.."/?.lua;" ..
                 root.."/service/?.lua;" ..
                 (luaservice or "")

    lua_path = root .. "/?.lua;" ..
               root.."/lualib/?.lua;"..
               (lua_path or "")

    lua_cpath = root .. "/luaclib/?.so;" ..
                (lua_cpath or "")

    cpath = root.."/cservice/?.so;" ..
            (cpath or "")

end

local root_list = {"./", "./my_app", "./skynet"}
for i = 1, #root_list, 1 do
    local root = root_list[i]
    append_search_paths(root)
end

thread = 8
logger = nil
logpath = "."
harbor = 0
start = "main"	-- main script
bootstrap = "snlua bootstrap"	-- The service for bootstrap

原文:
https://lizijie.github.io/2026/03/21/skynet%E6%88%91%E7%9A%84%E4%B8%80%E7%A7%8Dlua%E4%BB%A3%E7%A0%81%E7%BB%84%E7%BB%87%E6%96%B9%E5%BC%8F.html

作者github:
https://github.com/lizijie </b>

PREVIOUS杂谈
NEXTskynet定制加载loader