カスタムレジストリの作成#

カスタムレジストリをタスクシステムにプラグインすることで、共有タスクや機能拡張を提供できます。レジストリはregistry()を使用して登録されます。

構造#

gulpで受け入れられるためには、カスタムレジストリは特定の形式に従う必要があります。

// 関数として
function TestRegistry() {}
TestRegistry.prototype.init = function (gulpInst) {}
TestRegistry.prototype.get = function (name) {}
TestRegistry.prototype.set = function (name, fn) {}
TestRegistry.prototype.tasks = function () {}
// クラスとして
class TestRegistry {
init(gulpInst) {}
get(name) {}
set(name, fn) {}
tasks() {}
}

registry()に渡されたレジストリインスタンスに4つのメソッドすべてがない場合、エラーがスローされます。

登録#

上記の例にあるレジストリを登録するには、そのインスタンスをregistry()に渡す必要があります。

const { registry } = require('gulp');
// ... TestRegistry セットアップコード
// 正しい方法!
registry(new TestRegistry())
// 間違った方法!
registry(TestRegistry())
// これによりエラーが発生します:'カスタムレジストリはインスタンス化されている必要がありますが、コンストラクタを渡したようです'

メソッド#

init(gulpInst)#

レジストリのinit()メソッドは、registry()関数の最後に呼び出されます。唯一の引数として渡されるgulpインスタンス(gulpInst)を使用して、gulpInst.task(taskName, fn)を使用してタスクを事前に定義できます。

パラメータ#

パラメータ備考
gulpInstオブジェクトgulpのインスタンス。

get(name)#

get()メソッドは、カスタムレジストリが解決して返すタスクのname、またはその名前のタスクが存在しない場合はundefinedを受け取ります。

パラメータ#

パラメータ備考
name文字列取得するタスクの名前。

set(name, fn)#

set()メソッドは、タスクのnamefnを受け取ります。これは、ユーザー登録済みのタスクをカスタムレジストリに提供するために、task()によって内部的に呼び出されます。

パラメータ#

パラメータ備考
name文字列設定するタスクの名前。
fn関数設定するタスク関数。

tasks()#

レジストリ内のすべてのタスクをリストするオブジェクトを返す必要があります。

ユースケース#

タスクの共有#

すべてのプロジェクトで共通のタスクを共有するには、レジストリにinitメソッドを公開します。このメソッドは、唯一の引数としてgulpのインスタンスを受け取ります。その後、gulpInst.task(name, fn)を使用して、事前に定義されたタスクを登録できます。

たとえば、cleanタスクを共有する場合があります。

const fs = require('fs');
const util = require('util');
const DefaultRegistry = require('undertaker-registry');
const del = require('del');
function CommonRegistry(opts){
DefaultRegistry.call(this);
opts = opts || {};
this.buildDir = opts.buildDir || './build';
}
util.inherits(CommonRegistry, DefaultRegistry);
CommonRegistry.prototype.init = function(gulpInst) {
const buildDir = this.buildDir;
const exists = fs.existsSync(buildDir);
if(exists){
throw new Error('共通タスクを初期化できません。 ' + buildDir + ' ディレクトリが存在します。');
}
gulpInst.task('clean', function(){
return del([buildDir]);
});
}
module.exports = CommonRegistry;

次に、プロジェクトで使用するには

const { registry, series, task } = require('gulp');
const CommonRegistry = require('myorg-common-tasks');
registry(new CommonRegistry({ buildDir: '/dist' }));
task('build', series('clean', function build(cb) {
// do things
cb();
}));

共有機能#

タスクがレジストリに追加される方法を制御することで、タスクを装飾できます。

たとえば、すべてのタスクでいくつかのデータを共有したい場合、カスタムレジストリを使用してそれらのタスクをそのデータにバインドできます。上記レジストリメソッドの説明に従って、変更されたタスクを返すようにしてください。

const { registry, series, task } = require('gulp');
const util = require('util');
const DefaultRegistry = require('undertaker-registry');
// 他の場所で定義されたタスク
const BuildRegistry = require('./build.js');
const ServeRegistry = require('./serve.js');
function ConfigRegistry(config){
DefaultRegistry.call(this);
this.config = config;
}
util.inherits(ConfigRegistry, DefaultRegistry);
ConfigRegistry.prototype.set = function set(name, fn) {
var bound = fn.bind(this.config);
// 内部プロパティとタスクメタデータを保持します。
var task = Object.assign(bound, fn);
// `DefaultRegistry` はストレージに `this._tasks` を使用します。
this._tasks[name] = task;
return task;
};
registry(new BuildRegistry());
registry(new ServeRegistry());
// `registry` は、
// これにより、それらは config オブジェクトにバインドされます。
registry(new ConfigRegistry({
src: './src',
build: './build',
bindTo: '0.0.0.0:8888'
}));
task('default', series('clean', 'build', 'serve', function(cb) {
console.log('Server bind to ' + this.bindTo);
console.log('Serving' + this.build);
cb();
}));

#