讓Lua自己把文件夾下面的所有文件自動加載起來吧


沒有想到我也做了一回標題黨。其實這里邊說的自動還是有誇大其詞的部分。其實只是指定文件夾,然后根據指定文件夾數據,加載目錄下邊的內容而已。

怎么來進行Lua文件的加載

一般情況下,相關的功能需要給他創建一個相關的目錄,然后直接通過我寫的一個組件指定這個目錄的加載位置就行了。不同的目錄之間需要明確他們的加載順序。

為什么要這么做?

  1. 加載的條理性。一般情況下,Lua文件會在需要的時候進行內存加載,這樣比較混亂。說比較混亂的原因是沒有明確的地方來控制加載的順序,所以文件加載的順序比較看臉。
  2. 加載內容的安全性。這里提到的安全性並不是說的什么高深的東西。而是這個東西究竟有沒有加載成功。如果使用了,我所說的加載方式進行加載,文件內容加載只要存在相關的文件夾中就會自動加載,一般不會漏下。
  3. 明確同一個文件夾下的文件加載順序。一般情況下init.lua會首先加載,然后加載其他文件。最后加載loadend.lua文件。在編寫軟件的時候可以根據這些文件的加加載順序來進行內容加載的順序控制。
  4. 實現位置的無關性。配合工廠模式,可以在完全不關心實現位置的情況下,實現相關功能。
  5. 文件位置的條理性。具體的實現位置可以在不記位置的情況下推理出他應該在什么地方實現。(個人覺得這個非常重要)

實際引用

 

總結

其實是一個非常簡單的功能,但是用處卻非常大。可能我不是很會總結這個東西。哈哈。總之分享一下吧

文件

-- 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 后記

突然間想起來一個好處,現在補充上來。

一次性加載所有的代碼。可以讓很多語法錯誤在啟動階段暴露出來,而不是在真正的運行階段暴露,這樣比較方便。

 

 


免責聲明!

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



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