我正在使用xdg-menu-to-awesome-wm生成一个包含 GNOME 菜单的 Lua 文件,以包含在 Awesome WM 中。由于可能没有安装生成器脚本,我需要一些方法让 Lua 仅require
在menu
模块存在的情况下使用它。
我不想查看文件名,因为它可能位于package.path
. 一种选择是忽略模块不存在时创建的异常,但我宁愿不忽略任何其他异常 - 我确实想知道模块是否包含任何语法或其他错误。不幸的是,该参考没有指定可以生成哪些异常,所以我不知道该怎么做。
我正在使用xdg-menu-to-awesome-wm生成一个包含 GNOME 菜单的 Lua 文件,以包含在 Awesome WM 中。由于可能没有安装生成器脚本,我需要一些方法让 Lua 仅require
在menu
模块存在的情况下使用它。
我不想查看文件名,因为它可能位于package.path
. 一种选择是忽略模块不存在时创建的异常,但我宁愿不忽略任何其他异常 - 我确实想知道模块是否包含任何语法或其他错误。不幸的是,该参考没有指定可以生成哪些异常,所以我不知道该怎么做。
如果需要区分缺失模块和语法错误,可以直接访问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
看,我对“luafilesystem”模块有同样的问题,我是这样解决的,
local haslfs,lfs = pcall(require,"lfs")
if haslfs then
configLines["PROJECT_HOME"] = lfs.currentdir()
else
configLines["PROJECT_HOME"] = prompt("Project path > ")
end
'lfs' 这里是模块句柄。并且 pcall 用于知道模块是否真的被加载而不传播错误。
我所做的是将 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')