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
でもできたんですね。お母さん知りませんでした。
終わり。