devenvというnixをベースした開発環境と本番用のコンテナイメージを作れるツールを紹介しました。
https://devenv.sh/
devenvに入門した2023/08/17 ひむら ともひこ
View Slide
自己紹介ひむら ともひこ最近趣味で遊んでるもの● Nix● GNU Emacs
devenvに入門した
こういうことありませんか?
リポジトリをクローンしてきたけどビルドや実行するまでにいろいろインストールしなきゃいけない
開発するのにVagrantやDockerなど起動しないといけない
つらい
そこでdevenvですよ
devenvとは何か
devenv知ってる人1人
devenv使ってる人0人
開発環境構築ツールデプロイ用コンテナイメージ作成ツール
devenvが導入されてる環境で使ってみる
devenvの設定ファイルがあるプロジェクトで$ devenv up# 開発サーバーやデータベースサーバーなどが起動する$ devenv shell# 開発するのに必要なコマンドがそろった環境に入る
実例
devenv.nix{ pkgs, ... }:{env.GREET = "devenv";packages = [ pkgs.git ];scripts.hello.exec = "echo hello from $GREET";enterShell = ''hellogit --version'';languages.javascript.enable = true;languages.javascript.package = pkgs.nodejs_20;processes.watch.exec = "npm run watch:build";processes.test.exec = "npm run test --watch";processes.storybook.exec = "npm run storybook";}
devenv.yamlinputs:nixpkgs:url: github:NixOS/nixpkgs/nixpkgs-unstable
設定ファイル● devenv.nix○ nix言語を用いて設定やインストールするパッケージのカスタマイズができる● devenv.yaml○ パッケージマネージャ自体の設定をする○ 外部のdevenvの設定を読み込みする
devenvのinstall方法
ここでは説明したくない
nixがインストールされていれば$ nix-env -ifhttps://install.devenv.sh/latest
もうちょっと詳しく
devenvの環境はシステムとは別途隔離されている● プロジェクトルートの .devenv/profileに環境が作られる$ find .devenv/profile/ | head -n 20.devenv/profile/.devenv/profile//bin.devenv/profile//bin/git-jump.devenv/profile//bin/git-receive-pack.devenv/profile//bin/git-credential-netrc.devenv/profile//bin/git-upload-archive.devenv/profile//bin/.honcho-wrapped.devenv/profile//bin/honcho.devenv/profile//bin/git-credential-osxkeychain.devenv/profile//bin/git-cvsserver.devenv/profile//bin/hello.devenv/profile//bin/git-shell.devenv/profile//bin/node.devenv/profile//bin/corepack.devenv/profile//bin/git-upload-pack.devenv/profile//bin/scalar.devenv/profile//bin/npx.devenv/profile//bin/git-http-backend.devenv/profile//bin/npm.devenv/profile//bin/git
正確にはシンボリックリンクでnixで包括的に管理される$ ls -l .devenv/profile.devenv/profile -> /nix/store/qsvm027f4kv1qzldzm40bzrjpzgfmdi0-devenv-profile
devenv upで起動するのはprocess-manager● 有名なものでいうとforeman(ruby)● デフォルトで使われるのはhoncho(python)○ 出力に色もつかない● 他に選択できるもの○ hivemind(go)■ 環境によってはうまくうごかないことがある(おそらくdevenvで使ってる人が少ない)○ overmind(go + tmux)■ tmuxを使えるならいろいろ便利○ process-compose(go)○■ TUI付きでリッチ
いくつか備え付けのpre-commit hookがあるよ● https://github.com/cachix/pre-commit-hooks.nix● PHP○ php-cs-fixer, phpcbf, phpcs● JavaScript/TypeScript○ deno fmt, deno lint, eslint, rome● Golang○ go fmt, go test, govet, revive, staticcheck● Rust○ rustfmt, clippy, cargo check
editorとの連携は…つらいかもしれない● おそらくdirenv を連携してなんとかすることになる● .envrc に以下を書いとけばきっと…source_url"https://raw.githubusercontent.com/cachix/devenv/d1f7b48e35e6dee421cfd0f51481d17f77586997/direnvrc""sha256-YBzqskFZxmNb3kYVoKD9ZixoPXJh1C9ZvTLGFRkauZ0="use devenv
まとめ
devenvまとめ● 仮想化技術を使わずとも○ VagrantやDockerをつかった開発環境に近いものを作れる■ 同じくらいcleanに使える (ただしnixが必要)○ ansibleやdockerfile不要 (近いものをnixが内蔵)● 設定されているリポジトリならお手軽に使える○ 使うには nix が必要○ 設定するには nix力が必要