tl;dr:カスタム ディレクトリ名パターンを使用して lua パッケージを作成したいのですが、検索パスに問題があります。
問題
Lightroom と同様のモデルに従って、ユーザーがプラグインを作成できるようにしたいアプリケーションがあります。
- プラグインのデフォルトのセットは次の場所に保存されています
<app data>/plugins/<name>.myplugin
<name>.myplugin
一連のスクリプト、バイナリ、またはその他のリソースを含むことができるディレクトリ バンドルです。- プラグインは、さまざまなスクリプトを介して、さまざまな機能をアプリにエクスポートできます
- エクスポートされた関数の名前は
info.lua
、アプリによって読み取られるファイルに一覧表示されます
私が取り組んでいる問題は、プラグインをパッケージ (モジュール + サブモジュール) または通常のスクリプトとしてラップする最善の方法です。プラグインにはサードパーティのモジュールが含まれている可能性があると思います。
Foo.myplugin/
info.lua - returns a table with plugin name, version info, list of exported functions, etc
Foo.lua - defines the main functions exported by this plugin, which calls other scripts:
UsefulFunctions.lua - used by Foo.lua
3rdparty/3rdparty.lua - 3rd party module
パッケージ検索パスを設定するpackage.path
と、含める
<appdata>/?.myplugin/?.lua
次に、でパッケージをロードできますFoo=require 'Foo'
。ただし、サブモジュールをロードする方法がわかりません。Foo.lua
を呼び出すと、UsefulFunctions=require 'UsefulFunctions'
lua の検索パスが を検索しようとするため、このロードは失敗しますUsefulFunctions.myplugin/UsefulFunctions.lua
。require 'Foo.UsefulFunctions'
同様の理由で、どちらでもロードできません。
いくつかのオプション:
- 1 つの回避策は、各プラグインのパスをパッケージ パスに明示的に追加することですが、2 つのプラグインにそれぞれ同じ名前のサブモジュールが含まれている場合に問題が発生します。
- 別のオプションは、モジュールを提供するのではなく、通常の lua スクリプトを使用するようにプラグインを作成することですが、これは、各プラグイン内で検索パスを設定する必要があることを意味します。
.myplugin
代替オプションは、パッケージ検索パスを簡素化するサフィックスを 失うことです。- このタイプの検索パスを明示的にサポートするように Lua にパッチを適用する
必要な機能を提供する方法はありますか?
現在、Lua 5.1 を使用しています。5.2 ではパッケージの検索パスをより細かく制御できることは知っていますが、現時点では 5.2 に更新するオプションはないと思います。luabind も使用していますが、これとは関係ないと思います。