如何以编程方式执行“npm run”命令?
Posted
技术标签:
【中文标题】如何以编程方式执行“npm run”命令?【英文标题】:How to execute 'npm run' command programmatically? 【发布时间】:2016-10-28 04:10:48 【问题描述】:我有一些自定义测试脚本,我可以使用npm run test
命令运行它,它执行一些用于启动 e2e/单元测试的 Node 脚本。但在此之前,我必须在其他终端窗口中使用npm run dev
(它也是一些自定义节点脚本,细节无关紧要)启动 webpack 开发服务器。所以,我想省略 npm run dev
手动执行并将其移动到自定义 npm run test
脚本,即我想在 Node 脚本中以编程方式执行 webpack 开发服务器。如何使用 Node 脚本以编程方式执行 npm run dev
然后停止它?提前致谢!
"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"
【问题讨论】:
为什么不创建一个运行其他两个脚本的npm start
?喜欢"start": "npm run dev & npm run test"
@elclanrs npm run test
不应在 npm run dev
之前开始
为什么不运行webpack-dev-server
programmatically?
@robertklep - 这是个好建议,我会试试
@malcoauri 如果不起作用,请查看 this answer,它解释了如何以编程方式运行 NPM。
【参考方案1】:
您可以使用 exec 从脚本运行
import series from 'async';
const exec = require('child_process');
series([
() => exec('npm run dev'),
() => exec('npm run test')
]);
【讨论】:
错误:期望一个函数和 UnhandledPromiseRejectionWarning:未处理的承诺拒绝。 UnhandledPromiseRejectionWarning 错误是因为系列参数需要一个函数数组。所以你可以通过series([ () => exec('npm run dev'), () => exec('npm run test') ]);
来解决这个错误
我的工作和我认为正确的模式是(cb) => exec('npm run dev', cb)
【参考方案2】:
只需安装npm
:
npm install npm
然后在你的程序中:
npm.commands.run('dev', (err) => ... );
查看源代码以获取更多信息。 npm.command
对象是 npm 的非官方 API。请注意,使用exec
或spawn
执行npm
更安全,因为API 是非官方的。
【讨论】:
虽然@foysal-osmany 的回答有好处。见***.com/questions/15957529/… 太好了!我不知道您可以将 NPM 用作模块。 javascript API 文档在哪里? 另外请注意,我同意使用exec
更安全。我直接使用 npm
模块的原因是为了避免启动第二个 node.js 运行时。
@Xunnamius,不,这不是正确的答案。请参考您自己的链接。出于几个原因,将 npm 作为模块调用是不安全的。
不稳定的 API 以及之前在特定版本的 npm/node.js 之间存在问题的事实【参考方案3】:
使用PM2,真的好用又好用……
npm install pm2
const pm2 = require('pm2');
pm2.start(
script: 'npm -- run monitorTheWeather',
autorestart : false
, (err, apps) =>
pm2.disconnect()
if (err) throw err
)
【讨论】:
使用您的代码我收到以下错误:` C:\givingway\gw-ts\t.js:11 throw err ^ [ 错误:找不到脚本:C:\givingway\gw-ts \npm -- 运行测试`【参考方案4】:这是一个可以在所有平台上可靠运行的解决方案。它也非常简洁。将其放入build.js
,然后运行node build
。
const execSync = require('child_process')
execSync("npm run clean")
execSync("npm run minify")
execSync("npm run build_assets")
它会在 npm 异常终止时立即中止。
【讨论】:
要使用上述方法显示控制台输出,请按照***.com/a/31104898/5771199附加stdio【参考方案5】:npm 文档建议使用shelljs
:
var shell = require("shelljs");
shell.exec("echo shell.exec works");
shell.exec("npm run dev");
见https://blog.npmjs.org/post/118810260230/building-a-simple-command-line-tool-with-npm.html
【讨论】:
以上是关于如何以编程方式执行“npm run”命令?的主要内容,如果未能解决你的问题,请参考以下文章
如何以编程方式在android中使用blktrace命令执行shell脚本?