$30 off During Our Annual Pro Sale. View Details »

devenvに入門した

 devenvに入門した

devenvというnixをベースした開発環境と本番用のコンテナイメージを作れるツールを紹介しました。

https://devenv.sh/

Tomohiko Himura

September 13, 2023
Tweet

More Decks by Tomohiko Himura

Other Decks in Technology

Transcript

  1. devenvに入門した
    2023/08/17 ひむら ともひこ

    View Slide

  2. 自己紹介
    ひむら ともひこ
    最近趣味で遊んでるもの
    ● Nix
    ● GNU Emacs

    View Slide

  3. devenvに入門した

    View Slide

  4. View Slide

  5. こういうことありませんか?

    View Slide

  6. リポジトリをクローンしてきたけど
    ビルドや実行するまでに
    いろいろインストールしなきゃいけない

    View Slide

  7. 開発するのに
    VagrantやDockerなど起動しないといけない

    View Slide

  8. つらい

    View Slide

  9. そこでdevenvですよ

    View Slide

  10. devenvとは何か

    View Slide

  11. devenv知ってる人
    1人

    View Slide

  12. devenv使ってる人
    0人

    View Slide

  13. 開発環境構築ツール
    デプロイ用コンテナイメージ作成ツール

    View Slide

  14. https://devenv.sh/

    View Slide

  15. devenvが導入されてる環境で使ってみる

    View Slide

  16. devenvの設定ファイルがあるプロジェクトで
    $ devenv up
    # 開発サーバーやデータベースサーバーなどが起動する
    $ devenv shell
    # 開発するのに必要なコマンドがそろった環境に入る

    View Slide

  17. 実例

    View Slide

  18. devenv.nix
    { pkgs, ... }:
    {
    env.GREET = "devenv";
    packages = [ pkgs.git ];
    scripts.hello.exec = "echo hello from $GREET";
    enterShell = ''
    hello
    git --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";
    }

    View Slide

  19. devenv.yaml
    inputs:
    nixpkgs:
    url: github:NixOS/nixpkgs/nixpkgs-unstable

    View Slide

  20. 設定ファイル
    ● devenv.nix
    ○ nix言語を用いて設定やインストールするパッケージのカスタマ
    イズができる
    ● devenv.yaml
    ○ パッケージマネージャ自体の設定をする
    ○ 外部のdevenvの設定を読み込みする

    View Slide

  21. devenvのinstall方法

    View Slide

  22. ここでは説明したくない

    View Slide

  23. nixがインストールされていれば
    $ nix-env -if
    https://install.devenv.sh/latest

    View Slide

  24. もうちょっと詳しく

    View Slide

  25. 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

    View Slide

  26. 正確にはシンボリックリンクでnixで包括的に管理される
    $ ls -l .devenv/profile
    .devenv/profile -> /nix/store/qsvm027f4kv1qzldzm40bzrjpzgfmdi0-devenv-profile

    View Slide

  27. devenv upで起動するのはprocess-manager
    ● 有名なものでいうとforeman(ruby)
    ● デフォルトで使われるのはhoncho(python)
    ○ 出力に色もつかない
    ● 他に選択できるもの
    ○ hivemind(go)
    ■ 環境によってはうまくうごかないことがある(おそらくdevenvで使ってる人が少ない)
    ○ overmind(go + tmux)
    ■ tmuxを使えるならいろいろ便利
    ○ process-compose(go)

    ■ TUI付きでリッチ

    View Slide

  28. いくつか備え付けの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

    View Slide

  29. editorとの連携は…つらいかもしれない
    ● おそらくdirenv を連携してなんとかすることになる
    ● .envrc に以下を書いとけばきっと…
    source_url
    "https://raw.githubusercontent.com/cachix/devenv/d1f7b48e35e6d
    ee421cfd0f51481d17f77586997/direnvrc"
    "sha256-YBzqskFZxmNb3kYVoKD9ZixoPXJh1C9ZvTLGFRkauZ0="
    use devenv

    View Slide

  30. まとめ

    View Slide

  31. devenvまとめ
    ● 仮想化技術を使わずとも
    ○ VagrantやDockerをつかった開発環境に近いものを作れる
    ■ 同じくらいcleanに使える (ただしnixが必要)
    ○ ansibleやdockerfile不要 (近いものをnixが内蔵)
    ● 設定されているリポジトリならお手軽に使える
    ○ 使うには nix が必要
    ○ 設定するには nix力が必要

    View Slide