1. 程式人生 > >lua module/package 機制的自定義讀取

lua module/package 機制的自定義讀取

lua5.2後, 官方建議大家放棄module/package機制, 這套機制對於使用者來說是方便的, 對於module的編寫者簡直要抓狂, 所有module後的函式對_G均不可見, 還要一個個手動在module前轉成local呼叫. 相當反人類. 官方建議大家手動實現package機制. 本部落格之前有實現過, 參考http://www.cppblog.com/sunicdavy/archive/2013/12/10/204696.html

由於要使用protoc-gen-lua, 這東西生成出來的lua依然使用官方的module/package機制. 對於遊戲專案來說, 想進行一些自定義讀取, 加密等, 就變得不可能. 幸好官方在擴充套件上支援的還是不錯的.

require時, lua會自動根據一定的搜尋規律找到載入程式碼的方法. 這個方法定義在package.searchers這個陣列中. 一共有4個載入搜尋順序

1. preload, 對已載入的module進行直接返回, 對應package.preload[modname]

2. lualoader, 對lua檔案進行載入, 搜尋路徑為package.path

3. cloader, 對lua標準dll進行載入, 搜尋路徑為package.cpath

4. croot, 官方文件說的是all-in-one載入器, 感覺很神奇, 感興趣可以自行參考原始碼

那麼, 如果只需要自己的載入器, 只需要這樣做:

  package.searchers[2] = function( name )
        print("try to load", name )
    end
    package.searchers[3] = nil
    package.searchers[4] = nil
    
    require "libtest"
    只保留preload功能, 然後將第二個載入器換成自己的載入函式, 第三,第四直接遮蔽