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

我已经从在Mac OSX下开发的第三方获得了一些NPM包。 它们的构build可以使用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 run build-prod”来build立任一目录(当然,在make.js中有一些条件语句)。 当然,它不能在Windows下工作 – 我不得不改变类似这样的命令:

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

(请注意,重要的是不要在'&&'之前放置一个空格 – 否则环境variables会创build一个额外的空白空间,这会破坏make.js中的所有这些比较)。

但是,我想有一些通用的源代码树,可以在Unix或Windows下工作,无需编辑。 你可以请给出一些想法,如何有条件地拆分取决于操作系统的构build?

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

如果你能够影响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 \'&& node make.js“将不起作用,因为process.env在本地进程中设置变量,而不是全局的不导出到系统)。


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