gulp.js + browserify:dynamic生成特定于开发的文件

我有一个应用程序,它有一些特定于开发的debugging代码。 目前,所有的开发代码都由文件顶部的一个名为dev的variables来保护。 这里是我的应用程序的一个例子:

 var dev = true; if (dev) { console.log("Hello developer"); } else { console.log("Hello production"); } 

当我去部署我的应用程序时,我必须手动将开发variables窗体true更改为false。 这很糟糕。

我正在从手动编译迁移到gulp.js,我希望能够清楚地解决这个开发与生产构build问题。 我正在考虑以下内容:

 // Inside main.js var dev = require('./isdev'); if (dev) //... // Inside isdev.js: module.exports = true; 

现在,当我为生产构build时,而不是手动将dev标志设置为false ,我想从module.exports = true;replaceisdev.js module.exports = true;module.exports = false; 。 我的具体问题是, 如何使gulp自动化,使得gulp development生成一个dev = true的文件,并且用dev = false生成一个gulp production文件。

这是对那些好奇的更新。

首先,我有一个options.js

 exports.dev = false; 

我也有一个options_dev.js

 exports.dev = true; 

gulpfile.js里面,我有以下parsinginput参数的代码:

 // Parse the arguments. Use `gulp --prod` to build a production extension var argv = parseArgs(process.argv.slice(2)); var dev = !argv['prod']; // Whether to build a development extension or not 

最后,当我pipe道browserify,我有以下几点:

 var resolve = require('browser-resolve'); // ... .pipe(browserify({ debug: dev, resolve: function(pkg, opts) { // Replace options.js with options_dev.js if this is a dev build if (dev) { opts.modules['./options'] = 'src/options_dev.js'; } return resolve.apply(this, arguments); } })) 

神奇的事情发生在使用自定义的parsing函数,dynamic交换./optionsoptions_dev开发构build。 browserify文档说:

您可以浏览一个自定义的opts.resolve()函数,或者默认使用浏览器parsing。

当我们运行gulp ,我们build立一个开发版本。 当我们运行gulp --prod ,我们build立一个生产版本。 require('./options').dev允许我们dynamic地改变服务器端点等东西。很酷!

我已经看到完成的方法是在执行命令之前在命令行上设置环境variables。 使用Node.JS CLI(在类似bash的环境中)这样做的一个例子是:

 ENV=dev node > process.env.ENV 'dev' 

然后在你的代码中,你可以这样做:

 var dev = process.env.ENV === 'dev' 

所以用吞咽,你可以使用:

 ENV=dev gulp <task name> 

我用下面的代码片段testing了一下,结果如下:

 gulp.task('dev', function(){ if (process.env.ENV === 'dev') console.log("IT WORKED"); else console.log("NO DICE"); }); 

编辑:

您可以在构build之前将环境写入文件isdev

 var fs = require('fs'); gulp.task('build', function(){ if (process.env.ENV === 'dev') fs.writeFileSync('isdev', 'module.exports = true'); else fs.writeFileSync('isdev', 'module.exports = false'); // kick off build }); 

现在,在构build的bundle中的任何require调用都会在isdev出现正确的值。 您也可以将其扩展到其他指定的环境(或其他configuration标志)。