【发布时间】:2018-06-26 04:57:38
【问题描述】:
有没有办法在每次 Meteor 服务器重启时运行 npm 脚本?
我尝试了postinstall 钩子,但它只在第一次本地应用程序启动时运行。
我认为,一定有办法,因为重新启动会触发多个构建过程,其中一些必须是“可挂钩的”。
我最初考虑使用build plugins,但似乎他们从我的package.json 中移走了很多配置。
有人知道吗?
【问题讨论】:
有没有办法在每次 Meteor 服务器重启时运行 npm 脚本?
我尝试了postinstall 钩子,但它只在第一次本地应用程序启动时运行。
我认为,一定有办法,因为重新启动会触发多个构建过程,其中一些必须是“可挂钩的”。
我最初考虑使用build plugins,但似乎他们从我的package.json 中移走了很多配置。
有人知道吗?
【问题讨论】:
您可以在服务器端的 Meteor.startup() 代码中运行您的 npm 脚本。以下应位于/server 文件夹下的示例可能会有所帮助。
import { exec } from 'child_process';
Meteor.startup(() => {
async function sh(cmd) {
return new Promise(function (resolve, reject) {
exec(cmd, (err, stdout, stderr) => {
if (err) {
reject(err);
} else {
resolve({ stdout, stderr });
}
});
});
}
async function excScript() {
let { stdout } = await sh('npm -ls'); // runs "npm -ls"
for (let line of stdout.split('\n')) {
console.log(`npm -ls: ${line}`);
}
}
excScript();
}
【讨论】:
{projectpath}/.meteor/local/build/programs/server,其中不包含原始的package.json 文件。有没有办法将脚本称为“上面的一些目录”?第二个问题是以下错误消息:(node:56566) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.
npm -ls你得到“找不到命令错误”?如果是这样,它与您的环境设置有关。您应该将“npm_bin_path”添加到生产服务器中的 PATH 变量中。与使用 Promise 相关的不是错误而是弃用警告,您可以暂时省略。
PATHvariables。另外我只想在开发模式下使用脚本。 command not found 错误来自当前目录不是我的项目目录,而是.meteor 文件夹中的本地构建,其中带有我的脚本的package.json 不存在(因此出现错误)。关于弃用警告,我不想省略弃用的功能,因为它们被弃用是有原因的(部署具有已弃用功能的新应用程序可能不好)。有没有其他选择可以解决这个问题?最好的,简