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