沒有想到我也做了一回標題黨。其實這里邊說的自動還是有誇大其詞的部分。其實只是指定文件夾,然后根據指定文件夾數據,加載目錄下邊的內容而已。
怎么來進行Lua文件的加載
一般情況下,相關的功能需要給他創建一個相關的目錄,然后直接通過我寫的一個組件指定這個目錄的加載位置就行了。不同的目錄之間需要明確他們的加載順序。
為什么要這么做?
- 加載的條理性。一般情況下,Lua文件會在需要的時候進行內存加載,這樣比較混亂。說比較混亂的原因是沒有明確的地方來控制加載的順序,所以文件加載的順序比較看臉。
- 加載內容的安全性。這里提到的安全性並不是說的什么高深的東西。而是這個東西究竟有沒有加載成功。如果使用了,我所說的加載方式進行加載,文件內容加載只要存在相關的文件夾中就會自動加載,一般不會漏下。
- 明確同一個文件夾下的文件加載順序。一般情況下init.lua會首先加載,然后加載其他文件。最后加載loadend.lua文件。在編寫軟件的時候可以根據這些文件的加加載順序來進行內容加載的順序控制。
- 實現位置的無關性。配合工廠模式,可以在完全不關心實現位置的情況下,實現相關功能。
- 文件位置的條理性。具體的實現位置可以在不記位置的情況下推理出他應該在什么地方實現。(個人覺得這個非常重要)
實際引用
總結
其實是一個非常簡單的功能,但是用處卻非常大。可能我不是很會總結這個東西。哈哈。總之分享一下吧
文件
-- local lfs = require("lfs") local AutoRequire = class("AutoRequire") local instance = nil function AutoRequire:getInstance() return instance end function AutoRequire:init(dir) instance.OriginalPath = dir or lfs.currentdir() print("instance.OriginalPath", instance.OriginalPath) end function AutoRequire:getTag() return self._tag end function AutoRequire:getRequirePath() return self._require_path end function AutoRequire:require(path, data) local loadpath = self.OriginalPath..'/'..path assert(lfs.symlinkattributes(loadpath), "Error AutoRequire path not find "..path) lfs.chdir(loadpath) self._tag = data self._require_path = path local initfile = path..'/'.."init.lua" if cc.FileUtils:getInstance():isFileExist(initfile) then -- print("require("..initfile..")") local loadf = path..'/'.."init" -- print("require "..loadf) require(loadf) end for file in lfs.dir(loadpath) do if file ~= "." and file ~= ".." and file ~= "init.lua" and file ~= "loadend.lua" then local f = loadpath ..'/'..file local attr = lfs.attributes(f) local filename = string.gsub(file, ".lua$", "") if attr.mode == "file" and file ~= filename then -- print("require("..path..'/'..file..")") local loadf = path..'/'..filename -- print("require "..loadf) require(loadf) end end end local initfile = path..'/'.."loadend.lua" if cc.FileUtils:getInstance():isFileExist(initfile) then -- print("require("..initfile..")") local loadf = path..'/'.."loadend" -- print("require "..loadf) require(loadf) end self._tag = nil self._require_path = nil lfs.chdir(self.OriginalPath) end instance = AutoRequire.new() cc.exports.AutoRequire = AutoRequire return AutoRequire
2016-09-30 11:36:10 后記
突然間想起來一個好處,現在補充上來。
一次性加載所有的代碼。可以讓很多語法錯誤在啟動階段暴露出來,而不是在真正的運行階段暴露,這樣比較方便。
