web-dev-qa-db-ja.com

Gulpはすべてのsrcファイルを上書きできますか?

たくさんのファイルのバージョン番号を置き換えたいとしましょう。その多くはサブディレクトリにあります。 gulp-replace を介してファイルをパイプ処理し、regex-replace関数を実行します。しかし、私は最終的にすべての元のファイルを上書きしたい。

タスクは次のようになります。

_gulp.src([
    './bower.json',
    './package.json',
    './docs/content/data.yml',
    /* ...and so on... */
  ])
  .pipe(replace(/* ...replacement... */))
  .pipe(gulp.dest(/* I DONT KNOW */);
_

それでは、各srcファイルが元の場所でそれ自体を上書きするように、どうすれば終了できますか?これを行うgulp.dest()に渡すことができるものはありますか?

30
davidtheclark

私は2つの解決策を考えることができます:

  1. 次のように、baseのオプションを_gulp.src_に追加します。

    _gulp.src([...files...], {base: './'}).pipe(...)...
    _

    これは、相対パス全体を保持するようgulpに指示します。次に、_'./'_をgulp.dest()に渡して、元のファイルを上書きします。 (注:これはテストされていません。機能しない場合に備えて、バックアップがあることを確認してください。)

  2. 関数を使用します。 GulpはJavaScriptなので、これを行うことができます。

    _[...files...].forEach(function(file) {
        var path = require('path');
        gulp.src(file).pipe(rename(...)).pipe(gulp.dest(path.dirname(file)));
    }
    _

    これらを非同期で実行する必要がある場合は、_event-stream.merge_のようなものを使用してストリームを配列にマップする必要があるため、最初の方法ははるかに簡単です。それは次のようになります

    _var es = require('event-stream');
    
    ...
    
    var streams = [...files...].map(function(file) {
            // the same function from above, with a return
            return gulp.src(file) ...
        };
    return es.merge.apply(es, streams);
    _
39
OverZealous

次のように、gulpに問題のファイルのベースディレクトリに書き込むように指示します。

    .pipe(
        gulp.dest(function(data){

            console.log("Writing to directory: " + data.base);
            return data.base;
        })
    )

(データ引数は レコードファイルオブジェクト です)

このアプローチの利点は、複数のソースからのファイルがそれぞれファイル構造の異なるレベルでネストされている場合、このアプローチにより各ファイルを正しく上書きできることです。 (パイプチェーンの上流に1つのベースディレクトリを設定するように配置されています)

14
Yiling

人々がそれを複雑にする理由はわかりませんが、Destinationパスを_"./"_で開始するだけでうまくいきます。

パスは_'dist/css'_とすると、このように使用できます.pipe(gulp.dest("./dist/css"));

それだけです、私は私のプロジェクトのすべての人にこのアプローチを使用しています。

0
Mosia Thabo

gulp-renameを使用している場合は、別の回避策があります。

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

...

function copyFile(source, target){
  gulp.src(source)
  .pipe(rename(target))
  .pipe(gulp.dest("./"));
}

copyFile("src/js/app.js","dist/js/app.js");

ソースとターゲットを絶対パスにしたい場合は、

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

...

function copyFile(source, target){
  gulp.src(source.replace(__dirname,"."))
  .pipe(rename(target.replace(__dirname,".")))
  .pipe(gulp.dest("./"));
}

copyFile("/Users/me/Documents/Sites/app/src/js/app.js","/Users/me/Documents/Sites/app/dist/js/app.js");
0
danyamachine