1. 程式人生 > >lua require 搜尋路徑

lua require 搜尋路徑

lua引用第三方庫時,設定搜尋路徑  

package.path = '/usr/local/share/lua/5.1/?.lua;/home/resty/?/init.lua;'    --搜尋lua模組

package.cpath = '/usr/local/lib/lua/5.1/?.so;'                                     --搜尋so模組

也可通過設定 LUA_PATH和 LUA_CPATH 兩個變數來確定搜尋路徑 export LUA_PATH=”/usr/local/share/lua/5.1/?.lua;/home/resty/?/init.lua;“

require說明:

1、lua庫若是沒有顯式的返回任何值(末尾沒有return),則預設是返回true

local rr = require “noreturn” -- rr 等於 true

2、模組名中有點.時,在搜尋時,替換為斜槓/

package.path = '/home/resty/?/init.lua;'

local rr = require “level1.level2” -- 搜尋/home/resty/level1/level2/init.lua

3、庫返回的值會被放在package.loaded[modname]中

package.path = '/home/resty/?/init.lua;'

local rr = require “level1.level2” -- package.loaded[“level1.level2”

] 等於庫返回值

4、對於C庫,若是模組名含點和橫槓,則庫內的載入器(luaopen_*函式)名字構成:luaopen_ 

加上  去掉第一個橫槓“-”前的字首並且所有的點都替換為下劃線的模組名

package.cpath = '/home/resty/?/init.so;'

local rr = require “level1.level2-a.b.c” -- luaopen_*函式便是 luaopen_a_b_c

5、若package.path 和package.cpath均未找到要載入的庫,則啟用all-in-one模式,

只針對c庫,將會尋找以模組名的根名為名字的C庫

例: a.b.c 根名便是a

local rr = require “a.b.c” -- 會在a.so 中找載入器luaopen_a_b_c

例::

*/mod/ini.lua

return 199

--------------------------------------------------------

*/mod/aa.lua

local sy = {}
function sy.aa()
	print("aa")
end
print("once")
return sy

----------------------------------------------------------

*/test/testit.lua

package.path="../?.lua;../?/ini.lua"
local rr = require "mod"
local tt = require "mod.aa"
print(mod)  -- nil
print(rr) -- 199


tt.aa() -- aa


print(package.loaded['mod.aa']) -- table address
print(package.loaded["mod"]) -- 199
print(package.loaded["math"]) -- table address



----------------------------------------------------------

run result:

once
nil
199 -- 沒有返回值則為true
aa
table: 0x828e260
199 -- 沒有返回值則為true
table: 0x8290f68