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

在項目實際運用時可以根據需求加入相對目錄。

 

 

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM