我有一个node.js应用程序,我已经创建了一个本机插件。 (如果您需要背景信息,可以创建node.js的原生插件like this)。
在我的开发环境中,我希望它能够观察源文件(在这种情况下是C ++源文件),并在C ++源文件发生更改时自动重建我的插件,并在构建完成后自动重新启动节点应用程序。 / p>
我确信有不止一种方法可以实现这一目标,但我走上了尝试nodemon的道路。但我无法弄清楚如何在重新启动应用程序之前让nodemon等待构建完成。
我认为npm也可以通过脚本来实现这一点,也许可以使用某种手表包。如果有更容易的事情,我愿意采用其他方法。
因此,当我的任何源文件发生变化时,我真正需要的是node-gyp build
在重启工作流中的正确位置运行(停止节点,重新编译,重启节点)。现在它重建了插件并重新启动了应用程序,而没有等待构建完成,这是不可取的。
这是我的nodemon.json文件:
{
"watch": [
"addon/"
],
"ignore": [
"addon/build/"
],
"events": {
"restart": "cd addon && node-gyp build"
},
"ext": "js,json,cc,h"
}
这不起作用,因为“restart”就像一个事件,因为运行node-gyp的脚本会触发并执行,但它不会阻止重新启动直到构建完成。
我希望它更像中间件,它会在应用程序终止后运行构建脚本,但在重新启动应用程序之前运行。我也咨询了this relevant nodemon issue,但没有具体的建议如何实现这一目标。
我需要更改一些内容,以便在源更改时自动进行重建(node-gyp步骤),然后重新启动。
注意:稍后我将对其进行重组,以便它只在相关C ++源文件发生更改时重建插件,并在.js文件更改时重新启动应用程序而不重建C ++插件,但首先我需要弄清楚在正确的时间让node-gyp构建步骤发生。
答案 0 :(得分:3)
我通过让 nodemon 使用-x
选项运行 npm 解决了这一问题。然后,npm脚本可以依次执行 build 和 run 脚本。
这是我package.json的相关部分:
"scripts": {
"dev": "nodemon -x \"npm run buildrun\"",
"buildrun": "npm run build && npm run server",
"build": "echo Building Addon && cd addon && node-gyp build",
"server": "nodemon server.js",
}
您可以通过运行npm run dev
来启动它。
dev
使用-x
选项运行nodemon,命令为npm run buildrun
。然后,每次代码更改时,nodemon都会重新启动npm buildrun
脚本。这是我难以弄清的主要部分。
为解释其余内容,buildrun
脚本背靠背运行两个脚本。第一个(build
)构建插件,第二个(server
)运行服务器。
服务器脚本实际上也运行nodemon:它运行另一个nodemon来使用nodemon server.js
运行服务器脚本。
从技术上讲,通过让npm再次调用nodemon(使用正确的配置文件,不同的参数和上下文),nodemon可以 观看代码库的另一部分,然后重新启动另一部分 系统的状态(例如,仅查看服务器代码,而无需重新构建 整个插件,这就是我的实际代码。)
通过使用-x
选项调用nodemon并在代码更改时使整个构建和运行脚本重新启动,我能够对动作进行排序,以使nodemon首先构建插件,等待构建完成,然后运行服务器。
起初,这种nodemon -x \"npm ...\"
技术对我来说并不明显,实际上我花了半年时间才提出这个解决方案。因此,我之所以分享此信息,是因为其他人可能会发现此技术很有用。