如何覆盖文件并在同一个 gulp 任务中使用该文件?

How to overwrite file and use that file in same gulp task?

我什至不知道如何在标题中简短地解释我的问题。我想创建将遵循以下步骤的任务:

  1. 以Sass文件为源(例如src/scss/main.scss)
  2. 使用 'postcss-sorting'
  3. 对 css 属性进行排序
  4. 将源文件覆盖到同一路径(例如 src/scss/main.scss)
  5. 获取排序后的 scss 文件并编译为 css
  6. 写入 css 文件夹(例如 dist/css)

我尝试编写此任务,但是当我开始观察 scss 文件更改时,任务出现无限循环。我也尝试了 2 个不同的任务(一个用于排序 css 属性和写入文件,另一个用于编译和写入)它仍然循环。我不想只对 css 文件中的 css 属性进行排序,我也想对我的 scss 文件进行排序。这是我的示例代码:

// Load plugins
const {gulp, watch, src, dest, series} = require( 'gulp' ),
      browserSync = require('browser-sync').create(),
      postcss = require( 'gulp-postcss' ),
      sortProperties = require( 'postcss-sorting' ),
      sassParser = require( 'postcss-scss' ),
      sass = require( 'gulp-sass' );


// Load CSS property orders for 'postcss-sorting'
const propertySortOrder = require('./propertySortOrder');


// Style
const style = () => {
    return src('src/scss/**/*.scss')
        .pipe(
            postcss([sortProperties(propertySortOrder)], {
                syntax: sassParser,
            })
        )
        .pipe(dest('src/scss'))
        .pipe(sass().on('error', sass.logError))
        .pipe(dest('src/css'))
        .pipe(browserSync.stream());
}

// Start Server
const startServer = (done) => {
    browserSync.init({
        server: { baseDir: './' },
        injectChanges: true
    });

    done();
}

// Watch File Changes
const watchFileChanges = (done) => {
    watch('src/scss/**/*.scss', style);

    done();
}

exports.start = series(startServer, watchFileChanges);

谁能帮我解决这个问题?谢谢

P.S. 抱歉我所有的语法错误,英语不是我的母语。

你可以使用gulp-changed,它只会在有变化时覆盖文件,防止无限循环:

const changed = require('gulp-changed');
const clone = require( 'gulp-clone' );
const merge = require('merge-stream');


// Style
const style = () => {
    const sortedCssPipe = src('src/scss/**/*.scss')
        .pipe(
            postcss([sortProperties(propertySortOrder)], {
                syntax: sassParser,
            })
        );

    const scssPipe = sortedCssPipe
        .pipe(clone())
        .pipe(changed('src/scss', {hasChanged: changed.compareContents}))
        .pipe(dest('src/scss'));

    const cssPipe = sortedCssPipe
        .pipe(sass().on('error', sass.logError))
        .pipe(dest('src/css'))
        .pipe(browserSync.stream());

    return merge(scssPipe, cssPipe);
}