🐕

Devboxで始めるNix入門|miseから移行して分かったメリットと注意点

に公開

こんにちは。株式会社アップルワールドのrikuです。

今まではmiseを利用してローカルで開発環境を構築することが多かったのですが、開発環境をプロジェクト単位で閉じ込めた形にしたく、Devboxを導入してみることにしました。DevboxはNixをベースにした開発環境ツールで、内部でNixを利用します(詳細は公式ドキュメント参照)。
https://www.jetify.com/docs

はじめに

この記事で紹介する内容は、Devboxの公式ドキュメントを読めば書いてあることばかりですが、私の視点からもDevboxの素晴らしさを伝えさせてください。
主に以下の内容について解説します。

  • DevboxがNixの何を楽にしてくれるのか
  • 実際の初期セットアップ手順
  • miseと併用したときの注意点

なぜDevboxを選んだのか?

実は元々Nixを導入しようと考えていましたが、学習コストの高さから敬遠していました。そこで、Nixの複雑な部分を抽象化して使いやすくしてくれたDevboxを使えば比較的簡単に誰でも同じ環境を構築できるのでは?と思ったのがきっかけです。
Devboxを知ったのは以下の記事です。
https://qiita.com/suin/items/3ec298a4172fdf6f60b6

Devboxを採用するメリット

Nixと比較して圧倒的シンプルさが魅力です(あくまでNixのドキュメントを読んだ上での感想です)。
素のNixを使えるならそれに越したことはないでしょうが、大変そうなので私は諦めました。
https://nix.dev/tutorials/nix-language.html
https://zenn.dev/asa1984/books/nix-introduction
https://zenn.dev/asa1984/books/nix-hands-on


1. 導入コストが低い

Nix独自構文に触れずに抽象化されたインターフェースから環境構築出来る点が素晴らしいです。また、後ほど解説しますが、ドキュメントを読みながら進めれば特に迷わずdevbox(Nix)による恩恵を受けられます。私の場合は5分程度で完了しました。最高ですね。
https://www.jetify.com/docs/devbox/installing-devbox


2. チーム全員で同じ開発環境を利用できる

devbox.jsonファイルでプロジェクトに必要なツールの一覧を宣言し、devbox shellを実行するだけで、プロジェクトに関わる全員がまったく同じバージョンのツールを備えたシェル環境を利用できます。
ScriptsをJSONで管理できるのも素晴らしいなと思うポイントの1つです。
https://www.jetify.com/docs/devbox/guides/scripts

Scriptsのサンプル

https://github.com/jetify-com/devbox/tree/main/examples/stacks/lapp-stack


3. devbox.json最高

Nixの独自構文を覚える必要がなく、devbox.jsonで利用するパッケージが管理できます。また、ほとんどの開発者が学習コストなしに読めるというメリットも大きいですね。
https://www.jetify.com/docs/devbox/configuration


4. プラットフォーム固有パッケージのインストールが簡単

例えばLinuxプラットフォームでのみ使用したいパッケージがある場合、以下のように--platformで指定することで可能です。

devbox add busybox --platform x86_64-linux,aarch64-linux

excludeによる除外設定も可能です。

devbox add ripgrep --exclude-platform aarch64-darwin

https://www.jetify.com/docs/devbox/guides/platform-specific-packages
※各コマンドは公式ドキュメントから引用しました


5. 仮想化レイヤーのオーバーヘッドがないため、高速に動作する

公式は“仮想化レイヤーなしでローカルに隔離環境を作れる”ことを強調しています。

Don’t sacrifice speed​
Devbox can create isolated environments right on your laptop, without an extra-layer of virtualization slowing your file system or every command. When you’re ready to ship, it’ll turn it into an equivalent container – but not before.

スピードを犠牲にしない
Devbox は、ファイルシステムや各コマンドの実行を遅くしてしまう余分な仮想化レイヤーを使うことなく、あなたのノートパソコン上に直接、分離された環境を作成できます。
そして、いざリリースするときには、それを同等のコンテナに変換します ―― ただし、それまでは変換しません。
(日本語はChatGPT5.2による翻訳)

Dockerなどと比較して仮想化レイヤーを使用しないため高速な動作が期待されるそうです。通常、Dockerを使用する場合、ファイルシステムへのアクセスやコマンド実行のたびに仮想化レイヤーを経由する必要があるので、ネイティブ環境で動作するのは嬉しいですね。
このあたりは一長一短ありそうですが、運用をしていく中でもう少し探っていきたいです。


6. DevboxからDockerfileなどのファイルが生成可能

DevboxからDockerfileやdevcontainer.jsonなどのファイルを生成できます。
複雑なことをやろうとすると結局自分で書いた方が早そうですが、小〜中規模なアプリケーションでサクッとデプロイしたいという要望があれば便利そうです。
https://www.jetify.com/docs/devbox/cli-reference/devbox-generate

7. devbox servicesからPostgreSQLやnginxなども起動可能

miseとの比較として機能の豊富さが上げられます。バージョン管理やタスクランナーに留まらず、プロジェクト単位でDBまで管理できるのはとても素晴らしい点ですね。
https://www.jetify.com/docs/devbox/guides/services/index#running-services

さっそくインストールしてみる

というわけで、前置きが長くなりましたがさっそくDevboxをインストールしていきます。
私の環境は以下の通り。

  • macOS 15.2(Sequoia)
  • Apple Silicon(M3 Pro)

公式ドキュメントに従って以下のコマンドを実行するとDevboxがインストールされます。

curl -fsSL https://get.jetify.com/devbox | bash

ドキュメントにはNixもインストールしてくださいと書かれていますが、私の環境ではdevbox addを実行時にNixをインストールしてくれました。
自前でNixをインストールしたい場合はDeterminate Nix Installerを利用すると良いみたいですね。
https://determinate.systems/nix-installer/

作業ディレクトリを作成

Devboxのインストールが完了したら、作業ディレクトリを作成します。今回はmy-projectという名前にしておきます。

mkdir my-project && cd my-project

Devboxを初期化する

環境構築の際に毎回必要です。初期化を忘れて各種コマンドを実行するときちんと怒ってくれます。

devbox init

goの最新バージョンを利用する

今回はgo@latestを指定してみます。

devbox add go@latest

Nixがインストールされていない場合、以下のメッセージが出るのでEnterで続行

Nix is not installed. Devbox will attempt to install it.

Press enter to continue or ctrl-c to exit.

端末のパスワード入力を求められるので入力してEnterで続行

 INFO nix-installer v3.15.1
`nix-installer` needs to run as `root`, attempting to escalate now via `sudo`...
Password:

以下の表示が出ます。これで準備が整いました。

# 一部抜粋
Nix was installed successfully!
To get started using Nix, open a new shell or run `. /nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh`

Nix installed successfully. Devbox is ready to use!
Info: Adding package "go@latest" to devbox.json
Info: Installing the following packages to the nix store: go@latest

Devboxのシェルを起動する

以下のコマンドを実行してDevboxによる隔離されたシェル環境を起動できます。

devbox shell

起動後は、シェル名の先頭に(devbox)という文字列が追加されています。

シェルから抜ける

Devboxのシェルから抜ける時は以下のコマンドを実行してください。これはNixと同じみたいですね。シンプルで素晴らしい。

exit

少しハマったポイント: Devbox環境でmiseのPATHを読みにいってしまう

元々miseを使ってglobalにgoをインストールしていたせいですが、Devboxで立ち上げたシェル内でgoが最新バージョンになっていないことに気づきました。

# (devbox)内で実行

go version
# 出力結果
# go version go1.23.4 darwin/arm64

which go
# 出力結果
# /.local/share/mise/installs/go/1.23.4/bin/go

mise管理のgoじゃん...。

ということで解決策を調べました。


1. devbox shell --pureを使う

シェル起動時に--pureオプションを利用することでHOME, USER, DISPLAY以外の既存環境変数を全て無視して開発環境を立ち上げてくれました。

devbox shell --pure

起動後、goのバージョン確認を行うと最新の1.25.4が認識されました。

go version
# 出力結果
# go version go1.25.4 darwin/arm64

https://www.jetify.com/docs/devbox/cli-reference/devbox-global-shellenv/index#devbox-global-shellenv


2. globalでmiseを使わないようにする

そもそもglobalを汚染しないのが一番ですね。
mise unuseやmise uninstallを使えばmiseからgoを利用しないようにできます。

unuseを使う

uninstallと違ってmise.tomlも更新してくれるそうです。
今回はgo@1.21を指定してglobalからさようなら。

mise unuse -g go@1.21

ちなみに、-gオプションをつけなくても、指定したバージョンがどのプロジェクトでも使用されていない場合は本体ごと削除してくれるそうです。便利。
https://mise.jdx.dev/cli/unuse.html

uninstallを使って全削除する

何も考えたくないときにおすすめです。mise経由でインストールした全てのgoを削除します。

mise uninstall go --all

https://mise.jdx.dev/cli/uninstall.html

再度Devboxのシェルを立ち上げてgoのバージョンを確認する

無事miseからgoが去っていったので再度確認してみましょう。

go version
# 出力結果
# go version go1.25.4 darwin/arm64
which go
# 出力結果
# /my-project/.devbox/nix/profile/default/bin/go

.devbox配下のgoを参照しているようですね。実態はシンボリックリンクで、リンクを辿ると/nix/store下に保存されているgoのバイナリが見つかるはずです。

まとめ

miseと比較してDevbox(Nix)は以下の点が優れていると感じました。

  • global環境を汚染しない隔離シェルの存在
  • OSレベル依存までまとめて揃えやすい
  • devcontainer/Dockerfileへの展開もしやすい
  • devbox servicesを利用してDBなども起動対象にできる

個人的にNixは導入コストがやや重たいので、チームで導入するにはハードルがやや高いと感じていました。DevboxはNixの大変な部分をいい感じに抽象化して使いやすくしてくれているので、比較的誰にでもおすすめしやすいです。
皆さんもぜひ使ってみてください。

https://www.jetify.com/docs

おまけ: 公式ドキュメントの検索機能が手厚い

最近では当たり前なのかもしれませんが、ドキュメント検索にAIアシスタントが搭載されていたので公式ドキュメント内で検索したら即解決しました。いい時代になったなぁ...

参考にした記事など

https://zenn.dev/shimarisu_121/articles/12cbe01ee9fbe8
https://qiita.com/suin/items/3ec298a4172fdf6f60b6
https://zenn.dev/saitom_tech/articles/devbox_start
https://zenn.dev/kun432/scraps/987dcea3d08222
https://www.publickey1.jp/blog/22/dockerdevbox_020.html
https://zenn.dev/asa1984/books/nix-introduction/viewer/11-flakes
https://determinate.systems/nix-installer/

アップルワールド Tech Blog

Discussion