- 版本:2.0.0
- GitHub: https://github.com/NativeScript/nativescript-hook
- NPM: https://npmjs.net.cn/package/%40nativescript%2Fhook
- 下载量
- 昨天:1019
- 上周:5879
- 上个月:25273
@nativescript/hook
此模块提供了一种更简单的方式,在执行 tns install <module>
命令时将钩子安装到 NativeScript 项目中。项目钩子是一种脚本,当 NativeScript CLI 执行某些操作时会被配置执行。
钩子将被放置到项目的 hooks/
文件夹中。例如,当执行 tns prepare ...
时,hooks/before-prepare/
和 hooks/after-prepare/
文件夹中的所有脚本文件也会被执行。
此模块简化了将脚本安装到正确项目文件夹的过程。
如何使用
描述钩子
首先,将你的钩子描述添加到模块的 package.json
文件中。以下是一个示例:
{
"nativescript": {
"hooks": [
{
"type": "before-prepare",
"script": "lib/before-prepare.js"
}
]
},
}
上述指定,当执行 tns prepare ...
命令时,应该执行脚本 lib/before-prepare.js
。属性 "type"
指定了要安装的钩子类型。属性 "script"
指定了要执行的脚本的路径。你可以通过扩展 "hooks"
数组添加更多钩子。
安装钩子
如果尚未完成,请向你的 package.json
中添加一个 post-install 和 pre-uninstall 脚本
"scripts": {
...
"postinstall": "node postinstall.js",
"preuninstall": "node preuninstall.js"
},
post-install 脚本(示例中的 postinstall.js
)应包含以下行
require('@nativescript/hook')(__dirname).postinstall();
pre-uninstall 脚本(示例中的 preuninstall.js
)应包含以下行
require('@nativescript/hook')(__dirname).preuninstall();
这两个钩子将在你的模块安装或卸载时,负责在 NativeScript 项目中安装和移除钩子。
tns install <module>
旨在使用 tns install <module>
命令安装钩子的 NativeScript 模块不应通过 npm 直接安装。在模块安装期间,NativeScript CLI 会向 post-install 脚本提供信息,告诉它钩子应该放在哪里。通过 tns install <module>
安装时,以下环境变量被定义:
TNS_HOOKS_DIR
- 钩子应安装的目录。可能存在也可能不存在。TNS_PROJECT_DIR
- 当前项目目录。
以这种方式安装的模块可以通过运行 npm rm --save-dev
简单地卸载。
进程内钩子
默认情况下,钩子在子进程中执行,子进程死亡时执行继续。这在你编写钩子时提供了灵活性,但无法让你使用 CLI 的任何服务。
为此,进程内钩子允许你以这样的方式执行你的钩子,以便你可以使用来自注入器的任何服务。进程内钩子仅适用于 JavaScript 钩子。要启用进程内执行,你只需要在钩子中有一个 module.exports = ...
语句。例如,如果钩子脚本如下所示:
module.exports = function($logger) {
};
然后,钩子脚本将被 CLI require,并通过注入器调用导出的函数。
钩子可以接受一个特殊注入参数名为 hookArgs
module.exports = function(hookArgs) {
};
hookArgs
是一个哈希,包含传递给钩子方法的所有参数。例如,prepare
钩子是由 CLI 方法 preparePlatform(platform: string)
激活的。在这里,钩子将获得 platform
参数的值,在 hookArgs.platform
属性中。
如果在你的钩子中执行异步代码,你需要返回一个promise,否则执行将在你的钩子完成之前继续
var mkdirp = require('mkdirp');
module.exports = function($logger) {
return new Promise(function(resolve, reject) {
mkdirp('somedir', function(err) {
if (err) {
reject(err);
else {
resolve();
}
})
});
}
最后,通过此模块安装进程钩子时,你需要明确指定使用package.json
中脚本描述符的inject
属性
{
"nativescript": {
"hooks": [
{
"type": "after-prepare",
"script": "lib/after-prepare.js",
"inject": true
}
]
},
}
你可以在package.json
中为你的钩子定义一个自定义名称,此属性是可选的,默认为插件包名称
{
"nativescript": {
"hooks": [
{
"type": "after-prepare",
"script": "lib/after-prepare.js",
"name": "my-custom-hook"
}
]
},
}