来世ガチャ乱数調整日記

Lily, Bass & Programing

LuaRocksとの戦い

こんにちは、びしょ〜じょです。 今日はLuaRocksと戦ったことについてちょっと書きます。

LuaRocksとは

Luaのパッケージマネージャっぽいものです。詳しくはググってください。


さて、こんなものを作りました。今回はこれ自体に用はなく(他でもっとじっくり書きたいが今はとにかく疲れている)、これをLuaRocksで引っ張ってくるまでの奮闘記を書く。

これが参考になったりした。

先に結論

# at MODULE's root dir
luarocks write_rockspec MOD VER .
sed -ie "s/https/git" MOD-VER.rockspec
luarocks-admin make_manifest .

LuaRocksを使う(GitHubリポジトリ)

例として上のluakatsuを使う。バージョンを1.0-0(メジャーバージョン1.0、サブバージョン0という感じ)としよう。

rockspec

雛形

まずluakatsuモジュールのルートディレクトリに行き、以下のコマンドでrockspecの雛形を作る。gemspecみたいなものですかね。gemspecほとんど知らないけど。

luarocks write_rockspec luakatsu .

するとluakatsu-.-1.rockspecというファイルができる。なんだこれは。命名規則<MODULENAME>-<VERSION>.-<SUBVERSION>.rockspecかな。どこかに書いてあった。

とりあえずこの名前はまずい感じなのでluakatsu-1.0-0.rockspecとでもしておく。 luarocks write_rockspec MOD VER .としておくと良い。

整形

さて中を見ての通り実態はluaファイル。if文とかも使えたりするっぽい。しかしところどころ欠落している。

package = "luakatsu"
version = ".-1"
source = {
   url = "*** please add URL for source tarball, zip or repository here ***"
}
description = {
   summary = "*** please specify description summary ***",
   detailed = "*** please enter a detailed description ***",
   homepage = "*** please enter a project homepage ***",
   license = "*** please specify a license ***"
}
dependencies = {}
build = {
   type = "builtin",
   modules = {
      luakatsu = "luakatsu.lua",
      uakatsu = "uakatsu.lua",
      ['luakatsu.bin.char_setmeta'] = "luakatsu/bin/char_setmeta.lua",
      ['luakatsu.bin.which_school'] = "luakatsu/bin/which_school.lua",
      ['luakatsu.character.idols'] = "luakatsu/character/idols.lua",
      ['luakatsu.character.others'] = "luakatsu/character/others.lua",
      trash = "trash.sh",
   }
}

luarocks help write_rockspecを見てもらえばわかる通りオプションで雛形にもう少し肉付けができるが、自分で書いたほうが早い(気がする)。

package、version

packageはモジュール名のlowercaseが良いらしい。version is まずい。1.0-0にする。

source

sourceはtableになっており、urltagが入る。今回はGit(Hub)のリポジトリでモジュール管理ということなので、url = git://github.com/Nymphium/luakatsuとしておく。httpsではなくgitとしておくことがミソ。 luarocks install MOD --verboseとするとLuaRocks君の働き振りがうかがえ、urlos.execute()で実行されるコマンドの引数に渡しており、httpsとするとcurlgitとするとgit cloneとかで引っ張ったりしている。これが分からなくて7時間溶けた。どこにもそんなこと書いてねぇぞ…💢💢

description、dependencies

大体見たとおりな感じで、homepageにはhttp://aikatsu.netとか書いておけば問題ない(本当か?)。maintainerには自分の名前を書いたりね。

dependenciesは文字列のtableで、{"lua >=5.2", "luasocket >= 2.0.1"}とかそんな感じで必要なものを書いていく。

build

buildについて、LuaRocks君が雛形を作るときにだいたいは察してくれるが、よく見るとモジュール自体とは関係ないものも(dot files(.git, .gitignore, etc.)とREADME、あとLuaRocksで必要なものは無視されるのかも)突っ込んじゃったりしているので消す。上記の`trash = "trash.sh,"とか邪魔ですね。

type種類を指定できる。この種類というのはpure Luaとかmakeが必要とかそんなアレや。詳しくは公式ドキュメントBuild rulesを見てくれ。

今回はpure Luamakeとかいらないので"builtin"ですね。

さて、source.urlhttpsから始めるとcurlでHTTPサーバからディレクトリを頂いていくみたいな動きをして、build.modulestest = "--version"とし、luarocks --local MOD install --verboseでLuaRocks君の動きを見てみると何故かGCCのバージョンが見えたりする。 build.modulesにあるvalueはそれぞれファイル名であり、build.typeが"builtin"の時おそらくLuaRocks君は拡張子を見てos.execute()で何を実行するか考えるんだろう。だいぶ危ない気がする。

manifest

manifestというリポジトリのインデックスファイルを作る。rockspecを作ったディレクトリと同じ場所で以下のコマンドを実行する。

luarocks-admin make_manifest .

Luaのバージョンごとにmanifestindex.htmlができる。index.htmlにはrockspecのdescriptionの息吹がうかがえる。

git push、そして伝説へ…

だいぶ雑だがこれでとりあえずはOK。では使おう。

luarocks --local --from=https://github.com/Nymphium/luakatsu/raw/master install luakatsu

lua -luakatsu -e Aikatsu\(\) # 私のアツいアイドル活動、アイカツ! 始まります! フフッヒ

source.urlの仕様についてまったくわからない時だいぶ苦しんだ。途中まで何度もgit pushしてはluarocks --local install MODするというだいぶ無駄なことをしていた。途中からはRubyでHTTPサーバをワンライナーで作っているモジュールのルートディレクトリに建てることでだいぶ楽になった。そこはluasocket使えよみたいな話はあると思いますが、それはGoogle先生がサジェストしてくれなかったのでダメです。

追記(20015 2/4 08:52)

HTTPサーバワンライナーとかしなくても、

luarocks --from=/PATH/TO/MOD search MOD

でもできたんですね。お母さん知りませんでした。

終わり。