8

Awesome WMに含めるために、 xdg-menu-to-awesome-wmを使用して GNOME メニューを含むLua ファイルを生成しています。ジェネレーター スクリプトがインストールされていない可能性があるため、Lua がモジュールが存在する場合はモジュールのみにする何らかの方法が必要です。requiremenu

のどこにでもある可能性があるため、ファイル名を調べたくありませんpackage.path。1 つのオプションは、モジュールが存在しないときに作成された例外を無視することですが、他の例外は無視したくありません。モジュールに構文やその他のエラーが含まれているかどうかを知りたいのです。残念ながら、参照にはどの例外を生成できるかが指定されていないため、その方法がわかりません。

4

3 に答える 3

14

モジュールの欠落と構文エラーを区別する必要がある場合は、 のサーチャー関数に直接アクセスできますpackage.searchers

これらの機能は次のとおりです。

  • 成功した場合はローダー関数を返します
  • モジュールが見つからない場合は文字列を返します
  • 構文エラーがある場合はエラーをスローします

したがってrequire、モジュールを検索する方法を模倣し、各サーチャーを順番に呼び出して、そのうちの 1 つが関数を返すようにすることができます。とは異なり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
于 2013-03-15T14:19:23.060 に答える
6

私がやっていることは、モジュールがロードされ、ロードの失敗をキャッチできるように、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')
于 2013-03-15T10:30:22.060 に答える