如何以编程方式执行“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。请注意,使用execspawn 执行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脚本?

CircleCI 没有运行“npm run”命令

在 Jenkins 中:如何运行 NPM install 、 npm run 和 Npm run 代理

如何以编程方式调用命令传递给它一个参数?

如何在node.js中以编程方式使用grep命令

如何以编程方式检测可执行文件在运行时所在的目录?