❄
nix-initを使って簡単にNixでパッケージングを行う
対象者
- 普段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を送ってください。みんな喜ぶと思います。
Discussion