背景
Nix 入門コントリビュート編です。 nixpkgs に送った簡単な PR がマージされた (nixpkgs#420544) ので、経験談を書きます。
PR がマージされるまで
今回追加したのは、競技プログラミングで引っ張りだこの oj-verify
です。 Python モジュールおよび実行ファイルとして nixpkgs に追加しました。
全体像
最終的に、以下のファイルを提出しました:
.
├── maitainers
├── pkgs
│ ├── by-name
│ │ └── on
│ │ └── online-judge-verify-helper
│ │ └── package.nix # 1
│ └── development
│ └── python-modules
│ └── online-judge-verify-helper
│ └── default.nix # 2
└── top-level
└── python-packages.nix # 3
本体は 2. の Python モジュールで、これさえ書ければ PR は出せます。
ローカルでビルドする
まず Python パッケージとしてビルドします。やや古い Python プロジェクト (setup.py
, setup.cfg
, setuptools
など) について調べることになり、 Nix 以前の知識が問われました:
$ nix-build -A python3Packages.online-judge-tools
実行ファイルの方は動かしてみれば OK です:
$ nix-build -A online-judge-verify-helper
$ eza result/bin
oj-bundle* oj-verify*
$ ./result/bin/oj-verify
INFO:onlinejudge_verify.config:no config file
usage: oj-verify [-h] [--config-file CONFIG_FILE] {all,run,docs,stats} ...
一応、自環境の nixpkgs を一時的に fork に切り替えて動作確認しました。より簡単な方法があれば知りたいです。
コントリビューションガイドを読む
Markdown を 2,000 行ほど読みます。長い! 初回の PR ではメンテナの追加などもあり、全体像を把握するのが大変です。
大半のドキュメントは Nixpkgs Reference Manual になるため、気になるトピックはこのページで検索しました。
PR を送信する
PR に関連するドキュメントは一通り読んだので、僕の PR が悪い時はドキュメントが悪いとも言えます。免罪符をゲットし、 PR を送信します。
レビューを受ける
レビューして頂きました。僕が頂いた指摘は以下です:
rev
よりもtag
を使うべし
tag
の方が安全で分かりやすいですね:
src = fetchFromGitHub { owner = "online-judge-tools"; repo = "verification-helper"; - rev = "refs/tags/v${version}"; + tag = "v${version}"; hash = "sha256-sBR9/rf8vpDRbRD8HO2VNmxVckXPmPjUih7ogLRFaW8="; };
checkPhase
を書くならば hook を呼ぶべし
ああー、すみません:
checkPhase = '' + runHook preCheck export PATH=$out/bin:$PATH oj-verify --help > /dev/null oj-bundle --help > /dev/null + runHook postCheck '';
- そもそも
checkPhase
を書いたせいで、pytest
が実行されなくなっている
致命的なエラーです。上のcheckPhase
は、ほぼ意味が無かっため消しました。 - Python モジュールが不要ならば
pkgs/by-name
以下のみで良い
今回は Python モジュールも必要だったため、修正無しとしました。
レビュワーを呼ぶ
どのレビュワーも、来なかったり居なくなったりするので、バンバン ping しましょう。僕にはあなたが必要なんです! ということで、応えてくれる可能性は高めです。
まとめ
nixpkgs にパッケージを追加しました。 PR tracker で unstable ブランチへのマージを確認次第、手元の boilerplate は削除して行こうと思います。
Boilerplate
oj-verify =
with pkgs.python3Packages;
pkgs.python3Packages.buildPythonApplication {
name = "verification-helper";
version = "5.6.0";
pyproject = true;
src = pkgs.fetchFromGitHub {
owner = "online-judge-tools";
repo = "verification-helper";
rev = "adbff121b1f96de5f34e9f1483eb47d661c54075";
fetchSubmodules = false;
sha256 = "sha256-f7Ge8kLRQv9uxdNGtgNsypGVY0XAnKPCg8HYQ5nT6mI=";
};
build-system = [ setuptools ];
dependencies = [
colorlog
importlab
online-judge-tools
pyyaml
setuptools
toml
];
propagatedBuildInputs = [ setuptools ];
};
今後は atcoder-cli, competitive-verifier, pyobjc-framework-Quartz など、自分が必要なパッケージを nixpkgs へ追加して行く予定です。

おまけ: RSS
追加したパッケージのメンテナになったため、 Release の RSS を購読することにしました。 Emacs の elfeed
(または elfeed-org
) を使うつもりです:
(leaf elfeed
:url "https://github.com/skeeto/elfeed"
:hook (emacs-startup-hook . (lambda () (run-at-time 5 5 'elfeed-update)))
:custom
(elfeed-feeds .
'(("https://matklad.github.io/feed.xml" fun)
("https://github.com/online-judge-tools/verification-helper/releases.atom" maintain))))
Emacs 以外では、やはり ymgyt/syndicationd
が格好良くて素敵です。