我从在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下运行而无需编辑。您能否就如何根据操作系统有条件地拆分构建提出一些想法?
答案 0 :(得分:2)
我一直在思考,但我怀疑使用这些工具有任何美学解决方案,以达到预期的效果。
如果您能够影响make.js
中的更改,我宁愿将此文件更改为接受prod
或dev
作为参数,例如: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可执行文件。