はじめに
Dockerは開発環境に革命をもたらしました。環境の一貫性と再現性という大きな価値を提供し、「手順書どおりに環境構築」から「コードを実行するだけ」に変えました。
しかし、macOSでの開発では課題も残っています。ファイルI/Oの遅さ、起動時間、メモリ消費、そして設定ファイルの複雑さ。プロダクション環境と開発環境では求められる特性が異なるのに、同じ方法で環境を作る必要があるのでしょうか?
そこで「Malt」を開発しました。Homebrewの力を活かし、Dockerのようにプロジェクト単位でサービスを管理しながら、ネイティブのパフォーマンスを実現する開発環境マネージャーです。
Maltとは
Maltは特別なデーモンやランタイムを持たない、シンプルなHomebrewフォーミュラです。PHPデベロッパーなら「Composerのインフラ版」と考えてください。Composerがライブラリの依存関係を管理するように、Maltはサービスの依存関係を管理します。
| Composer | Malt | 役割 |
|---|---|---|
| composer.json | malt.json | 依存関係の宣言 |
| vendor/ | malt/ | 依存関係の保存場所 |
| composer install | malt install | 依存関係のインストール |
| - | malt start | サービスの起動 |
クイックスタート
インストール
brew tap shivammathur/php
brew tap shivammathur/extensions
brew tap koriym/malt
brew install malt
プロジェクトの初期化
cd your-project
malt init
malt.jsonが作成されます。必要なサービスやPHP拡張を指定してください:
{
"project_name": "myapp",
"dependencies": [
"php@8.4",
"mysql@8.0",
"composer",
"redis",
"nginx"
],
"ports": {
"php": [9000],
"redis": [6379],
"nginx": [8080],
"mysql": [3306]
},
"php_extensions": [
"xdebug",
"redis",
"apcu"
]
}
環境構築と起動
malt install # 依存関係をインストール
malt create # 設定ファイルを生成
malt start # サービスを起動
既存プロジェクトに参加する場合も同じです。malt.jsonがあれば、この3コマンドで同じ環境が再現できます。
3つの特徴
1. ネイティブの速さ
仮想化レイヤーがないため、すべてがネイティブ速度で動作します。
- ファイルI/O: Dockerのボリュームマウントによる遅延がありません。多数のファイルを扱うPHPフレームワークでは体感できる違いがあります。
- 起動時間: サービスが即座に起動します。
- メモリ効率: コンテナのオーバーヘッドがなく、システムリソースを効率的に使用します。
| ソリューション | ファイルI/O | メモリ使用 | 起動時間 |
|---|---|---|---|
| Malt | ネイティブ | 少ない | 即座 |
| Docker | 遅い(特にmacOS) | やや多い | 数秒 |
| VM | かなり遅い | 多い | 数分 |
2. デバッグのしやすさ
Dockerでは「コンテナの中」と「コンテナの外」という二重の文脈が存在します。Maltではすべてがネイティブに実行されるため:
- ログファイルは
malt/logs/に集約され、直接アクセスできる - XdebugなどがIDEと直接統合でき、設定が簡単
- サービスの状態確認が標準的なOSツールで可能
「なぜ動かないのか」を調査する時間を減らし、本来の開発に集中できます。
3. 開発に特化した便利さ
Maltは開発専用ツールとして、便利なエイリアスを自動生成します。
source <(malt env) # 環境変数とエイリアスを設定
たとえばMySQLへの接続は、mysql --defaults-file=/path/to/conf/my_3306.cnf -h 127.0.0.1とする代わりに:
% mysql@3306
Welcome to the MySQL monitor. Commands end with ; or \g.
Your MySQL connection id is 20
Server version: 8.0.41 Homebrew
...
mysql@3306:(none)>
ローカル開発用なのでパスワード入力も不要です。DBデータはプロジェクト内に作成され、グローバルな設定に影響を与えません。
Dockerとの使い分け
MaltはDockerの代替ではなく、補完的なツールです。
| 用途 | 推奨ツール | 理由 |
|---|---|---|
| 日常の開発 | Malt | 高速なファイルI/O、迅速な起動 |
| 統合テスト | Docker | 本番に近い環境でのテスト |
| 本番環境 | Docker | コンテナ化による一貫性 |
日常の開発はMalt、本番環境に近いテストはDocker。状況に応じて使い分けることで、開発効率と環境の一貫性の両方を高められます。
devboxとの比較
JSON形式で開発環境を定義するツールにはdevboxもあります。
| 機能 | Malt | devbox |
|---|---|---|
| エコシステム | Homebrew | Nix |
| 焦点 | サービスの管理と制御 | 広範な開発環境管理 |
| 設定 | シンプルなJSON | より複雑なスキーマ |
| プロジェクト構造 |
malt/に設定・ログを集約 |
最小限のファイル変更 |
Maltは複数のサービスを管理し、ログや設定に直接アクセスしたいチームに向いています。
アンインストール
不要になったらきれいに削除できます。
malt stop # サービスを停止
rm -rf malt/ # プロジェクトの設定とデータを削除
brew uninstall malt # Maltをアンインストール
brew untap koriym/malt # タップを削除
Homebrewでインストールしたサービス(MySQL、Redisなど)は他のbrewフォーミュラでの依存があれば残りますし、maltでしか依存してないならクリーンに削除されます。
まとめ
古代中国の思想家・老子は「大道は甚だ夷らかなるも、而も民は径を好む」と言いました。大道はとても平らで広いのに、人々は近道を好み、それが結局違う苦難を招いてしまう、という意味です。
ソフトウェア開発でも同じことが起きがちです。何かを解決する新しいツールが、また新しい問題を持ち込み、それを解決するためにさらに複雑なツールが登場する。
時に必要なのは、より多くの抽象化レイヤーではなく、本質に立ち返ることかもしれません。Maltはそういう思いから生まれたシンプルで小さなツールです。
参考リンク
- GitHub リポジトリ
- 公式ドキュメント
- Malt Prompt Brewery - malt.jsonからインフラストラクチャコードを生成するAI用ツール