创建自定义注册表#

允许将自定义注册表插入任务系统,该系统可以提供共享任务或增强功能。使用 registry() 注册注册表。

结构#

为了被 gulp 接受,自定义注册表必须遵循特定格式。

// 作为函数
函数 TestRegistry() {}
TestRegistry.prototype.init = 函数 (gulpInst) {}
TestRegistry.prototype.get = 函数 (name) {}
TestRegistry.prototype.set = function (name, fn) {}
TestRegistry.prototype.tasks = function () {}
// 作为类
class TestRegistry {
init(gulpInst) {}
get(name) {}
set(name, fn) {}
tasks() {}
}

如果传递给 registry() 的注册表实例没有所有这四种方法,将会抛出一个错误。

注册#

如果我们希望注册上面示例中的注册表,我们需要将它的一个实例传递给 registry()

const { registry } = require('gulp');
// ... TestRegistry 设置代码
// 很好!
registry(new 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');
函数 CommonRegistry(opts){
DefaultRegistry.call(this);
opts = opts || {};
this.buildDir = opts.buildDir || './build';
}
util.inherits(CommonRegistry, DefaultRegistry);
CommonRegistry.prototype.init = 函数(gulpInst) {
const buildDir = this.buildDir;
const exists = fs.existsSync(buildDir);
if(exists){
throw new Error('无法初始化通用任务。 ' + buildDir + ' 目录已存在.');
}
gulpInst.task('clean', function(){
return del([buildDir]);
});
}
模块.导出 = CommonRegistry;

然后在项目中使用它

const { registry, series, task } = require('gulp');
const CommonRegistry = require('myorg-common-tasks');
registry(new CommonRegistry({ buildDir: '/dist' }));
任务('build', 序列('clean', 函数 build(cb) {
// 执行操作
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` 会使用 `ConfigRegistry.prototype.set` 重置注册表中的每个任务,
// 它会将它们绑定到配置对象。
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);
控制台.日志('提供服务' + .构建);
cb();
}));

示例#