ラベル Nix の投稿を表示しています。 すべての投稿を表示
ラベル Nix の投稿を表示しています。 すべての投稿を表示

2025年1月11日土曜日

nix-shell で開発環境の構築をしてみる

Dev container の代替になると聞き、Nix に入門してみたので、とりあえず開発環境を構築してみる。

目標

Nix で、 Node.js + PostgreSQL の開発環境を整えてみる。

前提

  • OS: Ubuntu 24.04 LST on Windows 11 Pro
  • DB: PostgreSQL 17
  • Node.js: 20.18.1

Nix のインストールと初期設定

インストール

Download | Nix & NixOS に記載のコマンドを実行する。

sh <(curl -L https://nixos.org/nix/install) --daemonexperimental-features = nix-command flakes

実験的機能の有効化

echo 'experimental-features = nix-command flakes' | sudo tee -a /etc/nix/nix.conf

開発環境定義

shell.nix を作成し、そのディレクトリで nix-shell を実行すると、 shell.nix で定義した通りの開発環境を準備してくれる。

各定義の意味はコード内のコメントを参照。

shell.nix:

let
  # 変数定義
  nixpkgs = fetchTarball "https://github.com/NixOS/nixpkgs/tarball/nixos-24.11";
  pkgs = import nixpkgs { config = {}; overlays = []; };
  USER = (builtins.getEnv "USER");
  DEV_INFRA_DIR = (builtins.getEnv "PWD") + "/infra/postgres";
in

pkgs.mkShellNoCC {
  # インストールパッケージ指定
  packages = with pkgs; [
    vim
    nodejs
    postgresql_17
  ];

  # 環境変数指定
  DATABASE_URL = "postgres://" + USER + ":postgres@localhost/postgres";
  POSTGRES_PASSWORD = "postgres";
  POSTGRES_USER = USER;
  POSTGRES_DB = "postgres";
  POSTGRES_HOSTNAME = "localhost";
  PGDATA = DEV_INFRA_DIR + "/data";

  # 起動時に実行するコマンドを指定
  # (今回は PostgreSQL の初期化と起動)
  shellHook = ''
    mkdir -p $PG_DATA
    pg_ctl init
    pg_ctl start -l ${DEV_INFRA_DIR}/pg.log
  '';

開発

nix-shell でインストールした vim を使ってソースコードを書く

DB 接続するプログラムを載せるのが面倒なので省略。

mikoto2000/LibrarySystem-React-Router: 架空の図書貸出管理システム に前述の shell.nix を入れて実行したらちゃんとつなげられた。

終了

自動終了は実装できないので、 pg_ctl で終了してから nix-shell を抜ける。

pg_ctl stop
exit

以上。

ただ、すでに某所で devShell というものの存在をご教示いただいたので、そっちでやる方が良さそう。

参考資料

2024年12月3日火曜日

Nix で Vim をスタティックリンクビルドする。ついでにクロスコンパイルもする

この記事はなに?

mikoto2000/devcontainer.vim の ARM 対応で、 ARM 版のスタティックリンクな Vim が必要になった。

vim-jp にて「Nix ならコマンド一発でできるよ」と教えてもらったのでやってみた。

前提

  • Docker: Docker version 27.3.1, build ce12230
  • 使用イメージ: nixos/nix

Nix のリポジトリアップデート

nix-channel --update

スタティックリンクビルド

nix-build '<nixpkgs>' --cores 20 -A pkgsStatic.vim
  • --cores: make でいうところの -j オプション

aarch64 のクロスコンパイル&スタティックリンクビルド

nix-build '<nixpkgs>' --cores 20 -A pkgsCross.aarch64-multiplatform.pkgsStatic.vim

ビルドされた Vim の場所

find で探しましょう。

bash-5.2# find /nix -name vim
/nix/store/jx5d1dp77cwkarvalh1l8zvfp2ziqzlw-vim-static-aarch64-unknown-linux-musl-9.1.0787/share/vim
/nix/store/jx5d1dp77cwkarvalh1l8zvfp2ziqzlw-vim-static-aarch64-unknown-linux-musl-9.1.0787/bin/vim
/nix/store/7wkl9dji0dq6v7nmdjp1d72wd5pydqpb-vim-static-x86_64-unknown-linux-musl-9.1.0787/share/vim
/nix/store/7wkl9dji0dq6v7nmdjp1d72wd5pydqpb-vim-static-x86_64-unknown-linux-musl-9.1.0787/bin/vim
/nix/store/gnzqq5zg8r55apxa5avlb5yp0ix8qdwk-nixpkgs/nixpkgs/pkgs/applications/editors/vim
/nix/store/gnzqq5zg8r55apxa5avlb5yp0ix8qdwk-nixpkgs/nixpkgs/pkgs/test/vim
/nix/store/yzqnkb2mfzphmhv3248pw0pqh6f1mn6y-7sprarsdfz9qcd7859phvr9nvhi14mri-source/pkgs/applications/editors/vim
/nix/store/yzqnkb2mfzphmhv3248pw0pqh6f1mn6y-7sprarsdfz9qcd7859phvr9nvhi14mri-source/pkgs/test/vim

bin 下のが目的のバイナリですね。

share の方にはランタイムが入っています。

パッケージング

Vim は、ランタイムと一緒に配布しないと上手く動かないので、パッケージングを行う。 さらに、ランタイムの場所はビルド時に決め打ちされるため、 VIM 環境変数を上書きして Vim を起動するシェルスクリプトを用意し、それ経由で実行してもらうようにする。 (今回の場合は AppRun というシェルスクリプトを用意)

# aarch64 のパッケージング
cp -a /nix/store/jx5d1dp77cwkarvalh1l8zvfp2ziqzlw-vim-static-aarch64-unknown-linux-musl-9.1.0787 vim-9.1.0787-aarch64
cd vim-9.1.0787-aarch64
cat << "EOF" > ./AppRun
#!/bin/sh
CURRENT_DIR="$(dirname "$(realpath "$0")")"
export VIM="${CURRENT_DIR}/share/vim/"
exec "${CURRENT_DIR}/bin/vim" "$@"
EOF
chmod a+x ./AppRun
cd ..
tar zcfv ./vim-9.1.0787-aarch64.tar.gz vim-9.1.0787-aarch64

# aarch64 のパッケージング
cp -a /nix/store/7wkl9dji0dq6v7nmdjp1d72wd5pydqpb-vim-static-x86_64-unknown-linux-musl-9.1.0787 vim-9.1.0787-x86_64
cd vim-9.1.0787-x86_64
cat << "EOF" > ./AppRun
#!/bin/sh
CURRENT_DIR="$(dirname "$(realpath "$0")")"
export VIM="${CURRENT_DIR}/share/vim/"
exec "${CURRENT_DIR}/bin/vim" "$@"
EOF
chmod a+x ./AppRun
cd ..
tar zcfv ./vim-9.1.0787-x86_64.tar.gz ./vim-9.1.0787-x86_64

これで、「ダウンロードした tar.gz を展開して、その中の AppRun を実行すれば vim が起動する」という感じになります。

devcontainer.vim で必要なので、このスタティックリンクな Vim を mikoto2000/vim-static: Distributing a static link binary for vim/vim. で配布予定です。

以上。

参考資料