Open9

Devboxを試してみる

tf63tf63

セットアップ

https://www.jetify.com/docs/devbox/installing_devbox/

Devboxのインストール

  • Nixが入ってなかったら勝手に入れてくれるらしい
curl -fsSL https://get.jetify.com/devbox | bash

Devboxの初期設定

  • devbox.jsonが生成される
  • .devbox/も生成される (こっちは.gitignoreに追加したほうが良さそう)
devbox init
{
  "$schema": "https://raw.githubusercontent.com/jetify-com/devbox/0.14.2/.schema/devbox.schema.json",
  "packages": [],
  "shell": {
    "init_hook": [
      "echo 'Welcome to devbox!' > /dev/null"
    ],
    "scripts": {
      "test": [
        "echo \"Error: no test specified\" && exit 1"
      ]
    }
  }
}
tf63tf63

Python環境を作ってみる

こいつ

https://www.jetify.com/docs/devbox/devbox_examples/languages/python/

パッケージの検索

  • --show-allで省略されているバージョンを全部表示してくれる
> devbox search python
Found 7+ results for "python":

* python  (3.14.0a6, 3.14.0a5, 3.14.0a4, 3.14.0a2, 3.14.0a1, 3.13.2, 3.13.1, 3.13.0, 3.13.0rc3, 3.13.0rc2 ...)
* python-cosmopolitan  (3.6.14)
* python-launcher  (1.0.1, 1.0.0)
* python-qt  (3.6.0, 3.5.7, 3.5.6, 3.5.4, 3.5.2, 3.5.1, 3.4.2, 3.3.0, 3.2)
* python-swiftclient  (4.2.0, 4.1.0, 4.0.0, 3.13.1, 3.13.0, 3.12.0)
* python-language-server  (2022-02-18, 2021-09-08, 2021-05-20, 2020-10-08, 2020-06-19, 2020-04-24)
* python-matter-server  (7.0.1, 6.6.0, 6.3.0, 6.2.2, 6.1.0, 5.10.0, 5.9.0, 5.8.1, 5.8.0, 5.7.0b2 ...)

Warning: Showing top 10 results and truncated versions. Use --show-all to show all.

パッケージの追加

  • python3.10を入れてみる
devbox add python@3.10
tf63tf63

環境の立ち上げ

devbox shell

確認

  • ちゃんとpython3.10が入ってるっぽい
python

Python 3.10.16 (main, Dec  3 2024, 17:27:57) [Clang 19.1.7 ] on darwin
Type "help", "copyright", "credits" or "license" for more information.
>>> 
tf63tf63

環境の再現

  • devbox.lockから環境構築する場合のコマンド
devbox install
tf63tf63

pythonパッケージの確認

  • デフォルトでpipがインストールされるので,そのまま使える
  • ただし,devbox shellしただけでは仮想環境がactivateされないので注意
  • devbox.jsoninit_hookを設定しておくと自動でactivateできる
    • これはfishの場合
  "shell": {
    "init_hook": [
      "source .venv/bin/activate.fish"
    ],
    "scripts": {
      "test": [
        "echo \"Error: no test specified\" && exit 1"
      ]
    }
  }

Pythonパッケージのインストール

  • flaskを入れてみる
pip install flask
  • インストール確認
pip list
Package      Version
------------ -------
blinker      1.9.0
click        8.1.8
Flask        3.1.0
itsdangerous 2.2.0
Jinja2       3.1.6
MarkupSafe   3.0.2
mccabe       0.7.0
pip          23.0.1
pycodestyle  2.13.0
pyflakes     3.3.2
setuptools   65.5.0
Werkzeug     3.1.3

グローバル環境汚してない? -> 大丈夫そう

  • Devbox環境を抜けたあともpip listの結果が変わってない (VSCodeのターミナル上)
    • ターミナルアプリからpip listするとflaskが入ってなかった (そもそもpipのパスが通ってない)
    • VSCodeのターミナルだとデフォルトでDevbox環境が読み込まれるかも
    • 違った.VSCodeが.venvを勝手に読み込んでるっぽい
tf63tf63

venv -> uvに切り替える

  • uv使いたいよねって話
devbox add uv@latest
  • devbox環境外ではパスはそのまま
which uv
> ~/.local/bin/uv
  • devbox環境だとインストールしたuvを使ってくれる
devbox shell
(devbox) which uv
> ~/project/devbox-exp/.devbox/nix/profile/default/bin/uv
  • devbox.jsoninit_hookuv syncを入れとけば良さそう
  "shell": {
    "init_hook": [
      "uv sync"
    ],
    "scripts": {
      "test": [
        "echo \"Error: no test specified\" && exit 1"
      ]
    }
  }

Python環境の切り替え

  • devboxuvどっちもpythonランタイムを管理できるので,一方に統一したい
    • uvに統一するのが楽かな
  • .python-versionを作ってdevbox.jsonからpythonを削除すれば良さそう
tf63tf63

VSCodeのターミナル起動時に自動でDevbox shellを立ち上げる

  • Devboxの拡張機能で出来るみたい
    • インストール数少ないので今はいらないかな
    • こいつでReopen in Devbox shell environmentしないとLSPとかFormatterが機能しないことがあった

https://www.jetify.com/docs/devbox/ide_configuration/vscode/#syncing-vscode-with-devbox-shell

  • 代わりに.vscode/settings.jsonを書く
{
    "terminal.integrated.profiles.osx": {
        "WithDevbox": {
            "path": "fish",
            "args": ["-c", "devbox shell && fish"]
        }
    },
    "terminal.integrated.defaultProfile.osx": "WithDevbox",
}
tf63tf63

Dockerfileを生成

  • コマンドで雛形を作ってくれる

https://hub.docker.com/r/jetpackio/devbox/tags

devbox generate dockerfile
  • ちょっと書き換えた
FROM jetpackio/devbox:0.14.2

# Installing your devbox project
WORKDIR /code
USER root:root
RUN mkdir -p /code && chown ${DEVBOX_USER}:${DEVBOX_USER} /code
USER ${DEVBOX_USER}:${DEVBOX_USER}
COPY --chown=${DEVBOX_USER}:${DEVBOX_USER} devbox.json devbox.lock pyproject.toml uv.lock ./

RUN devbox run -- echo "Installed Packages." && nix-store --gc && nix-store --optimise

CMD ["devbox", "shell"]