如何使用gulp替换文件中的字符串?

时间:2016-03-27 04:36:50

标签: javascript gulp gulp-concat gulp-replace

我正在使用gulp来uglify并准备我的javascript文件进行制作。我所拥有的是这段代码:

var concat = require('gulp-concat');
var del = require('del');
var gulp = require('gulp');
var gzip = require('gulp-gzip');
var less = require('gulp-less');
var minifyCSS = require('gulp-minify-css');
var uglify = require('gulp-uglify');

var js = {
    src: [
        // more files here
        'temp/js/app/appConfig.js',
        'temp/js/app/appConstant.js',
        // more files here
    ],

gulp.task('scripts', ['clean-js'], function () {
    return gulp.src(js.src).pipe(uglify())
      .pipe(concat('js.min.js'))
      .pipe(gulp.dest('content/bundles/'))
      .pipe(gzip(gzip_options))
      .pipe(gulp.dest('content/bundles/'));
});

我需要做的是替换字符串:

dataServer: "http://localhost:3048",

dataServer: "http://example.com",

在文件' temp / js / app / appConstant.js',

我正在寻找一些建议。例如,也许我应该复制appConstant.js文件,更改(不确定如何)并在js.src中包含appConstantEdited.js?

但我不确定如何制作文件的副本并替换文件中的字符串。

非常感谢您给予的任何帮助。

4 个答案:

答案 0 :(得分:27)

Gulp输入流,完成所有转换,然后输出流。使用Gulp时,在其间保存临时文件是AFAIK非惯用文件。

相反,您正在寻找的是一种替换内容的流媒体方式。自己写一些东西会很容易,或者你可以使用现有的插件。对我来说,gulp-replace效果很好。

如果你想在所有文件中进行替换,可以很容易地改变你的任务:

var replace = require('gulp-replace');

gulp.task('scripts', ['clean-js'], function () {
    return gulp.src(js.src)
      .pipe(replace(/http:\/\/localhost:\d+/g, 'http://example.com'))
      .pipe(uglify())
      .pipe(concat('js.min.js'))
      .pipe(gulp.dest('content/bundles/'))
      .pipe(gzip(gzip_options))
      .pipe(gulp.dest('content/bundles/'));
});

您也可以gulp.src仅对您希望模式所在的文件执行gulp-replace,然后通过gulp.src单独传输它们,并将其与所有其他文件的{{1}}流合并之后。

答案 1 :(得分:8)

您也可以使用模块gulp-string-replace来管理正则表达式,字符串甚至函数。

示例:

<强>正则表达式:

var replace = require('gulp-string-replace');

gulp.task('replace_1', function() {
  gulp.src(["./config.js"]) // Every file allown. 
    .pipe(replace(new RegExp('@env@', 'g'), 'production'))
    .pipe(gulp.dest('./build/config.js'))
});

<强>字符串:

gulp.task('replace_1', function() {
  gulp.src(["./config.js"]) // Every file allown. 
    .pipe(replace('environment', 'production'))
    .pipe(gulp.dest('./build/config.js'))
});

<强>功能:

gulp.task('replace_1', function() {
  gulp.src(["./config.js"]) // Every file allown. 
    .pipe(replace('environment', function () {
       return 'production';
    }))
    .pipe(gulp.dest('./build/config.js'))
});

答案 2 :(得分:2)

我认为最正确的解决方案是使用gulp-preprocess模块。它将执行您需要的操作,具体取决于在构建期间定义或未定义的变量PRODUCTION

源代码:

/* @ifndef PRODUCTION */
dataServer: "http://localhost:3048",
/* @endif */
/* @ifdef PRODUCTION **
dataServer: "http://example.com",
/* @endif */

<强> Gulpfile:

let preprocess = require('gulp-preprocess');
const preprocOpts = {
  PRODUCTION: true
};

gulp.task('scripts', ['clean-js'], function () {
  return gulp.src(js.src)
    .pipe(preprocess({ context: preprocOpts }))
    .pipe(uglify())
    .pipe(concat('js.min.js'))
    .pipe(gulp.dest('content/bundles/'));
}

这是最佳解决方案,因为它允许您控制在构建阶段所做的更改。

答案 3 :(得分:1)

我有一个版本控制的具体示例供您参考。 假设你有version.ts文件,它包含里面的版本代码。您现在可以执行以下操作:

gulp.task ('version_up', function () {
    gulp.src (["./version.ts"])
        .pipe (replace (/(\d+)\.(\d+)(?:\.(\d+))?(?:\-(\w+))?/, process.env.VERSION))
        .pipe (gulp.dest ('./'))
});

上述正则表达式适用于任何传统版本格式的许多情况。