Devboxを使ってRailsプロジェクトを立ち上げてみる


記事を見てDevboxのことを知りました。
経緯
Docker(仮想環境)の登場で、プロジェクト毎のGemやMySQL、PostgreSQLなどのバージョンの差異を気にすることなく開発出来るようになったのは非常に良かったんですが、Dockerはパフォーマンスの面で問題になることが多く、また、チームの規模が大きくなると有料になります。
この辺の問題を解決するために、Docker互換の別の仮想環境ツールである、Rancher Desktopを以前試したりもしました。


ですが、Rancher DesktopはRailsアプリケーションでのファイル変更検知が正常に機能しないという問題があり、Dockerに戻して使っています。
そんなこんなで今は泣く泣くDockerを使っている状態でした。そこに登場したのがDevboxです。
ここに出てくるDevboxはJetpack Technologiesが開発しているものになります。
Devbox by Jetpack.ioとは(Nixとは)
DevboxはNix Package Manager(以降、Nix)のラッパーです。
NixはLinuxディストリビューションに依存しない次世代のパッケージマネージャーで、様々なバージョンのソフトウェアを共存できるように作られています。
インストールされるパッケージはすべて、/nix/store
配下に保存され、パッケージの最上位ディレクトリには、そのパッケージを作るのに使用された入力すべてに基づく暗号化ハッシュが含まれています。
これによって、パッケージの複数バージョンが干渉しないようになり、依存関係の異なるバージョンが同時に管理できるようになります。
つまり、実はDockerで解決しようとしていた、プロジェクト間でのソフトウェアのバージョン差異についてはDevboxを使わずともNixを使えば解決できます。Devboxを使うことでよりNixが使いやすくなるイメージです。
実際に使ってみる
- Devboxをインストール
- Devboxで必要なものをインストール
Devboxをインストール
$ curl -fsSL https://get.jetpack.io/devbox | bash
Devboxで必要なものをインストール
devbox init
以下のファイルが生成されます。
{
"packages": [],
"shell": {
"init_hook": null
},
"nixpkgs": {
"commit": "52e3e80afff4b16ccb7c52e9f0f5220552f03d04"
}
}
Ruby 3.1、Node 16、PostgreSQLを使います。
$ devbox add ruby_3_1 nodejs-16_x postgresql_14
細かなバージョンを指定することは出来ないので、その点が若干気になるところではあります。
これであとはdevbox shell
を実行して、Devbox環境に入るだけです。
初回、実際にパッケージのインストールが走るので時間がかかります。
PostgreSQLの設定、起動
PostgreSQLの設定をします。
既にinitdb
コマンドが使えるようになっているはずです。
devbox shell
initdb
もしスーパーユーザーの名前を指定したければ、initdb --username hogehoge
とすれば、設定されます。何もなければ、実行しているマシンのユーザー名が設定されます。
PostgreSQLの起動は以下のようにすればOK。
$ devbox services start
コマンドやGUIツール等でPostgreSQLにアクセスしてみてください。
私の場合は、以下のURLでした。
postgresql://[username]@127.0.0.1/postgres
Railsプロジェクトを作る
下準備が出来たので、rails new
していきます。
railsコマンドを使うのでgemでインストール
gem install rails
rails new
していきます。
今回はDBにPostgreSQLを使うのでオプションで指定。
.devbox/virtenv/ruby_3_1/bin/rails new . -d postgresql_14
私の場合、ただのrails
だと/usr/bin/rails
を参照してしまったので.devbox/virtenv/ruby_3_1/bin/
にインストールされているrailsを使用しました。
2023/01/16追記
グローバルにインストールされているものを参照されてしまう問題は、PATHの優先度の問題っぽいです。
なので、DEVBOXが有効な場合はPATHを通さないようにしないと上手くいかないっぽいです。
devbox shell
を実行すると環境変数$DEVBOX_SHELL_ENABLED
が有効になるので、以下のような感じでシェルの設定ファイルを変更して上げるとよいです。
if not test $DEVBOX_SHELL_ENABLED
source /opt/homebrew/opt/asdf/libexec/asdf.fish
end
私の場合はasdf
を使っているのでこのような感じに。
anyenv
やnvm
を使っている場合はその辺りの記述をifの中に入れると良さそうです。
Railsを立ち上げる
bin/rails db:create
bin/rails server -p 3000

さいごに
ということで、Railsを立ち上げるところまで試してみました。
一応、そのプロジェクトをGitHubにあげておきます。
まだ0.2.0ということでこれから変化もあるとは思いますが、nix自体は以前からあるものなので、ある程度安定して使えるんじゃないかなと思います。
それでは、良いDevboxライフを!
おまけ
使えるNixのパッケージ
使えるNixのパッケージはNix Packagesで探せます。
今回はRubyとNodeを使いましたが、Pythonとかもあります。
VS Code拡張でdevbox shellを自動化する
毎回devbox shell
するのが面倒なんですが、VS Codeのターミナルを使っている場合にターミナルを開くと自動的にdevbox shell
を実行してくれる拡張があります。
ちなみにdevboxを使っていなくても実行されるので、使っているプロジェクトでだけ有効にするのが良いと思います。
トラブルシューティング
We found a /nix directory but nix binary is not in your PATH.
以下のエラーが出たらrcファイルに設定が必要です。
Error: We found a /nix directory but nix binary is not in your PATH. Try restarting your terminal and running devbox again. If after restarting you still get this message it's possible nix setup is missing from your shell rc file. See https://github.com/NixOS/nix/issues/3616#issuecomment-903869569 for more details.
.zshrc等に以下を追加する
if [ -e '/nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh' ]; then
source '/nix/var/nix/profiles/default/etc/profile.d/nix-daemon.sh'
fi
fishの場合はconfig.fishに以下を追加する
if test -e /nix/var/nix/profiles/default/etc/profile.d/nix-daemon.fish
source /nix/var/nix/profiles/default/etc/profile.d/nix-daemon.fish
end
fishを使っていて、nix-daemon.fishを読み込むとエラーになった場合
/nix/var/nix/profiles/default/etc/profile.d/nix-daemon.fish (line 3): 'return' outside of function definition
return
^
from sourcing file /nix/var/nix/profiles/default/etc/profile.d/nix-daemon.fish
called on line 12 of file ~/.config/fish/config.fish
from sourcing file ~/.config/fish/config.fish
called during startup
source: Error while reading file '/nix/var/nix/profiles/default/etc/profile.d/nix-daemon.fish'
この場合は、fishを3.4以上にアップデートする。
もしくは、/nix/var/nix/profiles/default/etc/profile.d/nix-daemon.fish
を開いて、3行目のreturn
をexit
に変更してください。