我想做的是在处理 lua 文件时执行“热重载”。
我的问题是我不知道如何将更改的文件与 package.loaded
表中的条目进行匹配。虽然我可以猜到,但我想知道完整路径是否存储在任何地方。
给定一个名为 mymodule.lua
的文件,当我们运行此命令时:
local x = require('mymodule')
首先 lua 查看package.loaded
以查看它是否已经加载。如果没有,那么 Lua 使用 LUA_PATH
查找模块,我们可以在运行时看到它,如下所示:
> print(package.path)
/usr/share/lua/5.3/?.lua;/usr/share/lua/5.3/?/init.lua;/usr/lib64/lua/5.3/?.lua;/usr/lib64/lua/5.3/?/init.lua;./?.lua;./?/init.lua
上述模块加载后,我们可以通过在package.loaded
表中查找来看到它已加载,如下所示:
> for i,v in pairs(package.loaded) do
>> print(i, v)
>> end
debug table: 0x55fa3bfe8b80
table table: 0x55fa3bfe51e0
math table: 0x55fa3bfe7820
mymodule table: 0x55fa3bfe60f0
_G table: 0x55fa3bfe2bc0
utf8 table: 0x55fa3bfe8700
bit32 table: 0x55fa3bfe9070
os table: 0x55fa3bfe68f0
package table: 0x55fa3bfe4860
io table: 0x55fa3bfe54e0
coroutine table: 0x55fa3bfe4f90
string table: 0x55fa3bfe7560
我处理热重载的方法是清空此表中的条目package.loaded.mymodule = nil
,然后再次重新加载脚本,如下所示
require('mymodule')
这似乎工作正常 - 模块已重新加载。
但是还有一些警告......例如,如果模块实际上设置为 myproject/mymodule/init.lua
,并且它的加载方式如下 require('mymodule' )
那么 package.loaded 表中的条目将只是 mymodule
而不是在这种情况下更有帮助的东西,例如 mymodule/init.lua
我没有知道我需要观看的是 init.lua
文件而不是 mymodule.lua
在 m 情况下,我跟踪 C 中的文件。我的挑战是我必须以某种方式猜测 package.loaded
表中的哪个条目与哪个文件对应。
我想知道的是是否有一个表包含加载的任何 .lua 文件的路径,以便我可以监视该列表。
也许package.loaded
是错误的地方?
最佳答案
可以修改两个搜索器来将模块文件路径收集到表package.loadedfrom
-- this block should be at the beginning of the main script
do
assert(_VERSION:match"^Lua 5%.[2-4]$") -- only for Lua 5.2+
package.loadedfrom = {}
local function save(modname, loader, path)
if type(loader) == "function" then
package.loadedfrom[modname] = path
end
return loader, path
end
local orig_searcher_2 = package.searchers[2]
package.searchers[2] =
function(modname)
return save(modname, orig_searcher_2(modname))
end
local orig_searcher_3 = package.searchers[3]
package.searchers[3] =
function(modname)
return save(modname, orig_searcher_3(modname))
end
end
-- now require all your modules
require"mymodule"
require"mymodule2"
-- now get the list of module file paths
for modname, filepath in pairs(package.loadedfrom) do
print(modname, filepath)
end
关于lua - 如何获取Lua中加载的脚本的确切路径?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60283272/