Modify file in place (same dest) using Gulp.js and a globbing pattern

Javascriptnode.jsSassGulp

Javascript Problem Overview


I have a gulp task that is attempting to convert .scss files into .css files (using gulp-ruby-sass) and then place the resulting .css file into the same place it found the original file. The problem is, since I'm using a globbing pattern, I don't necessarily know where the original file is stored.

In the code below I'm trying to use gulp-tap to tap into the stream and figure out the file path of the current file the stream was read from:

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));
});

Based on the output of the console.log(fileLocation), this code seems like it should work fine. However, the resulting CSS files seem to be placed one directory higher than I'm expecting. Where it should be project/sass/partials, the resulting file path is just project/partials.

If there's a much simplier way of doing this, I would definitely appreciate that solution even more. Thanks!

Javascript Solutions


Solution 1 - Javascript

As you suspected, you are making this too complicated. The destination doesn't need to be dynamic as the globbed path is used for the dest as well. Simply pipe to the same base directory you're globbing the src from, in this case "sass":

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

If your files do not have a common base and you need to pass an array of paths, this is no longer sufficient. In this case, you'd want to specify the base option.

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

Solution 2 - Javascript

This is simpler than numbers1311407 has led on. You don't need to specify the destination folder at all, simply use .. Also, be sure to set the base directory.

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

Solution 3 - Javascript

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

Originally answer given here: https://stackoverflow.com/a/29817916/3834540.

I know this thread is old but it still shows up as the first result on google so I thought I might as well post the link here.

Solution 4 - Javascript

This was very helpful!

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

Solution 5 - Javascript

if you want to save all files in their own path in the dist folder

const media = () => {
    return gulp.src('./src/assets/media/**/*')
        .pipe(gulp.dest(file => file.base.replace('src', 'dist'))
    )
}

const watch = () => {
  gulp.watch(
    "./src/**/*",
    media
  );
};

Attributions

All content for this solution is sourced from the original question on Stackoverflow.

The content on this page is licensed under the Attribution-ShareAlike 4.0 International (CC BY-SA 4.0) license.

Content TypeOriginal AuthorOriginal Content on Stackoverflow
QuestionDan-NolanView Question on Stackoverflow
Solution 1 - Javascriptnumbers1311407View Answer on Stackoverflow
Solution 2 - JavascriptNightOwl888View Answer on Stackoverflow
Solution 3 - JavascriptbobbarebyggView Answer on Stackoverflow
Solution 4 - JavascriptmftohfaView Answer on Stackoverflow
Solution 5 - JavascriptAyhanexeView Answer on Stackoverflow