【问题标题】:how to create cross platform scripts (multiple command for single line) in package.json (nodeJs)如何在 package.json (nodeJs)中创建跨平台脚本(单行的多个命令)
【发布时间】:2017-05-23 18:30:57
【问题描述】:

问题: 在脚本中: 我们要检查环境。变量 {dev/test/mock} 并基于它运行以下脚本。

如果 $mock 为真,运行 script start-mock else 继续到达真正的测试服务器


场景 1: 我们在 package.json 脚本部分添加了聚合的命令

e.g. : "test": "export NODE_ENV=dev; grunt", [on linux]
which is "test": "(SET NODE_ENV=dev) & (grunt)", [on win32]

场景 2: 可能是包中的 bat/sh 脚本,我们从 package.json 中调用它们

方案 3:(永久解决方案) 不确定它是否已经可用

类似

get arguments from script section: to give flexibility and freedom to end user.
 e.g. : "test": "solution.env NODE_ENV=dev; solution grunt"

我们可以在哪里处理脚本(使用 process.platform 输入)取决于操作系统。


"start-pm2": "if \"%MOCK%\" == \"true\" (npm run mock & pm2 start process.json --env test) else (pm2 start process.json)", [windows] for linux if..fi

【问题讨论】:

  • 我们可以在所有平台上运行命令吗?感谢环境变量,但任何想法都有跨平台命令实现

标签: node.js package.json


【解决方案1】:

您需要实施解决方案 3。

您可以使用 cross-env 包为您做这件事。

【讨论】:

  • 谢谢@BrunoLM 你能为 [if..else] 跨平台解决方案提供什么建议
  • 也许您可以使用gulp 并创建自定义任务...
  • 不再维护cross-env
【解决方案2】:

让我们考虑实施第 3 解决方案,例如

package.json

"scripts": {
  "command" : "node bin/command.js"
}

bin/command.js

const spawn = require("child_process").spawn
const platform = require("os").platform()
const cmd = /^win/.test(platform)
  ? `${process.cwd()}\\bin\\command.bat`
  : `${process.cwd()}/bin/command.sh`

spawn(cmd, [], { stdio: "inherit" }).on("exit", code => process.exit(code))

取决于环境脚本将执行command.batcommand.sh

【讨论】:

  • 您好,运行时我得到:错误:spawn bin\removeReports.bat ENOENT。你能帮忙吗?
  • @mismas 我已经在 Windows 上更新并测试了上面的代码,似乎可以正常工作
  • 很抱歉再次打扰您,但是当我这次在 Linux(准确地说是 Mac OS)上运行它时,我收到一个错误:错误:在最后一行代码中生成 EACCES。在 Windows 上它可以完美运行。您有任何解决方法的想法吗? :D
  • 这是来自日志的 sn-p:错误:在 Object. (/Users/mismas/dev/project/test/config/bin/removeReports.js:7:1) ...
  • 您好,感谢您对 exec 的帮助。而且干净多了。这是代码:const exec = require("child_process").exec; const platform = require("os").platform(); const isWindows = /^win/.test(platform); const cmd = isWindows ? ${process.cwd()}\\test\\config\\bin\\removeReports.bat`:${process.cwd()}/test/config/bin/removeReports.sh;执行(cmd);`
【解决方案3】:

使用:run-script-os

例如:

// from pacakge.json
"scripts": {
    // ...
    "dist": "run-script-os",
    "dist:win32": "tar -C dist -cvzf %npm_package_name%-%npm_package_version%.tgz .",
    "dist:linux": "tar -C dist -cvzf $npm_package_name-$npm_package_version.tgz ."
},

【讨论】:

    猜你喜欢
    • 2020-05-10
    • 2019-08-15
    • 2019-02-21
    • 2020-08-11
    • 2022-08-17
    • 2019-05-13
    • 1970-01-01
    • 2018-03-31
    • 1970-01-01
    相关资源
    最近更新 更多