2013-03-15 78 views
6

我使用xdg-menu-to-awesome-wmgenerate a Lua file包含真棒WM的GNOME菜單,爲inclusion。由於發電機腳本可能無法安裝,我只需要requiremenu模塊某種方式爲lua如果存在如何檢查Lua中是否存在模塊?

我不想去翻翻文件名,因爲它可以在package.path在任何地方。一種選擇是忽略當模塊不存在創建例外,但我寧願不要忽略任何其他例外 - 我想知道,如果模塊包含任何語法或其他錯誤。 reference不幸的是沒有指定可以生成哪些異常,所以我不知道該怎麼做。

+0

今天剛剛有這個問題,在很多人的答案部分似乎怎麼也沒意識到,不被人發現的模塊是不一樣的事情模塊存在,但有語法錯誤,或者那種震驚(但更糟)需要它們自己的模塊本身不存在或者有語法錯誤。 finnw的回答正是我所需要的 – Thomas 2015-11-12 08:52:43

回答

10

,您可以直接訪問搜索功能在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 
+0

'if isModuleAvailable(「menu」)然後require(「menu」)end'的測試結果:如果'menu'包含語法錯誤,則崩潰,如果丟失或正確,則成功。謝謝! – l0b0 2013-03-16 11:55:20

5

我做的是包裹在一個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') 
+1

這看起來不錯;將盡快嘗試。 Nit:這只是我,還是縮進不一致? – l0b0 2013-03-15 11:54:43

+2

爲什麼當你可以做'res = pcall(require,module)'時創建一個本地內部函數? – 2013-03-15 14:02:23

+0

10b0 - 主要是因爲我輸入了一些並粘貼其餘的。邁克說實話我不記得,我想我從一些插件中的幾個地方打電話給它。 – 2013-03-15 17:13:57

4

你看,我有 '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用於知道模塊是否真正加載而不傳播錯誤。

相關問題