依存関係管理 - Yeomanジェネレータの作成
何かを作りたい際に、ゼロから自分で作っていくのは、単純に大変な作業です。何か土台的なものがあって、自分でやりたいことだけを追記していければ、それに越したことはありません。
Yeoman は、さまざまな土台を作ってくれるツールです。 yo
というコマンドを打ち込んでプロジェクトの雛形を作成した経験のある方は多いと思いますが、まさに yo
が Yeroman です。 yo generator-name
と打ち込むことで、ジェネレータが呼び出され、対話形式でいくつかの質問に答えるだけで、土台となるファイル群を生成させることが可能です。
そのジェネレータは、自作することも可能です。僕も、とあるジェネレータを自分で作ってみたくなりました。Yeoman のウェブサイトには、じぇねれーたのつくりかたはが複数ページに渡って説明されています。勉強の意味も兼ねて、日本語訳を作ってみました。
今回は、 Managing dependencies です。
ジェネレータを実行したら、ジェネレータに必要な追加の依存関係をインストールするために、 npm (または Yarn )と Bower を実行したいことがよくあります。
これらの作業は非常に頻繁に行われるので、Yeomanはすでにそれらを抽象化しています。他のツールからインストールを開始する方法についても説明します。
Yeomanが提供するインストールヘルパーは、 install
キューの一部として自動的に1回実行するようにインストールをスケジュールします。実行後に何かを実行する必要がある場合は、 end
キューを使用してください。
npm
npm
インストールを実行するには、 this.npmInstall()
を呼び出すだけです。Yeomanは、複数のジェネレーターによって複数回呼び出されたとしても、 npm install
コマンドが一度だけ実行されることを保証します。例えば、あなたが dev dependency として lodash をインストールしたいとします。
class extends Generator {
installingLodash() {
this.npmInstall(['lodash'], { 'save-dev': true });
}
}
これは、プロジェクトのコマンドラインでの以下の呼び出しと等価です。
npm install lodash --save-dev
npm依存関係をプログラムで管理する
テンプレートを使用したくないが、依存関係のバージョンを修正したいような場合は、 package.json
ファイルをプログラムで作成または拡張することができます。Yeomansファイルシステムツールは、この仕事を行うのに役に立ちます。
dev dependency として eslint
を定義し、 react
を dependency として定義する例が以下です。
class extends Generator {
writing() {
const pkgJson = {
devDependencies: {
eslint: '^3.15.0'
},
dependencies: {
react: '^16.2.0'
}
};
// Extend or create package.json file in destination path
this.fs.extendJSON(this.destinationPath('package.json'), pkgJson);
}
install() {
this.npmInstall();
}
};
Yarn
インストールを開始するには、 this.yarnInstall()
を呼び出すだけです。Yeomanは、複数のジェネレータによって複数回呼び出されても、 yarn install
コマンドが1回だけ実行されるようにします。例えば、あなたが dev dependency として lodash をインストールしたいとします。
generators.Base.extend({
installingLodash: function() {
this.yarnInstall(['lodash'], { 'dev': true });
}
});
これは、プロジェクトのコマンドラインでの以下の呼び出しと等価です。
yarn add lodash --dev
Bower
インストールを開始するには、 this.bowerInstall()
を呼び出すだけです。Yeomanは、複数のジェネレータによって複数回呼び出されたとしても、 bower install
コマンドが一度だけ実行されることを保証します。
組み合わせて利用する
this.installDependencies()
を呼び出すと、デフォルトで npm と bower が実行されます。それぞれのパッケージマネージャにブール値を渡すことで、どちらを使うかを決めることができます。
Yarn と Bower を使う例です。
generators.Base.extend({
install: function () {
this.installDependencies({
npm: false,
bower: true,
yarn: true
});
}
});
他のツールを利用する
Yeomanは、ユーザーが任意のCLIコマンドを spawn
できるように抽象化を提供します。この抽象化は、Linux、Mac、およびWindowsシステムでシームレスに実行できるように、コマンドは正規化されます。
例えば、あなたがPHP愛好家で、 composer
を実行したいのであれば、次のように書いてください。
class extends Generator {
install() {
this.spawnCommand('composer', ['install']);
}
}
install
キュー内で spawnCommand
メソッドを呼び出すようにしてください。ユーザーはインストールコマンドが完了するのを待ちたくありません。