はじめに
最近のお気に入りの開発環境は devbox です。Microsoftの Dev Box と名前がかぶっているため、ややこしいですが、ここでの devbox は Jetify devbox(以下、devbox)のことです。
devbox を使用すると、Docker のような起動待ちや煩わしいコマンド入力といった面倒な作業が軽減され、npm や yarn と同じような感覚で環境を立ち上げることができます。
複雑なプロジェクトや、Docker 環境でそのままデプロイしたい場合は Docker が適していますが、簡単な個人プロジェクトなどでは devbox が快適です。VSCode に拡張機能を追加すれば、プロジェクトを VSCode で開くだけで開発環境のシェルが起動し、爆速でコーディングを始めることができます。
- devboxとは
- Dockerとの違い
- devboxのインストール
- 環境の構築
- パッケージの探索と追加
- パッケージの追加方法
- バージョンを指定してパッケージを追加
- 特定のプラットフォームでのみ使用されるパッケージの追加
- 特定のプラットフォームのみ除外されるパッケージの追加
- devboxで共通のパッケージを追加
- パッケージの更新
- パッケージの削除
- グローバルインストールしたパッケージのリスト
- グローバルインストールしたパッケージの削除
- シェルを開く
- 環境を共有する
- devboxのshell内ではなく、ホストでパッケージを使いたい場合
- スクリプトの実行
- devbox.jsonに記述せずに実行したい場合
- C拡張機能のコンパイルを許可する
- サービスの開始
- サービスの停止
- パッケージの情報の確認
- 設定ファイルの変更
- プラグインのライフサイクル
- Dockerfileの生成
devboxとは
devboxは開発者向けのコマンドラインツールで、簡単に独立した開発用シェルを作成できます。プロジェクトに必要なパッケージを指定すると、devboxはそれらのパッケージをインストールした独立した環境を構築します。
通常のパッケージマネージャーと同様の使い方をしますが、devboxが管理するのはオペレーティングシステムレベルのパッケージです。
Dockerとの違い
特徴 | devbox | Docker |
開発環境 | プロジェクトに必要なパッケージをリストアップして、それらをインストールした環境を構築。 | 完全な実行環境を構築。 |
環境の汚染防止 | 他の環境と分離。新しいツールやパッケージを試す際に環境を汚すことなく利用できる。 | Dockerコンテナも独立した環境だが、ファイルシステムやネットワークにアクセスするためにはDockerコマンドを使用する必要があり。 |
速度 | 立した環境を作成するため、追加の仮想化層を必要としない。シェルやコマンドの遅延がない。 | 仮想化技術を使用するため、システムリソースが追加される分、実行速度に制約が生じることがある。 |
バージョンの衝突回避 | プロジェクトごとに独自の環境を提供するため、異なるプロジェクトで必要な異なるバージョンのパッケージを使い分けることができる。 | 環境を分離するためバージョンの衝突を回避するが、Devboxのような細かな制御はできない。 |
ポータビリティ | 環境はポータブル、一度定義すれば、複数の方法で利用できる。(devbox shell、クラウドでのリモート開発環境など) | 環境はポータブルだが、devboxのように開発と本番環境の間でシームレスに切り替えることはできない。 |
devboxのインストール
devboxのインストール手順はこちらを参照してください。
環境の構築
新しいディレクトリを作成し、devbox initでDevboxを初期化します。gitやnpmなどと同じような感覚で始めることができます。
$ mkdir devbox_test
$ cd devbox_test
$ devbox init
Bashパッケージの探索と追加
Pythonなどのパッケージを探すには次のコマンドを打ちます。
$ devbox search python3
Found 28+ results for "python":
- python (3.13.0a2, 3.13.0a1, 3.12.1, 3.12.0, 3.12.0rc3, 3.12.0rc2, 3.12.0b4, 3.12.0b3, 3.12.0b2, 3.12.0b1)
- python-qt (3.4.2, 3.3.0, 3.2)
- python-full (3.13.0a2, 3.13.0a1, 3.12.1, 3.12.0, 3.11.6, 3.11.5, 3.11.4, 3.11.3, 3.11.2, 3.11.1)
- python2nix (20140927)
- pythonIRClib (0.4.8)
- python-minimal (3.11.6, 3.11.5, 3.10.12, 3.10.11, 3.10.10, 3.10.9, 3.10.8, 3.10.7, 3.10.6, 3.10.5)
- python-launcher (1.0.0)
- mate.python-caja (1.26.0, 1.24.0)
- sourcehut.python (3.11.6, 3.11.5, 3.10.12, 3.10.11, 3.10.10, 3.10.9, 3.10.8, 3.10.7, 3.10.6, 3.10.5)
- python27Packages.python (2.7.18)
Warning: Showing top 10 results and truncated versions. Use --show-all to show all.
Bashパッケージの追加方法
$ devbox add python
BashNixを使用しているため、パッケージ名はNixのパッケージリスト名で指定する必要があります。
パッケージの追加や削除をすると、devbox.jsonが更新されます。
バージョンを指定してパッケージを追加
$ devbox add python@3.10
Bash特定のプラットフォームでのみ使用されるパッケージの追加
$ devbox add python3 --platform x86_64-linux,aarch64-linux
Bashこの場合、Linux環境でDevboxを使用する場合にのみpython3が追加されます。他の環境やプロジェクトと共有する際に特定のバージョンで問題が生じる場合などに役立ちます。
特定のプラットフォームのみ除外されるパッケージの追加
$ devbox add python3--exclude-platform aarch64-darwin
Bashこの場合、ARM Mac環境ではpython3のパッケージがインストールされません。
プラットフォーム指定でサポートされているプラットフォーム
プラットフォーム | 説明 |
aarch64-darwin | ARM64 マシン上の macOS (Apple Silicon) |
aarch64-linux | ARM64 アーキテクチャを実行する Linux 環境 ( Raspberry PiやNVIDIA Jetsonなど) |
x86_64-darwin | Intel/AMD 64-bit マシン上の macOS (2020年以前のモデルなど) |
x86_64-linux | Intel/AMD 64-bit アーキテクチャを実行する Linux 環境 |
devboxで共通のパッケージを追加
Devboxでは、グローバルなパッケージも追加することができます。node install -g のイメージです。
$ devbox global add python3
Bashこのコマンドを実行すると、python3がグローバルに追加され、Devboxの設定ファイルであるdevbox.jsonには、追加したパッケージが自動的に記録されます。また、グローバルに追加されたパッケージの設定ファイルはホームディレクトリに作成されます。ホームディレクトリは、Linux環境で、cd ~ を実行すると表示されるディレクトリです。
devboxがインストールされていれば、devbox.json を使って環境をコピーすることができます。これにより、作業マシンの変更や環境移行が簡単に行えます。この機能が非常に便利です。
パッケージの更新
$ devbox update
Bashパッケージの削除
$ devbox rm python3
Bashグローバルインストールしたパッケージのリスト
$ devbox global list
Bashグローバルインストールしたパッケージの削除
$ devbox global rm python3
Bashシェルを開く
devboxでインストールしたパッケージを使用するには、devbox init を行ったディレクトリで以下のコマンドを入力します。
$ devbox shell
BashdevboxにPythonなどのパッケージを追加した場合、devbox shell を使用してシェルを開き、以下のようにしてPythonのバージョンを確認できます。(以下、devbox shellを実行した後の画面です)
$ python --version
Python 3.10.0
ShellScript環境を共有する
devbox.jsonとdevbox.lockをソース管理に含めます。他の開発者はdevboxの環境を構築し、プロジェクトを開くだけで開発を進めることができます。
gitを使っている場合、.devboxディレクトリは .gitignoreに追加します。特に .devbox/virtenv/<package_name>.envを含める事を忘れないようにします。
devboxのshell内ではなく、ホストでパッケージを使いたい場合
~/.bashrc や ~/.zshrc などに以下の行を追加します。
$ eval "$(devbox global shellenv)"
Bash一時的に使いたい場合は以下のコマンドを使用します。
$ . <(devbox global shellenv)
ShellScriptスクリプトの実行
npmを使用している方にはなじみのある npm run dev のようなものです。devbox.jsonのinit_hook やscriptsに追記します。
"shell": {
"init_hook": "echo \"Hello \"",
"scripts": {
"echo_once": "echo \"World\"",
"echo_twice": [
"echo \"World\"",
"echo \"Again\""
]
}
}
JSONinit_hook は、シェルを起動する際に実行されるスクリプトです(主に環境変数やエイリアスの設定に使用します)。環境変数をカスタマイズしたい場合は、devbox.jsonのinit_hookで環境変数を上書きします。上書きしない場合は、ローカルマシンの環境変数が引き続き使用されるので注意が必要です。
$ devbox run echo_once
Nixパッケージのインストール中... 完了。
Devboxシェルを起動中...
Hello
World
$ devbox run echo_twice
Nixパッケージのインストール中... 完了。
Devboxシェルを起動中...
Hello
World
Again
Bashdevbox.jsonに記述せずに実行したい場合
例として、ポート番号 80 の状態を調べるには、以下のコマンドを使用します。
$ devbox run lsof -i :80
BashC拡張機能のコンパイルを許可する
devbox.jsonのinit_hookに以下の内容を記述する。
"export NIX_CFLAGS_COMPILE=\"$NIX_CFLAGS_COMPILE $(cat $(dirname $(which clang))/../nix-support/libcxx-cxxflags)\""
Bashサービスの開始
$ devbox services start nginx
Bashサービスの停止
$ devbox services stop nginx
Bashパッケージの情報の確認
$ devbox info nginx
Bash設定ファイルの変更
devboxでは、devbox.dディレクトリにある設定ファイル(例: ngin.conf)を直接編集して環境をカスタマイズすることができます。
プラグインのライフサイクル
devboxのプラグインに関する情報は、以下のリンクから確認できます。
Dockerfileの生成
$ devbox generate dockerfile
Bash生成されたコンテナ内でも devbox が使用されていたり、ユーザーが追加されていたりするため、後々のことを考えると自分で書いた方が良いかもしれません。
まとめ
devboxは開発者にとって効率的な環境を提供し、プロジェクトの開始をスムーズにします。一度試しにdevboxを使ってみてはいかがでしょうか?