lua - 如何获取Lua中加载的脚本的确切路径?

标签 lua

我想做的是在处理 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/

相关文章:

database - 您可以读取 Redis Lua 脚本中未明确指定的键吗?

web-applications - 支持 Lua 的紧凑型 Web 服务器?

bash - 将包导入 Torch 时出错

c - 线程上的 Lua setfenv 似乎不起作用

android - Lua Service2Media 移动端

c++ - SWIG 生成的 Lua<-->C++ 包装器错误处理由 typedef 重命名的原始类型

c++ - 我可以像使用 Lua 一样使用 Ruby 编写 C++ 应用程序脚本吗?

linux - 编译 Lua - 创建 .so 文件?

lua - 使用 lua/openresty 验证 jwt token

java - LuaJ中lua模块和基于元表的类的组合