Nix と VSCode で Scala 開発環境を構築する
こんにちは. Funds のサーバーサイドエンジニアの上村です. 2024年1月に JOIN してからチマチマ検証を重ねていた Nix を使った開発環境が落ち着いてきたのでエントリー的に記事を書いてみます.
Funds のサーバーサイドではプログラミング言語 Scala を使用しています.
Scala の開発では IntelliJ IDEA を使用するのが一般的だと思います. (多分, 知らんけど.) が, 長らく IntelliJ IDEA を使っていなかったので最近使っている Nix と VSCode で開発環境を整えることにしました. マイナーケースで有益な情報かな?という事で記事に起こしてみます.
Nix を使っている理由は自由度と再現度が高い, VSCode を使っている理由は Devcontainer で仮想環境内で開発できる所でしょうか.
構成
下記の環境・ツール・設定ファイルでプロダクト毎の開発環境を管理します.
環境
MacBook Pro 16-inch 2023
Chip: Apple M2 Pro
macOS: Sonoma 14.5
ツール
設定ファイル
.vscode/settings.json
.envrc
flake.lock
flake.nix
.gitignore
各種ツール
Nix Flakes is 何?
アプリケーションのパッケージマネージャーとして使用している Nix をどうやって説明したものか 🤔 と悩んでいたのですが, とても良い入門記事が最近公開されたのでそちらにお任せします.
下記が Scala 開発に必要なアプリケーションを宣言した flake.nix になります.
{
description = "scala-develop";
inputs = {
nixpkgs.url = "github:nixos/nixpkgs?ref=24.05";
utils.url = "github:numtide/flake-utils";
};
outputs = { self, nixpkgs, utils }:
utils.lib.eachDefaultSystem (system:
let
config = {
allowUnfree = true;
};
overlays = [
(final: prev: {
sbt = prev.sbt.overrideAttrs (oldAttrs: {
postPatch = "";
});
})
];
pkgs = import nixpkgs {
inherit system;
overlays = overlays;
config = config;
};
in
{
devShells.default = pkgs.mkShell {
buildInputs = with pkgs; [
sbt
scala-cli
temurin-bin
];
};
});
}
flake.nix で宣言された devShells 環境を nix develop コマンドで構築します. 各アプリケーションの実態は /nix/store 配下に保存されます.
$ nix develop
bash-5.2$ echo $JAVA_HOME
/nix/store/r2986dyv67zxw68lys1j7had34i4xsnb-temurin-bin-21.0.1
bash-5.2$ which sbt
/nix/store/nvx4iv31a4xwkzfzs01gnr29vf854brh-sbt-1.10.0/bin/sbt
bash-5.2$ which scala-cli
/nix/store/phpli14pidfphr2l7nidxm668ixzni7y-scala-cli-1.3.1/bin/scala-cli
bash-5.2$
CPU アーキテクチャや OS ライブラリに強く依存したプロダクト開発であれば適切な CPU アーキテクチャの VM 上に VSCode の Devcontainer で開発環境を丸ごと仮想化するのが良いと思います. 環境の制約がなければ開発端末の計算資源を素直に使う選択が可能となり Nix を使用できます.
Nix をビルドツールとして活用してデプロイ用のイメージもビルドしたい!という方は次の記事が参考になります.
nix-direnv is 何?
direnv はディレクトリ毎に環境変数を設定できるツールです. .envrc ファイルに記述されたスクリプトを実行してくれます. 拡張された nix-direnv では use flake と記述することで flake.nix の devShells 環境を構築してくれます.
use flake
VSCode
Metals Extensions を使用するにあたり .vscode/settings.json の metals.javaHome に Nix で導入した JAVA_HOME を設定します.
{
"metals.javaHome": "/nix/store/r2986dyv67zxw68lys1j7had34i4xsnb-temurin-bin-21.0.1",
}
nix-direnv や VSCode のインストールも Nix で管理すれば良いのでは 🤔 という発展系も考えられますが, ユーザー環境の構成を home-manager で管理する等々は入門には複雑なので割愛します.
開発環境を動かしてみる
VSCode で対象となる Scala プロジェクトを開きます.
$ code path/to/scala/project
VSCode の Terminal を開くと Nix で導入した各種アプリケーションが使用できる状態になっています. プロダクト毎の開発環境の設定ファイルを git で管理しておけば開発メンバー間で同一環境を再現することが可能となります.
実務でどこまで導入している?
Nix のエラーメッセージに Elm や Rust のような親切さはありません 😇 トラブルシューティングは骨が折れます. まだ Nix に詳しいと言える程の運用実績がないので社内で標準的なツールに至っていません. もっと具体的にいうと Nix と VSCode で Scala 開発をしているのは1名です! git stash で構成内容を管理して個人的に使用しています.
採用情報
堅牢なシステム開発にご興味のある方はぜひご覧ください.