【2024 年版】取り入れて良かったツール・技術¶
2024 年に取り入れて良かったツールや技術について
uv¶
uvは、Python のプロジェクトとパッケージ管理をするためのツール。Rust で書かれており、他のツールと比べて高速なのが特徴。ベンチマークの結果によると、pip よりも 10~100 倍速い。pip や pip-tools の代替として使うこともできるし、poetry のようにプロジェクトの管理もできる。
Python Standalone Binary をダウンロードして使うこともできるため、Python 環境の構築の手間を省くことができる。これまで pyenv を使って Python 環境を構築することが多かったが、pyenv を動かすには依存関係が多く、ハマりやすいのに加え、ビルドに時間がかかっていた。uv を使うことで、Python 環境の構築が簡単かつ高速に行えるようになった。
uv pip tools
は複数の requirements.txt を 1 つにまとめることができる。例えば、共通の base requirements.txt と cpu 用の requirements.txt、gpu 用の requirements.txt があるとする。cpu + base で cpu 用の依存解決を行い、gpu + base で gpu 用の依存解決を行う。これにより、base の依存関係を共通化し、cpu と gpu 環境の依存関係を分離できる。また、base の依存関係を変更するだけで、cpu と gpu 環境の依存関係を一括で変更できる。base の依存関係を共通化することで、キャッシュが hit しやすくなり、依存解決が短い時間で完了する。
graph TD
cpu["only cpu requirements"]
gpu["only gpu requirements"]
node_1["base requirements"]
node_3["cpu group requirements"]
node_2["gpu group requirements"]
node_1 --> node_3
cpu --> node_3
gpu --> node_2
node_1 --> node_2
astal は uv の他にも Ruff を開発しており、これらのツールは、Python 開発における課題を解決するために広く採用されている。Ruff のレポジトリを見ると、red knot という型チェッカーの開発が進んでいる。Python 製ツールを高速化してきた astal が開発をしているため、今後も注目していきたい。
Devbox¶
Devboxは、開発環境を構築するためのツール。CLI のバイナリや開発に必要なソフトウェアのセットアップを行い、マシン全体で利用するツールとプロジェクトごとに利用するツールを分けて管理できる。設定ファイルは json で記述されており、他の開発者と共有することで開発環境のセットアップが容易になる。Devbox の裏側で Nix を使っており、豊富なパッケージをサポートしている。裏側で Nix を使っているが、Nix の構文や仕様を知らなくても CLI から簡単に利用できる。キャッシュ機能があり、高速に開発環境の構築ができる。
これまで Homebrew をメインに使って開発環境を構築していたが、完了までに 20 分ほどかかっていた。Devbox に移行することで、開発環境の構築が数分程度に短縮され、開発効率が向上した。グローバルの環境とプロジェクトごとの環境を分けて管理できるため、環境の汚染を防ぐことができる。グローバル環境に反映する前に sandbox 環境でツールを試しやすい。
Testcontainers¶
Testcontainers は、データベース、メッセージブローカー、Web ブラウザなど、Docker コンテナ内で実行可能なあらゆるものを、一時的なコンテナとして提供するオープンソースライブラリ。テスト時にデータベースやミドルウェアを含めてテストしたいという場面で活用できる。 モックや複雑な環境設定をする必要がなく、コードとして記述し、テストを実行するだけでコンテナの作成・削除をしてくれる。多くの言語とテストフレームワークをサポートし、Docker さえあれば利用できる。
データベースやミドルウェアをモックせずテストするには、開発マシンに事前にセットアップしたり、Docker Compose を使ったり、別のマシンや環境に接続するなどの方法がある。しかし、これらの方法には環境構築の手間やポータビリティの問題、リソース共有によるフレイキーなテスト、テスト時間の増加などの課題がある。 Testcontainers を使うことでテスト実行時に必要なコンテナを起動できる。これにより、テスト環境の構築が簡単になり、再現可能な環境でのテストがしやすい。テストにおいてミドルウェアを使ったり複数のマシンを利用するものは、考慮することが多く、セットアップも大変、比較的信頼性が低く、実行時間も長くなりがちだった。Testcontainers を使うことで一台のマシンでテストを完結できる範囲が広がり、レベルの高いテストがやりやすくなった。