Luarocks:从含多个文件的包中创建 rock

使用Luarocks,我按照Creating a rock上的教程操作。然而,当我的软件包包含多个文件时,我在创建rock时遇到了困难。与教程有何不同?

示例-单文件

假设我有以下文件testrock.lua

module('testrock')
function add(a, b)
    return a+b
end

testrock-scm-1.rockspec中如下:

package = "testrock"
version = "scm-1"

source = ...
description = ...
dependencies = ...

build = {
   type = "builtin",
   modules = {
       testrock = "testrock.lua"
   }
}

然后,我运行luarocks make,它可以成功安装testrock(我可以转到另一个目录并运行require 'testrock')。

示例-两个文件

但是,假设我想添加另一个文件foo.lua

function testrock.sub(a, b)
    return a - b
end

我将以下内容添加到testrock.lua的末尾:

require('foo')

然后运行luarocks makemake运行成功,但是当我转到另一个目录并运行require 'testrock'时,尝试调用全局require的错误发生了:

/home/<username>/torch/install/share/lua/5.1/testrock.lua:7: attempt to call global 'require' (a nil value)

因此,它在关于require('foo')语句发出投诉。有什么建议?

点赞
用户1001930
用户1001930

解决方案是意识到我不需要构建任何东西,因为我只使用 .lua 文件。因此,以下 rockspec 可以正常工作:

package = "testrock"
version = "scm-1"

source = ...
description = ...
dependencies = ...

build = {
   type = "none",
   install = {
       lua = {
           "testrock.lua",
           "foo.lua"
       }
   }
}

这将 testrock.luafoo.lua 复制到 /home/<username>/torch/install/share/lua/5.1/

2016-01-23 21:16:02
用户3677376
用户3677376

调用 module('testrock') 隐藏了所有全局变量,包括全局的 require 函数。您可以在调用 module 之前调用 require,或在调用 module 之前创建一个本地别名 (local require = require),或使用 package.seeall 选项 (module('testrock', package.seeall))。

将 foo 模块添加到您的 rockspec 中,以便它与您的 testrock.lua 文件一起安装,非常简单:

-- ...
build = {
   type = "builtin",
   modules = {
       testrock = "testrock.lua",
       foo = "foo.lua"
   }
}
-- ...
2016-01-23 23:24:18