lua require 加載方式與我們現在熟知的路徑系統不太一樣,想要知道lua require 方法的工作原理也很簡單 隨便寫一個錯誤的require 代碼即可:
1 require("lala");
這樣運行會得到一個報錯:
1 1>F:\Git\luatest\metaTest.lua:(56): module 'lala' not found: 2 no field package.preload['lala'] 3 no file '.\lala.lua' 4 no file 'D:\Program Files (x86)\LuaStudio\lua\lala.lua' 5 no file 'D:\Program Files (x86)\LuaStudio\lua\lala\init.lua' 6 no file 'D:\Program Files (x86)\LuaStudio\lala.lua' 7 no file 'D:\Program Files (x86)\LuaStudio\lala\init.lua' 8 no file 'C:\Program Files\Lua\5.1\lua\lala.luac' 9 no file 'F:\Git\luatest\lala.lua' 10 no file '.\lala.dll' 11 no file 'D:\Program Files (x86)\LuaStudio\lala.dll' 12 no file 'D:\Program Files (x86)\LuaStudio\loadall.dll' 13 Stack Traceback: 14 [C]: in function 'require' 15 F:\Git\luatest\metaTest.lua:56: in main chunk
這里可以很清晰的看見lua require方法搜索一個模塊或者文件的流程會依次搜索文件名為lala.lua的文件或者dll
那么這些帶有路徑的lala.lua文件怎么來的的?很簡單lua的模塊路徑是存在一個全局table package的path和cpath字段里的:
打印一下
1 print(package.path);
運行得到
1 ;.\?.lua; 2 D:\Program Files (x86)\LuaStudio\lua\?.lua; 3 D:\Program Files (x86)\LuaStudio\lua\?\init.lua 4 ;D:\Program Files (x86)\LuaStudio\?.lua; 5 D:\Program Files (x86)\LuaStudio\?\init.lua; 6 C:\Program Files\Lua\5.1\lua\?.luac; 7 F:\Git\luatest\?.lua
1 print(package.cpath);
.\?.dll; D:\Program Files (x86)\LuaStudio\?.dll; D:\Program Files (x86)\LuaStudio\loadall.dll
是不是很眼熟,是的當require的時候lua解釋器會按照path 和cpath里存儲的路徑替換“?”去查詢是否存在該文件,有則加載腳本或者模塊亦或是C庫。
了解了加載機制我們就可以很方便的去加載任何我們當前腳本依賴的外部模塊:
'require("requiretest.loader");'
但是又一個問題,當我們想要加載當前腳本的上級目錄或者其他目錄的怎么辦,這時候就需要自己去修改或者是添加相對路徑,由於require的查詢路徑都是
存儲在package.path中的這樣我們就可以自行添加:
1 package.path = package.path ..';..\\?.lua';
測試下:在目錄requiretest目錄下新建loader.lua,在根目錄下新建requiretest2目錄並新建loader2.lua:
loader.lua:
1 require("requiretest2.loader2");
loader2.lua:
1 print("requiretest2.loader2");
運行:
1 requiretest2.loader2
在項目實際運用時可以根據需求加入相對目錄。
些許淺薄認識 如有不妥之處望請斧正!!!!!