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 というものの存在をご教示いただいたので、そっちでやる方が良さそう。

参考資料

0 件のコメント:

コメントを投稿