1

私が書いているLuaライブラリで内部依存関係を構造化して使用する方法を理解するのに苦労しています。

ライブラリを次のように定義しました。

./alib.lua
./alib/adependency.lua

そしてコード:

-- File: ./alib.lua
local ad = require "alib.adependency"
module( "alib")
return {}

-- File: ./alib/adependency.lua
module( "adependency" )
return {}

これはうまくいきます:

$ lua alib.lua
<no output>

次に、このライブラリを別のアプリに「追加」しましょう。

./anapp.lua
./lib/alib.lua
./lib/alib/adependency.lua

そして新しいコード:

-- File: ./anapp.lua
local alib = require "lib.alib"
local print = print
module( "anapp")
print "Hello"

実行してみてください:

$ lua anapp.lua
lua: ./lib/alib.lua:2: module 'alib.adependency' not found:
    no field package.preload['alib.adependency']
    no file './alib/adependency.lua'
    no file '/usr/local/share/lua/5.1/alib/adependency.lua'
    no file '/usr/local/share/lua/5.1/alib/adependency/init.lua'
    no file '/usr/local/lib/lua/5.1/alib/adependency.lua'
    no file '/usr/local/lib/lua/5.1/alib/adependency/init.lua'
    no file '/usr/share/lua/5.1/alib/adependency.lua'
    no file '/usr/share/lua/5.1/alib/adependency/init.lua'
    no file './alib/adependency.so'
    no file '/usr/local/lib/lua/5.1/alib/adependency.so'
    no file '/usr/lib/x86_64-linux-gnu/lua/5.1/alib/adependency.so'
    no file '/usr/lib/lua/5.1/alib/adependency.so'
    no file '/usr/local/lib/lua/5.1/loadall.so'
    no file './alib.so'
    no file '/usr/local/lib/lua/5.1/alib.so'
    no file '/usr/lib/x86_64-linux-gnu/lua/5.1/alib.so'
    no file '/usr/lib/lua/5.1/alib.so'
    no file '/usr/local/lib/lua/5.1/loadall.so'
stack traceback:
    [C]: in function 'require'
    ./lib/alib.lua:2: in main chunk
    [C]: in function 'require'
    anapp.lua:2: in main chunk
    [C]: ?

まあ。ここで、ライブラリ内で手動編集を行います。

-- File: ./lib/alib.lua
-- local ad = require "alib.adependency" -- Doesn't work
local ad = require "lib.alib.adependency" -- Works
module( "alib")
return {}

そしてそれは動作します:

$ lua anapp.lua
Hello

Lua は、が呼び出されるrequire()スクリプトではなく、Lua によって実行される最終的なスクリプトに関連するパスを関連付けているようです。require()

require()プロジェクトにライブラリを追加するたびに、Lua ライブラリ内の内部パス d を手動で修正する必要はありません...そして、単体テストの観点からも、これがどのように機能するかわかりません。私は何を間違っていますか?

4

1 に答える 1

2

最もクリーンな解決策は、ライブラリをそのままにして、ライブラリを使用している人にpackage.path正しく構成する責任を負わせることだと思います。セットアップでは、アプリケーションが lib フォルダーをパスに追加する必要があることを意味します。

package.path = './lib/?.lua;' .. package.path

Is there a better way to require file from relative path in luaや、パスの詳細についてはマニュアルなどの関連する質問も参照してください。

于 2013-04-13T15:31:36.923 に答える