【问题标题】:How to execute 'npm run' command programmatically?如何以编程方式执行“npm run”命令?
【发布时间】: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。

标签: javascript node.js


【解决方案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 的回答有好处。见stackoverflow.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 异常终止时立即中止。

【讨论】:

【解决方案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

【讨论】:

    猜你喜欢
    • 2020-02-13
    • 1970-01-01
    • 2013-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-29
    • 1970-01-01
    相关资源
    最近更新 更多