CoronaSDK中package.path的问题

我们想将第三方 Lua 模块(比如 foo)集成到我们的 CoronaSDK 应用程序中。

该模块的主要代码在 foo/init.lua 中,需要作为 require 'foo' 进行调用。

我们将该模块放入 corona/foo 中:

corona/foo$ ls
  init.lua

corona/main.lua 中,我们有以下代码:

package.path = package.path .. ";"
  .. package.path:gsub("?.lua", "?/init.lua")

在模拟器中,require 'foo' 是可以工作的。但是,在设备上它不起作用:

Lua Runtime Error: lua_pcall failed with status: 2, error message is:
module 'foo' not found:resource (foo.lua) does not exist in
archive
  no field package.preload['foo']
  no file '/var/mobile/Applications/0B609A43-54E8-40E5-9D44-F3C93CC4031E/Appname.app/foo.lua'
  no file '/var/mobile/Applications/0B609A43-54E8-40E5-9D44-F3C93CC4031E/Appname.app/foo.lua'
  no file '/var/mobile/Applications/0B609A43-54E8-40E5-9D44-F3C93CC4031E/Appname.app/foo/init.lua'
  no file '/var/mobile/Applications/0B609A43-54E8-40E5-9D44-F3C93CC4031E/Appname.app/foo/init.lua'
  no file './foo.so'

奇怪的是,require 'foo.init' 确实可以工作。

有什么提示吗?

点赞
用户949789
用户949789

尝试这样做

设置 package.path,将原值与新的路径字符串拼接起来,并且使用 gsub 方法替换掉路径中的 ?.lua 字符串:

package.path = package.path .. ";"
.. package.path:gsub("?.lua", "?.init.lua")

在包中调用 Lua 文件时,应该使用以下路径结构:

dir.luafile.lua

而不应该使用以下路径结构:

dir/luafile.lua

希望这个解释可以帮到你。

2013-01-10 04:01:07
用户830098
用户830098

你的文件名是 foo.lua 还是 Foo.lua

在模拟器中两种情况都能工作,但在设备上,大小写却很重要。

我曾经做了一个噩梦(我不知道为什么我的 SVN 客户端会更改我的某个文件的大小写……我花了一个多小时才发现出了什么问题,因为我的模块突然间在设备上无法找到了)。

2013-08-24 02:50:22