NPM:使package.json在Unix(Mac OSX)和Windows下运行

时间:2014-07-08 15:38:50

标签: json windows node.js unix

我从在Mac OSX下开发的第三方获得了一些NPM包。他们的构建可以使用"脚本"分为开发或生产。 package.json中的对象。例如:

 "scripts": {
    "build": "NODE_ENV=dev node make.js --build",
    "build-prod": "NODE_ENV=prod node make.js --build",
  }

在Unix下,可以运行" npm run build"或者" npm运行build-prod"构建任一目录(当然,make.js中有一些条件语句)。 当然,它在Windows下不起作用 - 我不得不改变类似的命令:

 "scripts": {
    "build": "set NODE_ENV=dev&& node make.js --build",
    "build-prod": "set NODE_ENV=prod&& node make.js --build",
  }

(请注意,在'&&&'之前放置一个空格非常重要 - 否则环境变量会在其中创建额外的空白区域这毁坏了make.js中的所有比较。

但是,我希望有一些通用源代码树可以在Unix或Windows下运行而无需编辑。您能否就如何根据操作系统有条件地拆分构建提出一些想法?

2 个答案:

答案 0 :(得分:2)

我一直在思考,但我怀疑使用这些工具有任何美学解决方案,以达到预期的效果。

如果您能够影响make.js中的更改,我宁愿将此文件更改为接受proddev作为参数,例如:node make.js --build=dev。使用默认值,以确保向后兼容性。

仅使用npm而不修改make.js,我可以考虑只运行另一个JavaScript代码,这将改变环境变量,然后调用make.js

这看起来像是:

"build": "node middleman.js"

然后,Middleman.js文件可以使用child_process或其他模块来设置变量并执行node make.js文件。

如果您不想创建额外的文件,可以使用以下命令将所有JavaScript嵌入到package.json中:

"build": "node -e 'my code'"

警告,运行" node -e' process.env [\' NODE_ENV \'] = \' dev \' &安培;&安培;节点make.js"将无效,因为process.env在本地进程中设置变量,而不是全局(即不导出到系统)。


不是直接解决方案,但为了达到最佳实践,请使其工作不同。

答案 1 :(得分:2)

这个问题很老了,但对于现在面临问题的人来说,从版本> = 5.1.0开始的 npm 支持设置用于处理脚本的shell。默认情况下,在Windows上,npm内部使用cmd.exe运行脚本,即使在git-bash中输入了npm命令本身也是如此。将git-bash设置为shell后,使用bash语法的脚本在Windows上正常工作:

npm config set script-shell "C:\\Program Files\\Git\\bin\\bash.exe"

这里需要用正确的路径替换git-bash可执行文件。