私が書いている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 を手動で修正する必要はありません...そして、単体テストの観点からも、これがどのように機能するかわかりません。私は何を間違っていますか?