当前位置: 首页 > 知识库问答 >
问题:

Tarantool上热重新加载Lua应用程序时出现问题

宁卓
2023-03-14

我正在尝试热重新加载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

应用程序在docker容器中运行,该容器构建自Tarantool官方图像。假设我对“test”模块的代码进行了更改,比如,将带有print的行更改为“print(“?”)。重新加载模块的标准方法是进入容器上的tarantool控制台,并将nil分配给包。已加载['

tarantool> package.loaded['test']
---
- null
...

我到底做错了什么?


共有1个答案

袁枫涟
2023-03-14

您可能会看到package.loaded['test']==nil,因为您没有连接到Tarantool实例。

通常当你连接到塔兰托时,你看起来像

connected to localhost:3301
localhost:3301> 

似乎您只需进入docker容器,然后运行"tarantool"。这样,您只需运行对您的应用程序一无所知的新Tarantool实例。

您可以使用console命令(位于容器中)或tarantoolctl-connect登录名连接到tarantool实例:password@host:port(对于默认配置tarantoolctl connect 3301工作,有关详细信息,请参见此处)或附加,然后检查package.loaded['test']值。

以下是重新加载模块代码的简化方法:

test2 = require("test")

local function reload()
    package.loaded['test'] = nil -- clean module cache
    test2 = require('test') -- update a reference to test2 with new code
end

while 1 > 0 do
    test2.p()
end

return {
   reload = reload,  -- require('app').reload() in your console for reload
}

更复杂但正确的方法是使用包重新加载模块。

以下是您的代码无法工作的原因:

-- Here you require "test" module
-- Lua check package.loaded['test'] value
-- and if it's nil then physically load file
-- from disk (see dofile function).
--
-- Well, you got a reference to table with
-- your "p" function.
test2 = require("test")

-- Here you've already has a reference
-- to "test" module.
-- It's static, you don't touch it here.
while 1 > 0 do
    test2.p()
end

然后执行package.loaded['test']=nil,并从package.loaded表中删除一个键。注意,您不会删除值,因为您的“app.lua”文件中有一个引用(在您的例子中是test2)。

 类似资料:
  • 问题内容: 我有一个加载DLL来执行处理的特定部分的应用程序 Process.dll 使用反射 在运行时动态加载 ,并且未在应用程序中引用。 处理完成后,需要在服务器上重新编译DLL,然后稍后再次加载。 为此,我需要释放它,否则会收到以下消息:“无法将文件“ Process.dll”复制到“ Process.dll”。该进程无法访问文件“ Process.dll”,因为被另一个进程使用。” 因此,

  • 我试图在Docker中使用Create React App和Node js设置一个开发环境。但当我更改代码时,它不会重新加载更改 通常只使用卷就足够了,但我还添加了:CHOKIDAR\u USEPOLLING=true in ENV,正如create react app官方文档所说,我将代码移到了WSL,因为我在Windows 10上,但仍然是一样的。我用create react app创建了另一

  • 问题内容: 我需要为应用程序的某些部分向现有应用程序添加插件功能。我希望能够在运行时添加jar,并且应用程序应该能够从jar中加载类,而无需重新启动应用程序。到目前为止,一切都很好。我使用URLClassLoader在线找到了一些示例,并且运行良好。 我还希望能够在罐子的更新版本可用时重新加载相同的类。我再次发现了一些示例,据我所知,实现此目标的关键是我需要为每个新负载使用一个新的类加载器实例。

  • > //这是我的java代码,firebase部分仅在以下条件下工作正常(requestCode==102){br>//imageuri=data.getData(); imageuri;public static final int PICK\u IMAGE=1@重写受保护的void onCreate(Bundle savedInstanceState){super.onCreate(saved

  • 严重:加载应用程序信息时出现异常:file:/c:/users/administrateur/documents/netbeansprojects/gparc_v1.0/gparc-ear/target/gfdeploy/gparc-ear/gparc-ejb-1.0_jar/_gparc-ejbpu注销成功信息:[7]已删除ID为98894641828724736的计时器 严重:加载应用程序时出

  • 我创建了一个反应应用程序使用创建-反应-应用程序样板,这似乎是非常受欢迎的,热重载一些时候更新时,任何文件的变化,有些时候没有,似乎有一个最小的持续时间或类似的东西,我使用Ubuntu,节点版本7.0,package.json的脚本是我缺少什么?