如何以编程方式执行'npm run'命令?

mal*_*uri 20 javascript node.js

我有一些自定义测试脚本,我可以使用npm run test命令运行,它执行一些Node脚本来启动e2e/unit测试.但在此之前,我必须npm run dev在其他终端窗口启动webpack dev服务器(它也是一些自定义Node脚本,细节无关紧要).所以,我想省略npm run dev手动执行并将其移动到自定义npm run test脚本,即我想在Node脚本中以编程方式执行webpack dev服务器.如何npm run dev使用Node脚本以编程方式执行然后停止它?提前致谢!

"dev": "node node_modules/webpack-dev-server/bin/webpack-dev-server.js --host 0.0.0.0 --history-api-fallback --debug --inline --progress --config config/config.js"
Run Code Online (Sandbox Code Playgroud)

use*_*755 36

这是一个应该在所有平台上可靠工作的解决方案。它也非常简洁。将其放入build.js,然后运行node build

const {execSync} = require('child_process')

execSync("npm run clean")
execSync("npm run minify")
execSync("npm run build_assets")
Run Code Online (Sandbox Code Playgroud)

如果 npm 异常终止,它将立即中止。

  • 要使用上述方法显示控制台输出,请按照 /sf/answers/2177342891/ 附加 stdio (3认同)

Foy*_*any 26

您可以使用exec从脚本运行

import {series} from 'async';
const {exec} = require('child_process');

series([
 exec('npm run dev'),
 exec('npm run test')
]); 
Run Code Online (Sandbox Code Playgroud)

  • 错误:需要一个函数和 UnhandledPromiseRejectionWarning:未处理的承诺拒绝。 (3认同)
  • UnhandledPromiseRejectionWarning 错误是因为系列参数需要一个函数数组。因此,您可以通过执行 ```series([ () => exec('npm run dev'), () => exec('npm run test') ]); 来解决此错误 ```` (2认同)

mze*_*ler 13

只需安装npm:

npm install npm
Run Code Online (Sandbox Code Playgroud)

然后在你的程序中:

npm.command.run('dev', (err) => { ... });
Run Code Online (Sandbox Code Playgroud)

有关详细信息,请参阅源代码.该npm.command对象是npm的非官方API.

  • 尽管@foysal-osmany 的回答有优势。见 /sf/ask/1117027061/ (4认同)
  • 另请注意,我同意使用 `exec` 更安全。我直接使用 `npm` 模块的原因是为了避免启动第二个 node.js 运行时。 (3认同)
  • @Xunnamius,不,这不是正确的答案。请参考您自己的链接。由于多种原因,将 npm 作为模块调用是不安全的。 (3认同)
  • 不稳定的 API 以及之前 npm/node.js 的特定版本之间存在问题的事实 (2认同)

zr0*_*ty7 13

npm 博客文章建议使用shelljs

let shell = require("shelljs");

shell.exec("echo shell.exec works");
shell.exec("npm run dev");
Run Code Online (Sandbox Code Playgroud)

请参阅https://blog.npmjs.org/post/118810260230/building-a-simple-command-line-tool-with-npm.html

  • 这实际上是一个很好的答案,它也打印出日志。 (2认同)