nix-initを使って簡単にNixでパッケージングを行う

2024/11/15に公開

対象者

  • 普段nixpkgsにあるパッケージしか使っていない人
  • nixpkgsにないパッケージを使いたい人
  • nixpkgsにあるバージョンより新しいバージョンのパッケージを使いたい人

nix-initとは

URLからNixのコードを生成してくれるツールです。nix-initを使うことで、nixがよくわからない人でも簡単にパッケージングをすることができます。

使い方

Python、Go、Rustで書かれているものは特に簡単にパッケージングできるので、今回はRustで書かれているskimを例にパッケージングしていきます。

適当なディレクトリを作成する

nix-initはデフォルトでカレントディレクトリにコードを生成するので、適当なディレクトリを用意します。

$ mkdir skim; cd skim

nix-initを実行する

$ nix run github:nix-community/nix-init
Enter url
❯ https://github.com/skim-rs/skim #リポジトリのURL
Enter tag or revision (defaults to v0.10.4)
❯ v0.10.4
Enter version
❯ 0.10.4
Enter pname
❯ skim
How should this package be built?
❯ buildRustPackage - cargoHash #今回はRustなので
Enter output path (leave as empty for the current directory)
❯ .

上記を実行すると(結構時間かかります)、default.nixというファイルが生成されます。中身を確認してみましょう。

default.nix
{
  lib,
  rustPlatform,
  fetchFromGitHub,
}:

rustPlatform.buildRustPackage rec {
  pname = "skim";
  version = "0.10.4";

  src = fetchFromGitHub {
    owner = "skim-rs";
    repo = "skim";
    rev = "v${version}";
    hash = "sha256-TJgFcsF/pD8N+SGUcea8Rl0Q8DcuNCVvZv2TBiyRDP8=";
  };

  cargoHash = "sha256-jBcgoWbmBOgU7M71lr4OXOe2S6NAXl+I8D+ZtT45Vos=";

  meta = {
    description = "Fuzzy Finder in rust";
    homepage = "https://github.com/skim-rs/skim";
    changelog = "https://github.com/skim-rs/skim/blob/${src.rev}/CHANGELOG.md";
    license = lib.licenses.mit;
    maintainers = with lib.maintainers; [ ];
    mainProgram = "skim";
  };
}

もうそれっぽいのが出来上がってますね!

ビルドする

生成されたnixのコードは、以下のコマンドでビルドできます。

$ nix-build -E "(import <nixpkgs> { }).callPackage ./. { }"

ビルドが完了すると、./resultにビルドの成果物が生成されます。実行してみましょう。

$ ./result/bin/sk

無事に実行ができました!

home-manager内で使用する

home-managerから使用したい場合は、

{ ... }:
let
  pkg = (import <nixpkgs> { }).callPackage ./skim.nix { };
in
{
  home.packages = [ pkg ];
}

のように、default.nixを適当なファイル名に変えて、そのファイルをcallPackageで呼び出してあげれば大丈夫です。。

おわりに

もしnixpkgsにないパッケージをビルドできたら、nixpkgsにPRを送ってください。みんな喜ぶと思います。

GitHubで編集を提案

Discussion