可安裝的 Hook 是自訂的 Sails Hook,存在於應用程式的 node_modules
資料夾中。當您想要在 Sails 應用程式之間共享功能,或將您的 Hook 發佈到 NPM 以與 Sails 社群共享時,它們非常有用。如果您希望建立一個 Hook 僅在一個 Sails 應用程式中使用,請參閱建立專案 Hook。
建立新的可安裝 Hook
sails-hook-<您的 Hook 名稱>
。 sails-hook-
前綴是可選的,但建議保持一致性;當 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
中編寫您的 Hook 程式碼。您的新資料夾也可能包含其他檔案,這些檔案可以透過 require
在您的 Hook 中載入;只有 index.js
會被 Sails 自動讀取。使用您的 package.json
的 dependencies
鍵來引用任何需要安裝的依賴項,以便您的 Hook 能夠運作(您也可以使用 npm install <dependency> --save
輕鬆地將依賴項資訊儲存到 package.json
)。
在某些情況下,特別是當使用 scoped NPM 套件 來覆蓋核心 Sails Hook 時,您會想要變更 Sails 在載入您的 Hook 時在內部使用的名稱。您可以使用 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"
}
}
在您將可安裝的 Hook 分發給其他人之前,您會想要為其編寫一些測試。這將有助於確保與未來 Sails 版本的相容性,並顯著減少挫敗感和憤怒時破壞附近物體的衝動。雖然完整的測試編寫指南超出了本文檔的範圍,但以下步驟應有助於您入門
package.json
檔案中將 Sails 新增為 devDependency
"devDependencies": {
"sails": "~0.11.0"
}
npm install sails
或 npm link sails
(如果您的系統上全域安裝了 Sails) 將 Sails 安裝為您的 Hook 的依賴項。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
執行測試以查看完整結果。假設您的 Hook 經過測試且看起來不錯,並且假設 Hook 名稱尚未被另一個 NPM 模組使用,您可以透過執行 npm publish
與全世界分享它。做得好!