使用Gulp.js和globbing模式修改文件(相同的目标)

我有一个尝试将.scss文件转换成.css文件(使用gulp-ruby-sass)的gulp任务,然后将得到的.css文件放到find原始文件的相同位置。 问题是,因为我正在使用globbing模式,所以我不一定知道原始文件的存储位置。

在下面的代码中,我试图用gulp-tap来进入stream,并找出当前文件stream的读取文件path:

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文件似乎被放在比我预期的更高的目录。 它应该是project/sass/partials ,结果文件path只是project/partials

如果有这样一个更简单的方法,我一定会更加欣赏这个解决scheme。 谢谢!

如你所怀疑的,你正在使这个过于复杂。 由于globbedpath也用于dest ,因此目标不需要是dynamic的。 只需pipe道到你通配src的同一个基本目录,在本例中就是“sass”:

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

如果您的文件没有共同的基础,并且需要传递一组path,这已经不够了。 在这种情况下,您需要指定基本选项。

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

这比数字1311407更简单。 根本不需要指定目标文件夹,只需使用. 。 另外,一定要设置基本目录。

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

最初的答案在这里给出: https : //stackoverflow.com/a/29817916/3834540 。

我知道这个线程是旧的,但它仍然显示为谷歌的第一个结果,所以我想我不妨在这里发布链接。

这非常有帮助!

 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(".")); }); })