Tarantool 中应用程序热重载问题
2020-9-22 3:41:57
收藏:0
阅读:133
评论:1
我试图对一个 Lua 模块进行热重载,但标准的方法在我的情况下似乎无法正常工作。
我创建了两个简单的示例模块,'app.lua' 和 'test.lua',前者作为应用程序的入口点:
# app.lua
test2 = require("test")
while 1 > 0 do
test2.p()
end
并从后者加载一个函数:
# test.lua
local test = {}
function test.p()
print("!!!")
end
return test
这个应用程序在从官方 Tarantool 镜像构建的 docker 容器中运行。假设我已经对 'test' 模块的代码进行了更改,例如将带有 print 的行更改为 'print("???")'。重新加载模块的标准方法是在容器上输入 Tarantool 控制台,并将 nil 分配给 package.loaded['<name_module>']。但是,当我输入时,控制台会显示它已经为空:
tarantool> package.loaded['test']
---
- null
...
我在这里做错了什么?
点赞
评论区的留言会收到邮件通知哦~
推荐文章
- Lua 虚拟机加密load(string.dump(function)) 后执行失败问题如何解决
- 我想创建一个 Nginx 规则,禁止访问
- 如何将两个不同的lua文件合成一个 东西有点长 大佬请耐心看完 我是小白研究几天了都没搞定
- 如何在roblox studio中1:1导入真实世界的地形?
- 求解,lua_resume的第二次调用继续执行协程问题。
- 【上海普陀区】内向猫网络招募【Skynet游戏框架Lua后端程序员】
- SF爱好求教:如何用lua实现游戏内调用数据库函数实现账号密码注册?
- Lua实现网站后台开发
- LUA错误显式返回,社区常见的规约是怎么样的
- lua5.3下载库失败
- 请问如何实现文本框内容和某个网页搜索框内容连接,并把网页输出来的结果反馈到另外一个文本框上
- lua lanes多线程使用
- 一个kv数据库
- openresty 有没有比较轻量的 docker 镜像
- 想问一下,有大佬用过luacurl吗
- 在Lua执行过程中使用Load函数出现问题
- 为什么 neovim 里没有显示一些特殊字符?
- Lua比较两个表的值(不考虑键的顺序)
- 有个lua简单的项目,外包,有意者加微信 liuheng600456详谈,最好在成都
- 如何在 Visual Studio 2022 中运行 Lua 代码?

你可能会看到
package.loaded['test'] == nil,因为你没有连接到 Tarantool 实例。通常当你连接到 Tarantool 时,会看到以下提示:
connected to localhost:3301 localhost:3301>看起来你只是输入了 Docker 容器,然后运行了 "tarantool"。这种方式只是运行了一个新的 Tarantool 实例,对你的应用程序一无所知。
你可以使用
console命令(在容器中直接)或tarantoolctl connect login:password@host:port(对于默认配置,tarantoolctl connect 3301可行,有关详细信息请参见此处),或者 attach 连接到 Tarantool 实例,然后检查package.loaded['test']的值。这里有一种简化的方法来重载你模块的代码:
test2 = require("test") local function reload() package.loaded['test'] = nil -- 清理模块缓存 test2 = require('test') -- 用新代码更新 test2 的引用 end while 1 > 0 do test2.p() end return { reload = reload, -- 在你的控制台中使用 require('app').reload() 进行重载 }更复杂但更正规的方法是使用 package-reload 模块。
这里解释一下为什么你的代码没有起作用:
-- 这里你要求 "test" 模块 -- Lua 检查 package.loaded['test'] 的值 -- 如果它为 nil,就从硬盘上物理加载文件(参见 dofile 函数)。 -- -- 好吧,你得到了一个你的 "p" 函数的表引用。 test2 = require("test") -- 这里你已经有了 "test" 模块的引用。 -- 这是静态的,在这里你没有触摸它。 while 1 > 0 do test2.p() end然后你做了
package.loaded['test'] = nil,然后从package.loaded表中删除了一个键。请注意,你没有删除值,因为你在你的 "app.lua" 文件中有一个引用(在你的案例中是 test2)。