Lua的Require的另一种实现

项目开发日志系列(三)

配置环境与工具: cocos2d-x-2.2.3,Lua5.1,tulua++,Xcode;

测试工程: /cocos2d-x-2.2.3/samples/Lua/HelloLua

Lua在我的项目中的定位

Lua本来是一种轻快而小巧的脚本语言,随着手游大行其道,它逐渐被用来开发中型 甚至大型的项目,在我的项目中 并不打算全部逻辑放到Lua层,而是让轻快的Lua去做轻快的事情,Lua只是火车上的舒服的空调或者座椅.让火车头C++同学去做火车头应该做的事情.

Lua中的require

require函数实现了不同lua文件的加载,类似于C++中的include,java中的import,
require函数会在路径中搜索输入的文件路径,大致流程如下:

  • 在package.loaded查找 若找到 则结束
  • 在package.preload查找 如果preload存在 则调用 结束
  • 根据package.path的模式查找lua库 若找到 结束
  • 根据package.cpath查找c库 若找到 则加载C库 然后进行加载C库的处理,处理完成后 则结束

这个过程虽然并不复杂,但是在搜索过程中 可能会涉及几个模块式路径:
./?.lua;./?.lc;/usr/local/?/init.lua

使用require,我认为可能的隐患

但是目前我项目中是几个同事一起协作 各自编写不同模块的Lua代码.这就有一个隐患(可能是隐患),如果两个同事在不同路径编写的lua文件同名 例如都叫init.lua.那在require调用搜索的时候会不会发生引用错误呢?我对这个问题目前还不太确定,由此对加载lua文件有了另外一种实现方式.

增加C接口实现调用

参照上一篇给Lua增加C接口函数.我们再增加一个函数 实现给Lua加载lua文件.

//GameLuaAPI.H
// tolua_begin
void API_LoadLuaFile(  char *szLUAFileName);
void API_LuaSample();
// tolua_end

函数的实现:

// GameLuaAPI.cpp
// 加载LUA脚本
void API_LoadLuaFile( char *szLUAFileName)
{
    CCLOG("API_LoadLuaFile = %s",szLUAFileName);
    CCLuaEngine* pEngine = CCLuaEngine::defaultEngine(); 
    std::string path = 
    CCFileUtils::sharedFileUtils()->fullPathForFilename(szLUAFileName);
    pEngine->executeScriptFile(path.c_str());
}

然后导出到Lua,在Lua中如此加载源文件:

-- add lua source file
API_LoadLuaFile("test.lua")
-- add end

function main(  )
    -- sample call c++ func
    API_LuaSample()
    -- sample cal lua func
    test();
end

main()

如此遍实现了 脱离require函数来实现加载源文件的功能.

这种方式靠谱不靠谱呢?

目前我的项目中选择使用这种方式

所有Sample托管在我的github

发表评论

电子邮件地址不会被公开。 必填项已用*标注