skynetda icon indicating copy to clipboard operation
skynetda copied to clipboard

建议: 不要侵入式修改 skynet

Open samuelyao314 opened this issue 4 years ago • 14 comments

skynetda , 这个项目很棒。不过提个建议。 colinsusie/skynet 这样侵入修改,如果有不少用户使用后。其他有用户发现 colinsusie/skynet 不能随时跟上 skynet 的 master 分支。这样到时候,就会很尴尬。如果必须用上 skynet 新特性,那就只能选择放弃 skynetda 这个工具了。

samuelyao314 avatar Mar 04 '20 13:03 samuelyao314

你可以对比一下colinsusie/skynet,其实并没有修改skynet的代码,只是在外部增加了3个Lua服务,唯一增加的就是在skynet.lua的注入debug框架。

你也可以这样做:把colinsusie/skynet变化的部分合并到你们的工程中去。

colinsusie avatar Mar 06 '20 03:03 colinsusie

是啊。 但你这样改,大家不知道要不要 clone 你这个项目。如果clone , 如果你没有及时更新。 如果需要用到最新的特性,就没法用。如果不clone, 合并工程,每一次你这边修改,合并都需要手动进行,效率也很低啊。

samuelyao314 avatar Mar 06 '20 09:03 samuelyao314

还有,我简单看了一下,你重载了 skynet.start 这个函数。 其实你完全可以在 preload 里进行替换

samuelyao314 avatar Mar 06 '20 09:03 samuelyao314

你可以参考下,我的项目目录 https://github.com/samuelyao314/terminator

samuelyao314 avatar Mar 06 '20 09:03 samuelyao314

在preload增加预加载脚本确实可以在重载skynet.start,但是没有办法重载skynet.lua里面的局部函数,你看看skynet.lua的注入代码:

-- vscode debug
local vscdebug = require "skynet.vscdebug"
vscdebug.init(skynet, {
	suspend = suspend,
	resume = coroutine_resume,
})

它需要suspend和coroutine_resume这两个局部函数,所以只能像skynet自带的debug.lua那样,注入到skynet.lua。

看一下skynet.lua就明白了。

colinsusie avatar Mar 09 '20 04:03 colinsusie

我预计skynet应该不会有大的修改了,像这两天的小BUG提交,我都有merge过来的。 另外这个调试功能需求是比较明确的,只会修改小BUG,所以。。。

colinsusie avatar Mar 09 '20 04:03 colinsusie

@colinsusie 我的目录结构 调试无响应 但是 直接在 skynet 目录下是可以的 请问两者会有区别?

  -- framework
      -- skynet
{
    "version": "0.2.0",
    "configurations": [
        {
            "name": "skynet_debugger",
            "type": "lua",
            "request": "launch",
            "program": "${workspaceFolder}/framework/skynet",
            "config": "./examples/config_vsc"
        }
    ]
}

cloudfreexiao avatar Mar 26 '21 03:03 cloudfreexiao

你试试将下面这两个换成绝对路径看看行不行:

"program": "${workspaceFolder}/framework/skynet", "config": "./examples/config_vsc"

colinsusie avatar Mar 26 '21 03:03 colinsusie

奇怪了,我按你的路径配置是可以启动调试的 "program": "${workspaceFolder}/framework/skynet", "config": "./examples/config_vsc"

请问你用VSCode打开的根目录是什么,我的根目录是: /home/colin/myproj

目录结构是:

myproj/
    framework/
        skynet/
    test.lua

不能调试很大可能是${workspaceFolder}这个指向不对。

colinsusie avatar Mar 26 '21 04:03 colinsusie

启动调试 debug.log 显示

workdir: /Users/cloudfreexiao/Documents/Github/zeus/framework/skynet

尝试用 命令行运行

./framework/skynet/skynet ./framework/skynet/examples/config_vsc 

错误日志

[skynet config]:2: os.getenv() failed: vscdbg_open

我没有把 cjson 集成进来所以改了下 配置具体见 https://github.com/cloudfreexiao/skynet/commit/8d89318c86483bc50f7c608751e1c89d78c044db

  -- framework
      -- skynet
     -- luaclib --这里存cjson
root = "./"
thread = 4
logger = "vscdebuglog"
logservice = "snlua"

logpath = "."
harbor = 0
start = "testvscdebug"	-- main script
bootstrap = "snlua bootstrap"	-- The service for bootstrap

luaservice = root.."service/?.lua;"..root.."test/?.lua;"..root.."examples/?.lua;"..root.."test/?/init.lua"
lualoader = root .. "lualib/loader.lua"
lua_path = root.."lualib/?.lua;"..root.."lualib/?/init.lua"
lua_cpath = root.."../luaclib/?.lua;" .. root .. "luaclib/?.so"
snax = root.."examples/?.lua;"..root.."test/?.lua"
cpath = root.."cservice/?.so"

vscdbg_open = "$vscdbg_open"
vscdbg_bps = [=[$vscdbg_bps]=]

不知道 是否有影响

cloudfreexiao avatar Mar 26 '21 06:03 cloudfreexiao

config_vsc 这份配置是专门用在VSCode调试用的,不能用命令行跑config_vsc,因为这两个变量:

vscdbg_open = "$vscdbg_open"
vscdbg_bps = [=[$vscdbg_bps]=]

是vscode传给skynet 的,你用命令行就没有这两个变量,所以会启动失败。你必须用vscode的F5启动skynet。

调试和正式环境应该使用两份config,不要共用一份。正式环境中不要有vscdbg_open, vscdbg_openlogger这些,具体参考skynet其他的config写法。

colinsusie avatar Mar 26 '21 07:03 colinsusie

或者你直接fork我这边的看看能不能F5调试,再看看和官方的skynet的有哪些差异?

colinsusie avatar Mar 26 '21 07:03 colinsusie

我试试了下 你的仓库 是可以的 排查了下 是我的问题 sorry

lua_cpath = root.."../luaclib/?.lua;" .. root .. "luaclib/?.so" 应该是 .so

cloudfreexiao avatar Mar 26 '21 07:03 cloudfreexiao

你的系统里有cjson是吧?有可能是cjson的版本问题。

colinsusie avatar Mar 26 '21 07:03 colinsusie