可安装钩子是驻留在应用程序node_modules
文件夹中的自定义 Sails 钩子。当您希望在 Sails 应用程序之间共享功能或将您的钩子发布到NPM与 Sails 社区共享时,它们非常有用。如果您希望创建一个仅在一个 Sails 应用程序中使用的钩子,请参阅创建项目钩子。
创建新的可安装钩子
sails-hook-<your hook name>
的新文件夹。sails-hook-
前缀是可选的,但为了保持一致性建议使用;当加载钩子时,Sails 会将其剥离。package.json
文件。如果您的系统上安装了npm
,则可以通过运行npm init
并按照提示操作轻松地执行此操作。否则,您可以手动创建文件,并确保它至少包含以下内容{
"name": "sails-hook-your-hook-name",
"version": "0.0.0",
"description": "a brief description of your hook",
"main": "index.js",
"sails": {
"isHook": true
}
}
如果您使用npm init
创建您的package.json
,请确保之后打开该文件并手动插入包含isHook: true
的sails
键。index.js
中编写您的钩子代码。您的新文件夹还可以包含其他文件,这些文件可以通过require
在您的钩子中加载;只有index.js
会被 Sails 自动读取。使用您的package.json
的dependencies
键来引用使您的钩子能够工作所需的任何依赖项(您也可以使用npm install <dependency> --save
轻松地将依赖项信息保存到package.json
)。
在某些情况下,尤其是在使用作用域 NPM 包覆盖核心 Sails 钩子时,您需要更改 Sails 在加载钩子时内部使用的名称。您可以为此使用package.json
文件中的sails.hookName
配置选项。该值应为您希望加载到sails.hooks
字典中的名称,因此通常您不希望使用sails-hooks-
前缀。例如,如果您有一个模块@mycoolhooks/sails-hook-sockets
,您希望使用它来覆盖核心sails-hook-sockets
模块,则package.json
可能如下所示
{
"name": "@mycoolhooks/sails-hook-sockets",
"version": "0.0.0",
"description": "my own sockets hook",
"main": "index.js",
"sails": {
"isHook": true,
"hookName": "sockets"
}
}
在将可安装钩子分发给其他人之前,您需要为其编写一些测试。这将有助于确保与未来 Sails 版本的兼容性,并大大减少因愤怒而导致的拔头发和附近物体破坏。虽然编写测试的完整指南超出了本文档的范围,但以下步骤应该可以帮助您入门
package.json
文件中将 Sails 添加为devDependency
"devDependencies": {
"sails": "~0.11.0"
}
npm install sails
或npm link sails
(如果您的系统上全局安装了 Sails)将 Sails 作为钩子的依赖项安装。npm install -g mocha
在您的系统上安装Mocha,如果您还没有安装。test
文件夹。添加一个包含以下基本测试的basic.js
文件
var Sails = require('sails').Sails;
describe('Basic tests ::', function() {
// Var to hold a running sails app instance
var sails;
// Before running any tests, attempt to lift Sails
before(function (done) {
// Hook will timeout in 10 seconds
this.timeout(11000);
// Attempt to lift sails
Sails().lift({
hooks: {
// Load the hook
"your-hook-name": require('../'),
// Skip grunt (unless your hook uses it)
"grunt": false
},
log: {level: "error"}
},function (err, _sails) {
if (err) return done(err);
sails = _sails;
return done();
});
});
// After tests are complete, lower Sails
after(function (done) {
// Lower Sails (if it successfully lifted)
if (sails) {
return sails.lower(done);
}
// Otherwise just return
return done();
});
// Test that Sails can lift with the hook in place
it ('sails does not crash', function() {
return true;
});
});
mocha -R spec
运行测试以查看完整结果。假设您的钩子已过测试且看起来不错,并且假设该钩子名称尚未被另一个NPM模块使用,您可以通过运行npm publish
与世界共享它。太棒了!