文件查找规则

service

luaservice 约束服务只能放在 server根目录 || server->service || common->service || skynet_fly->service || skynet->service

cpath

file_util.path_join(skynet_fly_path, '/cservice/?.so;') .. skynet_path .. "cservice/?.so;",

lua_cpath

file_util.path_join(skynet_fly_path, '/luaclib/?.so;') .. skynet_path .. "luaclib/?.so;"

lua_path

--创建 lua文件 查找规则,优先级 server下非service文件夹 > server上上级目录common文件夹非service文件夹 > skynet_fly lualib下所有文件夹 > skynet lualib下所有文件夹

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
function M.create_luapath(skynet_fly_path)
local server_path = './'
local skynet_path = M.path_join(skynet_fly_path, '/skynet')
local common_path = '../../common/'

--server下非service文件夹
local lua_path = server_path .. '?.lua;'
for file_name,file_path,file_info in M.diripairs(server_path) do
if file_info.mode == 'directory' and file_name ~= 'service' then
lua_path = lua_path .. file_path .. '/?.lua;'
end
end

--server上上级目录common所有文件夹
lua_path = lua_path .. common_path .. '?.lua;'
for file_name,file_path,file_info in M.diripairs(common_path) do
if file_info.mode == 'directory' and file_name ~= 'service' then
lua_path = lua_path .. file_path .. '/?.lua;'
end
end

--skynet_fly lualib下所有文件夹
lua_path = lua_path .. M.path_join(skynet_fly_path, '/lualib/?.lua;')
for file_name,file_path,file_info in M.diripairs(M.path_join(skynet_fly_path, '/lualib')) do
if file_info.mode == 'directory' then
lua_path = lua_path .. file_path .. '/?.lua;'
end
end

--skynet_fly 3rd下所有文件夹
lua_path = lua_path .. M.path_join(skynet_fly_path, '/3rd/?.lua;')
for file_name,file_path,file_info in M.diripairs(M.path_join(skynet_fly_path, '/3rd')) do
if file_info.mode == 'directory' then
lua_path = lua_path .. file_path .. '/?.lua;'
end
end

--skynet lualib下所有文件夹
lua_path = lua_path .. skynet_path .. '/lualib/?.lua;'
for file_name,file_path,file_info in M.diripairs(skynet_path .. '/lualib') do
if file_info.mode == 'directory' then
lua_path = lua_path .. file_path .. '/?.lua;'
end
end

return lua_path
end

看到这里,基本上skynet_fly的核心实现已经看了一半了,现在你绝对可以使用skynet_fly编写一些独立工作的服务单元。

版本更新[2024.03.04]

github tag

修改原因

由于有使用者发现skynet_fly在wsl上启动服务很慢,差不多一秒启动一个服务,而skynet提供的示例还是非常快的,因为wsl访问window文件,因为需要兼容文件系统,所以比访问linux文件要慢很多。起初我怀疑是因为读取文件导致,因为skynet_flyskynet文件相关的差异就是关闭了代码缓存(skynet.codecache “OFF”),每个新启动的服务都需要去完整的读取文件,当我尝试去除这个差异再重启服务时,问题依旧没有改善。后面怀疑到lua_path上面,因为按照之前我对lua-path的处理,查找路径可能有几十个,路径多加上路径下的文件多,而require的加载过程会从头到尾,逐个路径查找,直到找到为止,由于我把skynet的库优先级排在最低,所以查找过程几乎都跑完了o(n)的时间复杂度。之后我参数把冗余的3rd中的路径去除一些,再次启动服务,发现速度快不少,从而确定问题。

解决方案

在实际开发服务中,一般需要require加载本服库公共库skynet_fly库skynet库。我们只需要把这4个库的根目录写入lua_path,require文件依赖是使用
本服库.aaa.bbb.ccc的风格引入即可,这样做,不行加载速度快,也更好查找文件的来源。

修改后的luapath 优先级是这样的

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
function M.create_luapath(skynet_fly_path)
local server_path = './'
local skynet_path = M.path_join(skynet_fly_path, '/skynet')
local common_path = '../../commonlualib/'

--server文件夹
local lua_path = server_path .. '?.lua;'

--server 下 ./module文件夹
lua_path = lua_path .. server_path .. 'module/?.lua;'

--server上上级目录commonlualib文件夹
lua_path = lua_path .. common_path .. '?.lua;'

--server上上级目录commonlualib/module文件夹
lua_path = lua_path .. common_path .. '/module/?.lua;'

--skynet_fly lualib文件夹
lua_path = lua_path .. M.path_join(skynet_fly_path, '/lualib/?.lua;')

--skyent_fly module文件夹
lua_path = lua_path .. M.path_join(skynet_fly_path, '/module/?.lua;')

--skynet lualib文件夹
lua_path = lua_path .. skynet_path .. '/lualib/?.lua;'

return lua_path
end

风格

  • 本服库
    require("enum.code")

  • 公共库
    根节点下面创建一个common目录
    require("common.enum.code")

  • skynet_fly库
    require("skynet-fly.enum.code")

  • skynet库
    require("skynet.enum.code")
    由于改成这种风格需要调整到skynet源码,暂时不改动,目前仅把skynet.lualib加上lua_path中,所有加载skynet与加载本地库的风格是一致的。

server文件夹是指?

是指我们启动服务的根目录。
比如我们启动示例中的 webapp,就需要cd到webapp的根目录然后启动。


文件查找规则
https://huahua132.github.io/2023/02/25/skynet_fly_word/word_1/I_file/
作者
huahua132
发布于
2023年2月25日
许可协议