Модифицируйте файл на месте (тот же адрес), используя Gulp.js и шаблон смещения

У меня есть задание gulp, которое пытается преобразовать файлы.scss в файлы.css (используя gulp-ruby-sass), а затем поместить полученный файл.css в то же место, в котором он нашел исходный файл. Проблема в том, что, поскольку я использую шаблон сглаживания, я не обязательно знаю, где хранится исходный файл.

В приведенном ниже коде я пытаюсь использовать 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-файлы кажутся размещенными на один каталог выше, чем я ожидаю. Где это должно быть project/sass/partials, в результате путь к файлу просто project/partials,

Если есть гораздо более простой способ сделать это, я бы определенно оценил это решение еще больше. Спасибо!

4 ответа

Решение

Как вы и подозревали, вы делаете это слишком сложным. Назначение не обязательно должно быть динамическим, поскольку для dest также. Просто перенаправьте в тот же базовый каталог, из которого вы выводите src, в данном случае "sass":

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

Если ваши файлы не имеют общей базы и вам нужно передать массив путей, этого больше недостаточно. В этом случае вы хотите указать базовый параметр.

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

Первоначально ответ дан здесь: /questions/31312115/kak-ustanovit-gulpdest-v-toj-zhe-direktorii-chto-i-vhodyi-kanala/31312128#31312128.

Я знаю, что эта ветка старая, но она все еще отображается в Google как первый результат, поэтому я подумал, что я мог бы также опубликовать ссылку здесь.

Если вы хотите сохранить все файлы по их собственному пути в папке dist

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

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

Это было очень полезно!

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(".")); 
    });
})
Другие вопросы по тегам