Lua require 相對路徑

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

在項目實際運用時能夠根據需求加入相對目錄。post

 

 

些許淺薄認識 若有不妥之處望請斧正!!!!!測試

相關文章
相關標籤/搜索