1

使用 Luarocks,我遵循了有关创建岩石的教程。但是,我很难创建包含多个文件的包。当我的包分布在多个文件中时,我必须与教程做哪些不同的事情?

示例 - 一个文件

假设我有以下文件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”时,我收到以下错误:

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

所以它在抱怨这个require('foo')声明。有什么建议吗?

4

2 回答 2

3

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

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

-- ...
build = {
   type = "builtin",
   modules = {
       testrock = "testrock.lua",
       foo = "foo.lua"
   }
}
-- ...
于 2016-01-23T23:24:18.410 回答
2

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

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

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

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

这会将testrock.luaand复制foo.lua/home/<username>/torch/install/share/lua/5.1/.

于 2016-01-23T21:16:02.517 回答