LocalRegistry.jl: 公式パッケージにするのが億劫な JuliaLang developer への処方箋


本日は

LocalRegistry.jl の紹介です.

自作のパッケージを General に登録するのが億劫,自分用または周りの人でこっそりとパッケージを使いまわしたい人向けの記事です.

野良パッケージだと共同開発者,共同研究者にそのパッケージの使用を依頼するときは GitHub のリポジトリを直接指定して Pkg.add する作業が必要があります.

いわゆる公式パッケージ化されていれば ]add OurPkg のようにパッケージの名前だけで追加できます.いわゆる公式パッケージ化すると簡単に追加してもらえるメリットがあります.

でも closed な開発 e.g. 企業内だったり論文執筆前の段階の研究用 であれば public に(したくても)できない事情があります.

そのほかにも

なんとなくいい感じの機能を提供するパッケージを作ったよ.でもそれが他の人にとって有用なのかわからない,公式パッケージにするのは(諸般の理由で)後にしたい.でも身内では気軽にインストールしてほしい

というような状態もあるかもしれません.LocalRegistry.jl を使うとそのような悩みから解放されます.これは Julia の General レジストリ のようなレジストリを野良パッケージならぬ野良レジストリとして作ることができる機能を提供してくれるパッケージです.

これをすると身内の中では

お前らちーっす. OreOrePkg.jl という Julia パッケージ作ったわ.んでもってオレオレ野良レジストリを 俺っちの GitHub に OreOreRegistry として作ったわ.下記の手続きをヨロピコ:

(@v1.7) pkg> registry add <Ore-sama-no-github-repository/OreOreRegistry>
(@v1.7) pkg> add OreOrePkg

とすることで OreOrePkg をみんなで使用することができます.思ったよりもカジュアルに公式パッケージみたいなユーザー体験を提供できることがわかるでしょう.

やり方

せっかくなので作ってみましょう.

空っぽのリポジトリを作成

ここでは Gallery という名前のレジストリを使うことを想定しています.

レジストリの名前を決めたらリポジトリを生成しましょう.
この時チェックボックスを押さずそのまま Create repository を押します.

LocalRegistry.jl を導入

  • LocalRegistry.jl をインストールします. デフォルトの環境に入れておけばOKです.
julia> using Pkg; Pkg.add("LocalRegistry")

レジストリの作成

LocalRegistry.jl が提供する create_registry を使ってレジストリを作成します.

下記のような引数を受け付けます.

create_registry("<レジストリ名>", "<リモートリポジトリのURL>", description="<このレジストリの説明>")

読者は適宜読み替えてください.

               _
   _       _ _(_)_     |  Documentation: https://docs.julialang.org
  (_)     | (_) (_)    |
   _ _   _| |_  __ _   |  Type "?" for help, "]?" for Pkg help.
  | | | | | | |/ _` |  |
  | | |_| | | | (_| |  |  Version 1.7.2 (2022-02-06)
 _/ |\__'_|_|_|\__'_|  |  Official https://julialang.org/ release
|__/                   |

julia> using LocalRegistry
julia> create_registry("Gallery", "[email protected]:AtelierArith/Gallery.git", description="Julia Registry of AtelirArith")
[ Info: Created registry in directory ~/.julia/registries/Gallery
"~/.julia/registries/Gallery"

create_registry の実行が成功すると ~/.julia/registries/<レジストリ名> という git でバージョン管理されたローカルのリポジトリが得られます.

$ cd ~/.julia/registries/Gallery
$ ls -al
total 8
drwxr-xr-x   4 username  staff  128 Mar 31 00:20 .
drwxr-xr-x   5 username  staff  160 Mar 31 00:27 ..
drwxr-xr-x  12 username  staff  384 Mar 31 00:20 .git
-rw-r--r--   1 username  staff  170 Mar 31 00:20 Registry.toml

GitHub で作ったからのリポジトリに push する.

git remote get-url origin の結果が <リモートリポジトリのURL> の結果になっていることを確認します. そして main ブランチをデフォルトブランチとして設定し GitHub に push します.

$ git remote get-url origin # 確認
$ git branch -M main
$ git push -u origin main

これで空っぽのレジストリが出来上がりました. レジストリの実体は git で管理されたリポジトリなのです.

野良パッケージを登録します.

依然として野良パッケージ(=いわゆる公式パッケージ化していない)にしてある PyPlotly.jl を登録してみます. 読者は自作のパッケージに読み替えてください.

登録したい野良パッケージが手元にクローンしていることを前提として話を進めます.
下記のような操作で Julia の REPL で PyPlotly がロードできる状態まで持っていきます. ここでロード(load)というのは作業している Julia の REPL で import PyPlotly をすることに対応しています.

$ cd path/to/PyPlotly.jl
$ julia --project=@. # PyPlotly.jl をアクティベートする
               _
   _       _ _(_)_     |  Documentation: https://docs.julialang.org
  (_)     | (_) (_)    |
   _ _   _| |_  __ _   |  Type "?" for help, "]?" for Pkg help.
  | | | | | | |/ _` |  |
  | | |_| | | | (_| |  |  Version 1.7.2 (2022-02-06)
 _/ |\__'_|_|_|\__'_|  |  Official https://julialang.org/ release
|__/                   |

julia> # ここで ] を入力
(PyPlotly) pkg> # こうなってることを確認
julia> # 再び REPL に戻る
julia> import PyPlotly

続いて下記の操作をして PyPlotly を先ほど作成したレジストリに登録します.

julia> import PyPlotly # 上の作業からの続き
julia> using LocalRegistry
julia> register(PyPlotly, registry="~/.julia/registries/Gallery" |> expanduser, repo="https://github.com/AtelierArith/PyPlotly.jl.git", branch="register-pyplotlyjl", push=true)
┌ Info: Registering package
│   package_path = "/Users/atelier/work/atelierarith/PyPlotly.jl"
│   registry_path = "/Users/atelier/.julia/registries/Gallery"
│   package_repo = "https://github.com/AtelierArith/PyPlotly.jl.git"
│   uuid = UUID("1f096619-141e-4d77-a13b-040156ae333b")
│   version = v"0.1.0"
│   tree_hash = "54450a94a152baf4d947a0aca31d6696f4bd6c4c"
└   subdir = ""
Switched to a new branch 'register-pyplotlyjl'
Enumerating objects: 11, done.
Counting objects: 100% (11/11), done.
Delta compression using up to 16 threads
Compressing objects: 100% (8/8), done.
Writing objects: 100% (9/9), 1.08 KiB | 1.08 MiB/s, done.
Total 9 (delta 1), reused 0 (delta 0), pack-reused 0
remote: Resolving deltas: 100% (1/1), completed with 1 local object.
remote:
remote: Create a pull request for 'register-pyplotlyjl' on GitHub by visiting:
remote:      https://github.com/AtelierArith/Gallery/pull/new/register-pyplotlyjl
remote:
To github.com:AtelierArith/Gallery.git
 * [new branch]      register-pyplotlyjl -> register-pyplotlyjl
Branch 'register-pyplotlyjl' set up to track remote branch 'register-pyplotlyjl' from 'origin'.
Switched to branch 'main'
Your branch is up to date with 'origin/main'.
warning: deleting branch 'register-pyplotlyjl' that has been merged to
         'refs/remotes/origin/register-pyplotlyjl', but not yet merged to HEAD.
Deleted branch register-pyplotlyjl (was 19614e7).

下記のような使い方をします.

register("<モジュール名>", registry="<レジストリのパス>", repo="<PyPlotly.jl が管理されているリモートリポジトリのURL>", branch="<情報を追加する際にコミットを行うレジストリのリポジトリのブランチ名>", push=true)

こうすると レジストリ を管理するリポジトリに branch で指定した名前のブランチが作成されます. そのブランチで PyPlotly.jl に関するバージョン情報,依存関係などの情報を付与したファイルが生成されコミットされます. push=true をすることで GitHub のリモートリポジトリにプッシュされます. branch 名を指定しないとデフォルトブランチが伸びてしまうので,共同開発をする組織であれば branch 名を指定し, 念の為デフォルトブランチはプロテクトをかける運用をするとよさそうです. push=false でも良いと思うのですけれどその場合 暗黙に行われるデフォルトブランチに
チェックアウトする挙動と相性が悪いのでここでは push=true にしています.

プッシュしたブランチをプルリクエストを経由してマージする

レジストリを管理している GitHub リポジトリにアクセスします.

下記のようなプルリクメッセージが自動で付与されます.

ちなみにLocalRegistryによって下記のような変更が加えられたのもわかります.

発行したプルリクエストをマージします.

めでたく登録されました.

同様の操作で Kyulacs.jl も入れておきました.

Gallery レジストリを使ってみよう

せっかくなので, 使ってみましょう. 読者がこの記事を見ていることには Gallery レジストリは public リポジトリとなってるのでどなたでも使用が可能です.

使い方を見せるために, まっさらな環境で試すために,ここでは Docker のコンテナ内で作業していきます.

レジストリの追加

下記の作業をしていきます. unzip をインストールしているのは PyPlotly.jl, PlotlyJS.jl が依存している Blink.jl を適切にインストールするためです.

$ docker run --rm -it julia:1.7.2 bash
$ root@xxx:/# apt-get update
$ root@xxx:/# apt-get install unzip
$ julia
               _
   _       _ _(_)_     |  Documentation: https://docs.julialang.org
  (_)     | (_) (_)    |
   _ _   _| |_  __ _   |  Type "?" for help, "]?" for Pkg help.
  | | | | | | |/ _` |  |
  | | |_| | | | (_| |  |  Version 1.7.2 (2022-02-06)
 _/ |\__'_|_|_|\__'_|  |  Official https://julialang.org/ release
|__/                   |

(@v1.7) pkg> registry add General

(@v1.7) pkg> registry add https://github.com/AtelierArith/Gallery.git
     Cloning registry from "https://github.com/AtelierArith/Gallery.git"
       Added registry `Gallery` to `~/.julia/registries/Gallery`

registry add General で Julia の公式レジストリを追加します. その次に我々の野良レジストリを追加します.

続いて PyPlotly をインストールします. レジストリに PyPlotly があるかを探索しあたかも公式パッケージのように導入できることがわかります.

(@v1.7) pkg> add PyPlotly
    Updating registry at `~/.julia/registries/Gallery`
    Updating git-repo `https://github.com/AtelierArith/Gallery.git`
    Updating registry at `~/.julia/registries/General.toml`
   Resolving package versions...
   ... 色々ログが出てくる
   

飽きたら

Gallery レジストリが不要になったら registry remove Gallery で消すことができます.

まとめ

野良パッケージを準公式パッケージにする方法について述べました.