Lua require 相對路徑
阿新 • • 發佈:2019-01-27
Lua中的路徑系統和我們熟知的路徑系統是不一樣的。
當我們隨便的輸入一個不存在檔案的名,如下面的程式碼一樣
require("lib.lua")
就會出現以下的報錯的資訊
no field package.preload['lib.lua']
no file 'D:\Lua\LuaProject\my_first_Lua\src\lib\lua.lua'
no file 'D:\Lua\LuaProject\my_first_Lua\src\lib\lua\init.lua'
no file 'D:\Lua\LuaProject\my_first_Lua\src \lib\lua.luac'
no file 'D:\Lua\LuaProject\my_first_Lua\src\lib\lua\init.luac'
no file '.\lib\lua.lua'
no file 'C:\Program Files\Java\jre1.8.0_66\bin\lua\lib\lua.lua'
no file 'C:\Program Files\Java\jre1.8.0_66\bin\lua\lib\lua\init.lua'
no file 'C:\Program Files\Java\jre1.8.0_66\bin\lib \lua.lua'
no file 'C:\Program Files\Java\jre1.8.0_66\bin\lib\lua\init.lua'
no file 'D:\Lua\5.1\lua\lib\lua.luac'
no file '.\lib\lua.lua'
no file 'C:\Program Files\Java\jre1.8.0_66\bin\lua\lib\lua.lua'
no file 'C:\Program Files\Java\jre1.8.0_66\bin\lua\lib\lua\init.lua'
no file 'C:\Program Files\Java\jre1.8.0_66\bin\lib\lua.lua'
no file 'C:\Program Files\Java\jre1.8.0_66\bin\lib\lua\init.lua'
no file 'D:\Lua\LuaForWindow\5.1\lua\lib\lua.luac'
no file '.\lib\lua.dll'
no file '.\lib\lua51.dll'
no file 'C:\Program Files\Java\jre1.8.0_66\bin\lib\lua.dll'
no file 'C:\Program Files\Java\jre1.8.0_66\bin\lib\lua51.dll'
no file 'C:\Program Files\Java\jre1.8.0_66\bin\clibs\lib\lua.dll'
no file 'C:\Program Files\Java\jre1.8.0_66\bin\clibs\lib\lua51.dll'
no file 'C:\Program Files\Java\jre1.8.0_66\bin\loadall.dll'
no file 'C:\Program Files\Java\jre1.8.0_66\bin\clibs\loadall.dll'
no file '.\lib.dll'
no file '.\lib51.dll'
no file 'C:\Program Files\Java\jre1.8.0_66\bin\lib.dll'
no file 'C:\Program Files\Java\jre1.8.0_66\bin\lib51.dll'
no file 'C:\Program Files\Java\jre1.8.0_66\bin\clibs\lib.dll'
no file 'C:\Program Files\Java\jre1.8.0_66\bin\clibs\lib51.dll'
no file 'C:\Program Files\Java\jre1.8.0_66\bin\loadall.dll'
no file 'C:\Program Files\Java\jre1.8.0_66\bin\clibs\loadall.dll'
那麼為什麼lua require方法搜尋一個模組或者檔案的流程會依次搜尋檔名為lib.lua的檔案或者dll?這是因為lua的模組路徑是存在一個全域性table package的path和cpath欄位裡的:
print(package.path);
print(package.cpath);
執行上面的程式碼,我們將會得到下面的結果。
D:\Lua\LuaProject\my_first_Lua\src\?.lua;
D:\Lua\LuaProject\my_first_Lua\src\?\init.lua;
D:\Lua\LuaProject\my_first_Lua\src\?.luac
;
D:\Lua\LuaProject\my_first_Lua\src\?\init.luac;.\?.lua;
C:\Program Files\Java\jre1.8.0_66\bin\lua\?.lua;C:\Program Files\Java\jre1.8.0_66\bin\lua\?\init.lua;C:\Program Files\Java\jre1.8.0_66\bin\?.lua;
C:\Program Files\Java\jre1.8.0_66\bin\?\init.lua;;D:\Lua\5.1\lua\?.luac;.\?.lua;
C:\Program Files\Java\jre1.8.0_66\bin\lua\?.lua;
C:\Program Files\Java\jre1.8.0_66\bin\lua\?\init.lua;
C:\Program Files\Java\jre1.8.0_66\bin\?.lua;
C:\Program Files\Java\jre1.8.0_66\bin\?\init.lua;;
D:\Lua\LuaForWindow\5.1\lua\?.luac
.\?.dll;.\?51.dll;
C:\Program Files\Java\jre1.8.0_66\bin\?.dll;
C:\Program Files\Java\jre1.8.0_66\bin\?51.dll;
C:\Program Files\Java\jre1.8.0_66\bin\clibs\?.dll;
C:\Program Files\Java\jre1.8.0_66\bin\clibs\?51.dll;
C:\Program Files\Java\jre1.8.0_66\bin\loadall.dll;
C:\Program Files\Java\jre1.8.0_66\bin\clibs\loadall.dll
我們會發現一個問題,就是很多路徑中含有“?”,這是因為當require的時候lua直譯器會按照path 和cpath裡儲存的路徑替換“?”去查詢是否存在該檔案,有則載入指令碼或者模組亦或是C庫。
如果我要載入一個檔案
在這工程中,我是讓Demo1載入lib檔案的。
我們需要
package.path = package.path ..';..\\?.lua';
require("Lua2.lib");
完整的專案是:
Demo1.lua中的程式碼是
package.path = package.path ..';..\\?.lua';
require("Lua2.lib");
n = norm(3,4)
print(twice(n))
lib.lua中的程式碼是
function norm(x,y)
local n2 = x^2 + y^2
return math.sqrt(n2)
end
function twice(x)
return 3 * x
end
如有瑕疵,多多指教。本人QQ:763496668