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/service在luaservice选项中靠前定义,即可优先加载./app/service/debug_console.lua而不是skynet/service/debug_console.lua
更进一步
- 为了保持skynet原有的目录风格:
lualib存放纯Lua代码service存放skynet serviceluaclib存放动态库
- 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
作者github:
https://github.com/lizijie
</b>
PREVIOUS杂谈
NEXTskynet定制加载loader