LuaRocksのrockspecの更新を楽にする


LuaRocksにuploadした自作のパッケージのバージョンを上げるとき、手動でrockspecを編集するのは面倒。

mypackage-1.0.0-1.rockspec
package = "mypackage"
version = "1.0.0-1"
source = {
   url = "git+https://github.com/notomo/mypackage.git",
   tag = "v1.0.0"
}
build = {
   type = "builtin",
   modules = {}
}

ファイル名とversionsource.tagの3箇所変える必要がある。
実はこれを解決するサブコマンドnew_versionが提供されている。

$ luarocks new_version --dir rockspec --tag=v1.0.1
Wrote rockspec/mypackage-1.0.1-1.rockspec

--dirのディレクトリにあるrockspecを元に--tagのバージョンのrockspecを作成できる。

new_versionを使えば、シンプルなMakefileで楽に新しいバージョンをリリースできる。
( https://github.com/luarocks/luarocks/wiki/Creating-a-rock#method-1-using-a-repository-such-as-github を前提にしている)

Makefile
VERSION :=
ROCKSPEC_FILE := rockspec/mypackage-${VERSION}-1.rockspec

new_rockspec:
	luarocks new_version --dir rockspec --tag=v${VERSION}
	cat ${ROCKSPEC_FILE}
	luarocks make ${ROCKSPEC_FILE}
.PHONY: new_rockspec

release: new_rockspec
	luarocks install dkjson
	luarocks upload ${ROCKSPEC_FILE} --temp-key=${LUAROCKS_API_KEY}
.PHONY: release
$ make new_rockspec VERSION=1.0.1
luarocks new_version --dir rockspec --tag=v1.0.1
Wrote rockspec/mypackage-1.0.1-1.rockspec
cat rockspec/mypackage-1.0.1-1.rockspec
package = "mypackage"
version = "1.0.1-1"
source = {
   url = "git+https://github.com/notomo/mypackage.git",
   tag = "v1.0.1"
}
build = {
   type = "builtin",
   modules = {}
}
luarocks make rockspec/mypackage-1.0.1-1.rockspec

mypackage 1.0.1-1 is now installed in /home/notomo/.local

バージョンをコードに埋め込まなくてよければ、git tagのpushでリリースできるGitHub Actionにまとまる。
バージョンの埋め込みが必要だとどうすべきかは考えられていない。今後の課題。

name: Release
on:
 push:
   tags:
     - "v*"

jobs:
  release:
    name: Release
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2

      - uses: leafo/gh-actions-lua@v7
      - uses: leafo/gh-actions-luarocks@v2
      # luarocksのsetupができれば何でもいい

      - run: echo ::set-output name=version::${GITHUB_REF/refs\/tags\/v/}
        id: var

      - run: make release TARGET_VERSION=${{ steps.var.outputs.version }}
        env:
          LUAROCKS_API_KEY: ${{ secrets.LUAROCKS_API_KEY }}