如何检查Lua中是否存在模块?

l0b*_*0b0 7 lua

我正在使用xdg-menu-to-awesome-wm生成包含GNOME菜单的Lua文件,以包含在Awesome WM中.由于发电机脚本可能无法安装,我需要的Lua一些方法来只requiremenu模块,如果它存在.

我不想查看文件名,因为它可能在任何地方package.path.一种选择是忽略当模块不存在创建的例外,但我宁愿不忽略任何其他异常-我想知道,如果模块包含任何语法或其他错误.遗憾的是,引用没有指定可以生成哪些异常,所以我不知道该怎么做.

fin*_*nnw 13

如果需要区分缺少的模块和语法错误,可以直接访问搜索器函数package.searchers.

这些功能将:

  • 如果成功则返回加载程序函数
  • 如果找不到模块,则返回一个字符串
  • 如果存在语法错误,则抛出错误

所以你可以做的是模仿require搜索模块的方式,依次调用每个搜索器,直到其中一个返回一个函数.与之不同require,如果找不到模块,我们不需要抛出错误,即每个搜索器函数返回一个字符串.

function isModuleAvailable(name)
  if package.loaded[name] then
    return true
  else
    for _, searcher in ipairs(package.searchers or package.loaders) do
      local loader = searcher(name)
      if type(loader) == 'function' then
        package.preload[name] = loader
        return true
      end
    end
    return false
  end
end
Run Code Online (Sandbox Code Playgroud)


shu*_*uva 6

看,我对 'luafilesystem' 模块有同样的问题,我是这样解决的,

local haslfs,lfs = pcall(require,"lfs")
if haslfs then
  configLines["PROJECT_HOME"] = lfs.currentdir()
else
  configLines["PROJECT_HOME"] = prompt("Project path > ")
end
Run Code Online (Sandbox Code Playgroud)

'lfs' 这里是模块句柄。并且 pcall 用于知道模块是否真的被加载而不传播错误。


Jan*_*e T 5

我所做的是将require包装在pcall中,以便加载模块并且可以捕获加载失败.有一个功能齐全的功能,我用它从我们的服务器下载和安装缺少的模块:http://www.fhug.org.uk/wiki/doku.php?id = plugins:code_snippets: module_require_with_load

function loadrequire(module)
    local function requiref(module)
        require(module)
    end
    res = pcall(requiref,module)
    if not(res) then
        -- Do Stuff when no module
    end
end
loadrequire('menu')
Run Code Online (Sandbox Code Playgroud)

  • 当你可以做`res = pcall(require,module)`时,你为什么要创建一个本地内部函数? (2认同)