web-dev-qa-db-ja.com

gulpを使用してファイル内の文字列を置換するにはどうすればよいですか?

私はgulpを使用して、実稼働用のjavascriptファイルをu化し、準備を整えています。私が持っているのはこのコードです:

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を含める必要がありますか?

しかし、ファイルのコピーを作成し、ファイル内の文字列を置換する方法については、gulpではわかりません。

あなたが与えるどんな助けも大歓迎です。

21
Alan2

Gulpは入力をストリーミングし、すべての変換を行い、出力をストリーミングします。 Gulpを使用している場合、一時ファイルをその間に保存することはよく知られています。

代わりに、あなたが探しているのは、コンテンツを置き換えるストリーミング方法です。自分で何かを書くのは簡単ですが、既存のプラグインを使用することもできます。私のために、 - 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その後、他のすべてのファイルのストリーム。

28
Jeroen

モジュール 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'))
});
8

最も正しい解決策は 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/'));
}

これは、ビルドフェーズ中に行われる変更を制御できるため、最適なソリューションです。

2
ollazarev

参照用にバージョン管理固有の例があります。 version.tsファイルがあり、その中にバージョンコードが含まれているとしましょう。次のようにできるようになりました。

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

上記の正規表現は、従来のバージョン形式の多くの状況で機能します。

1
GFxJamal