背景

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 を送信します。

レビューを受ける

レビューして頂きました。僕が頂いた指摘は以下です:

レビュワーを呼ぶ

どのレビュワーも、来なかったり居なくなったりするので、バンバン 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 へ追加して行く予定です。

2025-07-28-welcome.png
Figure 1: ありがとうございます!

おまけ: 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 が格好良くて素敵です。