@nativescript/hook
NativeScript 项目中安装钩子的辅助模块
npm i --save @nativescript/hook

@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"
}
]
},
}