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

Devboxを使ってRailsプロジェクトを立ち上げてみる
Photo by Hunter Haley / Unsplash
ローカル環境を汚さずDockerコンテナのオーバーヘッドもなく、開発環境を自在に構築できる「Devbox 0.2.0」登場
Dockerコンテナの技術を用いることで、プログラミング言語のランタイムやライブラリ、ミドルウェアなどの開発環境一式を比較的容易に導入することが可能になりました。 ただしDockerコンテナにもファイルシステムのオーバーヘッドなどがあり、D…

記事を見てDevboxのことを知りました。

経緯

Docker(仮想環境)の登場で、プロジェクト毎のGemやMySQL、PostgreSQLなどのバージョンの差異を気にすることなく開発出来るようになったのは非常に良かったんですが、Dockerはパフォーマンスの面で問題になることが多く、また、チームの規模が大きくなると有料になります。

この辺の問題を解決するために、Docker互換の別の仮想環境ツールである、Rancher Desktopを以前試したりもしました。

Docker DesktopからRancher Desktopに移行してDockerが高速になるか試す - deg84’s blog
Rancher DesktopからDocker Desktopに戻した話 - deg84’s blog

ですが、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が使いやすくなるイメージです。

実際に使ってみる

  1. Devboxをインストール
  2. 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を使っているのでこのような感じに。

anyenvnvmを使っている場合はその辺りの記述をifの中に入れると良さそうです。

Railsを立ち上げる

bin/rails db:create
bin/rails server -p 3000

さいごに

ということで、Railsを立ち上げるところまで試してみました。

一応、そのプロジェクトをGitHubにあげておきます。

GitHub - deg84/create-a-rails-project-using-devbox: Devboxを使ってRailsプロジェクトを立ち上げてみる記事で作ったサンプル
Devboxを使ってRailsプロジェクトを立ち上げてみる記事で作ったサンプル. Contribute to deg84/create-a-rails-project-using-devbox development by creating an account on GitHub.

まだ0.2.0ということでこれから変化もあるとは思いますが、nix自体は以前からあるものなので、ある程度安定して使えるんじゃないかなと思います。

それでは、良いDevboxライフを!

おまけ

使えるNixのパッケージ

使えるNixのパッケージはNix Packagesで探せます。

今回はRubyとNodeを使いましたが、Pythonとかもあります。

VS Code拡張でdevbox shellを自動化する

毎回devbox shellするのが面倒なんですが、VS Codeのターミナルを使っている場合にターミナルを開くと自動的にdevbox shellを実行してくれる拡張があります。

devbox by jetpack.io - Visual Studio Marketplace
Extension for Visual Studio Code - devbox integration for VSCode

ちなみに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行目のreturnexitに変更してください。

参考

Use exit instead of return in /etc/profile.d/nix-daemon.fish by SquidDev · Pull Request #7105 · NixOS/nix
Older versions of Fish (anything before 3.4) do not support using return outside of functions. While Fish 3.3 is a year old, it is the version packaged by Ubuntu LTS 22.04, so still sees significan…