jetify devboxの使い方

プログラミング

はじめに

最近のお気に入りの開発環境は devbox です。Microsoftの Dev Box と名前がかぶっているため、ややこしいですが、ここでの devbox は Jetify devbox(以下、devbox)のことです。

devbox を使用すると、Docker のような起動待ちや煩わしいコマンド入力といった面倒な作業が軽減され、npm や yarn と同じような感覚で環境を立ち上げることができます。

複雑なプロジェクトや、Docker 環境でそのままデプロイしたい場合は Docker が適していますが、簡単な個人プロジェクトなどでは devbox が快適です。VSCode に拡張機能を追加すれば、プロジェクトを VSCode で開くだけで開発環境のシェルが起動し、爆速でコーディングを始めることができます。

devboxとは

devboxは開発者向けのコマンドラインツールで、簡単に独立した開発用シェルを作成できます。プロジェクトに必要なパッケージを指定すると、devboxはそれらのパッケージをインストールした独立した環境を構築します。

通常のパッケージマネージャーと同様の使い方をしますが、devboxが管理するのはオペレーティングシステムレベルのパッケージです。

Dockerとの違い

特徴devboxDocker
開発環境プロジェクトに必要なパッケージをリストアップして、それらをインストールした環境を構築。完全な実行環境を構築。
環境の汚染防止他の環境と分離。新しいツールやパッケージを試す際に環境を汚すことなく利用できる。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
Bash

Nixを使用しているため、パッケージ名はNixのパッケージリスト名で指定する必要があります。

NixOS Search

パッケージの追加や削除をすると、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-darwinARM64 マシン上の macOS (Apple Silicon)
aarch64-linuxARM64 アーキテクチャを実行する Linux 環境 ( Raspberry PiやNVIDIA Jetsonなど)
x86_64-darwinIntel/AMD 64-bit マシン上の macOS (2020年以前のモデルなど)
x86_64-linuxIntel/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
Bash

devboxにPythonなどのパッケージを追加した場合、devbox shell を使用してシェルを開き、以下のようにしてPythonのバージョンを確認できます。(以下、devbox shellを実行した後の画面です)

$ python --version

Python 3.10.0
ShellScript

環境を共有する

devbox.jsondevbox.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\""
    ]
  }
}
JSON

init_hook は、シェルを起動する際に実行されるスクリプトです(主に環境変数やエイリアスの設定に使用します)。環境変数をカスタマイズしたい場合は、devbox.jsonのinit_hookで環境変数を上書きします。上書きしない場合は、ローカルマシンの環境変数が引き続き使用されるので注意が必要です。

$ devbox run echo_once
Nixパッケージのインストール中... 完了。
Devboxシェルを起動中...
Hello
World

$ devbox run echo_twice
Nixパッケージのインストール中... 完了。
Devboxシェルを起動中...
Hello
World
Again
Bash

devbox.jsonに記述せずに実行したい場合

例として、ポート番号 80 の状態を調べるには、以下のコマンドを使用します。

$ devbox run lsof -i :80
Bash

ここで使用している「lsof」は、システム上で開かれているファイルやネットワークソケットなどの情報をリストアップするためのLinuxコマンドです。この場合、ポート番号80を使用しているプロセスに関する情報を表示します。

C拡張機能のコンパイルを許可する

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を使ってみてはいかがでしょうか?

タイトルとURLをコピーしました