開発の「自動化」を極める:Yarn Pluginで構築する自分専用のCLI環境
こんにちは。日々の開発で「またこのコマンドを打っているのか…」と溜息をついたことはありませんか?
多くのエンジニアが `npm install` や `yarn build` を繰り返すだけで満足してしまっていますが、真のアーキテクトは違います。「開発環境そのものを自分のワークフローに最適化させる」ことこそが、生産性を劇的に向上させる鍵です。
今回は、Yarn(特にv2以降のBerry)が持つ強力な「プラグインシステム」に焦点を当てます。単なるパッケージ管理を超え、あなたのプロジェクト専用のCLIコマンドを爆速で生成する技術を伝授しましょう。
—
なぜ「プラグイン」で拡張するのか?
標準的な `scripts` セクションに長いコマンドを記述するのは、もう古い手法です。プロジェクトが大きくなると、`package.json` はゴミ屋敷と化します。
Yarnのプラグインシステムを使えば、以下のメリットを享受できます。
1. 型安全なコマンド定義: Node.jsで記述できるため、複雑なロジックを安全に実装可能。
2. プロジェクト特化型CLI: `yarn my-tool` のように、チーム内独自のワークフローをコマンド化できる。
3. ライフサイクル・フック: パッケージインストール直後にファイルを自動生成したり、設定を注入したりと、「人間が介入しない」自動化が可能です。
—
ステップ1:Yarn v3/v4環境の準備
まずは、プラグインがフル活用できる現代的なYarn環境を用意しましょう。
プロジェクトディレクトリでYarnを有効化(最新のBerry環境へ)
yarn set version stable
これにより、.yarn/releases/ に実行バイナリが生成されます
プロジェクト内に環境を閉じ込めることで、チーム全員が同じ挙動を再現できます
—
ステップ2:独自プラグインの実装(Hello Worldを超えて)
今回は、インストール時に特定の環境設定ファイルを動的に生成するプラグインを作成します。
1. プラグイン作成の準備
Yarnのプラグインは、実は単なるNode.jsのモジュールです。以下の構成でファイルを作成します。
.yarn/plugins/my-custom-plugin.js
2. 実装コード:インストール後フック
`afterAllInstalled` フックを使い、依存関係解決後に自動で `config.json` を生成するロジックです。
// .yarn/plugins/my-custom-plugin.js
module.exports = {
name: `plugin-custom-setup`,
factory: (require) => ({
hooks: {
// 全てのパッケージインストールが完了した直後に実行されるフック
async afterAllInstalled(project) {
const fs = require(‘fs’);
const path = require(‘path’);
console.log(“🚀 プロジェクト専用の最適化を実行中…”);
const configPath = path.join(project.cwd, ‘project-config.json’);
const configData = {
generatedAt: new Date().toISOString(),
version: project.topLevelWorkspace.manifest.version
};
// ファイルが存在しなければ生成
if (!fs.existsSync(configPath)) {
fs.writeFileSync(configPath, JSON.stringify(configData, null, 2));
console.log(“✅ 設定ファイルを自動生成しました”);
}
},
},
}),
};
3. プラグインの有効化
`.yarnrc.yml` にプラグインを登録します。
.yarnrc.yml
plugins:
- path: .yarn/plugins/my-custom-plugin.js
spec: “@local/my-custom-plugin”
—
ステップ3:動作確認と現場での活用
準備ができたら、以下のコマンドを叩いてみてください。
yarn install
ログに `🚀 プロジェクト専用の最適化を実行中…` と表示され、ディレクトリ直下に `project-config.json` が生成されていれば成功です。
このテクニックがもたらす「知的な利益」
この手法を応用すると、例えば以下のようなことが可能になります。
- APIドキュメントの自動生成: `yarn install` のたびに最新のOpenAPI定義から型定義を生成する。
- ローカル環境のセーフティガード: 開発者が `.env` ファイルを作り忘れた際に、テンプレートから自動コピーする。
- CI/CDとの連携: 特定のビルドサーバーでのみ動作する最適化処理を、ローカル環境に影響させずに実行する。
—
最後に:アーキテクトからのアドバイス
プラグインの書き方を覚えることは、単なるコーディングスキル向上ではありません。「ツールに作業を合わせる」のではなく「自分の手でツールを改良し、ワークフローを設計する」というアーキテクトの視点を持つことです。
最初は小さな自動化からで構いません。毎回手で打っているそのコマンド、少しだけプラグインで楽をしてみませんか?一度体験すれば、もう元には戻れなくなるはずですよ。
それでは、素晴らしい開発体験を!