我已经从在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
的改变,我宁愿改变这个文件来接受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 \'&& node make.js“将不起作用,因为process.env
在本地进程中设置变量,而不是全局的不导出到系统)。
不是直接的解决方案,但为了最佳实践,使其工作不同。