Gulp.jsとグロビングパターンを使用して、ファイルを同じ場所(同じ宛先)に変更します。


99

(gulp-ruby-sassを使用して).scssファイルを.cssファイルに変換し、結果の.cssファイルを元のファイルと同じ場所に配置しようとしているgulpタスクがあります。問題は、グロビングパターンを使用しているため、元のファイルがどこに保存されているかが必ずしもわからないことです。

以下のコードでは、gulp-tapを使用してストリームをタップし、ストリームが読み取られた現在のファイルのファイルパスを把握しようとしています。

gulp.task('convertSass', function() {
    var fileLocation = "";
    gulp.src("sass/**/*.scss")
        .pipe(sass())
        .pipe(tap(function(file,t){
            fileLocation = path.dirname(file.path);
            console.log(fileLocation);
        }))
        .pipe(gulp.dest(fileLocation));
});

の出力に基づいてconsole.log(fileLocation)、このコードは正常に動作するようです。ただし、結果のCSSファイルは、予想よりも1つ上位のディレクトリに配置されるようです。本来あるべき場所ではproject/sass/partials、結果のファイルパスはただproject/partialsです。

これを行うためのはるかに単純な方法がある場合、私は間違いなくその解決策をさらに感謝します。ありがとう!

回答:


155

ご想像のとおり、これは複雑すぎます。グロブドパスdestも同様に使用されるため、宛先は動的である必要はありません。srcをグロブしているのと同じベースディレクトリ(この場合は「sass」)にパイプします。

gulp.src("sass/**/*.scss")
  .pipe(sass())
  .pipe(gulp.dest("sass"));

ファイルに共通のベースがなく、パスの配列を渡す必要がある場合、これだけでは不十分です。この場合、baseオプションを指定します。

var paths = [
  "sass/**/*.scss", 
  "vendor/sass/**/*.scss"
];
gulp.src(paths, {base: "./"})
  .pipe(sass())
  .pipe(gulp.dest("./"));

ああ、素晴らしい。ありがとうございました。ソースにグロブを使用する簡単な方法はありsassますか?ただ、すべてをまっすぐにフォルダに入れてください?
Dan-Nolan 14

2
これは私にはうまくいきませんでした。私はしなければなりませgulp.src("dist/**/*")gulp.dest("./")
でした

@ Dan-Nolanは、フォルダー構造をフラット化する1つの方法として
gulp

@niftygrifty ドキュメントによるとそれ通常の状況で動作するはずです。この場合、ファイルは、計算された相対ベースに対して一致するグロブパスに書き込まれsassます。おそらくここのsassプラグインはすでにパスを変更していますか?
numbers1311407 2015年

1
しかし、これは/ sass / any / whereのような対応するサブディレクトリではなく、/ sassにファイルを保存しませんか?ファイルをグロブパスに保存するにはどうすればよいですか?
マーク

68

これは、numbers1311407が導いたよりも簡単です。宛先フォルダを指定する必要はなく、単にを使用します.。また、ベースディレクトリを必ず設定してください。

gulp.src("sass/**/*.scss", { base: "./" })
    .pipe(sass())
    .pipe(gulp.dest("."));

8
これが正解です。宛先の構造を保持しようとする場合(つまり、構造をフラット化しない場合)、gulp.srcでベースディレクトリを指定する必要あります。
Gui Ambros、2015

2
これを試してみると、ファイルは「/」に保存され、グロブパスの下には保存されません。
マーク

1
@GuiAmbrosの発言は正しくありません。少なくともドキュメントによるとそうではありません。デフォルトでは、ベースは、グロブパスの前のすべてになるように計算されます。私の答えでは、ベースはと計算されます./sassが、質問では出力がsassdirを保持することが指定されているため、で繰り返されますdest。この答えは、baseオプションを使用して同じ結果を達成しますが、どちらのアプローチも間違っていません。
数字1311407

それはOPの状況は一般的には、少なくとも、CSSの処理のために、など一般的にあなたに輸出に期待することはおそらくないことも注目すべきだcssではないから、ディレクトリまたは類似sassしますsass。そのような場合、受け入れられた答えは実際にはこの選択肢よりも簡単です。
numbers1311407

30
gulp.src("sass/**/*.scss")
  .pipe(sass())
  .pipe(gulp.dest(function(file) {
    return file.base;
  }));

もともとここで与えられた答え:https : //stackoverflow.com/a/29817916/3834540

私はこのスレッドが古いことを知っていますが、それでもGoogleの最初の結果として表示されるので、ここにリンクを投稿した方がいいと思いました。


このスレッドは古いですが、答えはまだ正しいですが、この方法は少し乾燥していると思います(少し効率が悪い場合)。リンクされた質問は、実際には、dest誤った使用の問題でした。確かに与えられた解決策は動作しますが、単純に置き換えて、右の初めてそれをやっdest('./')dest('./images')同じ結果を達成しているだろう、。
numbers1311407 2015年

他の解決策がうまくいかなかった理由は、gulp.src()内にgulp.src(['sass / **'、 'common / sass / **'])などの配列があり、答えは、これが私が見つけた投稿でした。おそらくそれを
もっと

理にかなっています。あなたの場合の問題は、gulpが計算するための共通のベースがないということです。あなたのソリューションは機能しますが、@ NightOwl888によって与えられた、ベースを指定するソリューションも機能します。共通の基盤がない場合を含むように、受け入れられた回答を更新します。
numbers1311407 2015年

これは受け入れられる答えになるはずです!他のファイルではなく、1つのファイルまたは基本パスのみに固有のものです。
MrCroft

0

これはとても役に立ちました!

gulp.task("default", function(){

    //sass
    gulp.watch([srcPath + '.scss', '!'+ srcPath +'min.scss']).on("change", function(file) {
         console.log("Compiling SASS File: " + file.path)
         return gulp.src(file.path, { base: "./" })
        .pipe(sass({style: 'compressed'}))
        .pipe(rename({suffix: '.min'}))
        .pipe(sourcemaps.init())
        .pipe(autoprefixer({
            browsers: ['last 2 versions'],
            cascade: false
        }))
        .pipe(sourcemaps.write('./'))         
        .pipe(gulp.dest(".")); 
    });

    //scripts
    gulp.watch([srcPath + '.js','!'+ srcPath + 'min.js']).on("change", function(file) {
        console.log("Compiling JS File: " + file.path)
        gulp.src(file.path, { base: "./" })
        .pipe(uglify())
        .pipe(rename({suffix: '.min'}))       
        .pipe(gulp.dest(".")); 
    });
})
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.