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になっており、urlとtagが入る。今回はGit(Hub)のリポジトリでモジュール管理ということなので、url = git://github.com/Nymphium/luakatsuとしておく。httpsではなくgitとしておくことがミソ。
luarocks install MOD --verboseとするとLuaRocks君の働き振りがうかがえ、urlをos.execute()で実行されるコマンドの引数に渡しており、httpsとするとcurl、gitとすると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 Luaでmakeとかいらないので"builtin"ですね。
さて、source.urlをhttpsから始めるとcurlでHTTPサーバからディレクトリを頂いていくみたいな動きをして、build.modulesにtest = "--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のバージョンごとにmanifestとindex.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
でもできたんですね。お母さん知りませんでした。
終わり。