Luarocks: Создание камня из пакета с несколькими файлами

Используя 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 make. make работает, но когда я перехожу в другой каталог и запускаю `require 'testrock``, я получаю следующую ошибку:

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

и поэтому он жалуется на оператор require('foo'). Любой совет?


person Veech    schedule 23.01.2016    source источник


Ответы (2)


Вызов 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"
   }
}
-- ...
person siffiejoe    schedule 23.01.2016

Решение пришло, когда я понял, что мне не нужно ничего создавать, потому что я использую только файлы .lua. Поэтому работает следующий рокспек:

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

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

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

Это копирует testrock.lua и foo.lua в /home/<username>/torch/install/share/lua/5.1/.

person Veech    schedule 23.01.2016