让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 后记

突然间想起来一个好处,现在补充上来。

一次性加载所有的代码。可以让很多语法错误在启动阶段暴露出来,而不是在真正的运行阶段暴露,这样比较方便。

 

 

posted @ 2016-09-12 20:15  连程  阅读(6828)  评论(0编辑  收藏  举报