如何覆盖文件并在同一个 gulp 任务中使用该文件?
How to overwrite file and use that file in same gulp task?
我什至不知道如何在标题中简短地解释我的问题。我想创建将遵循以下步骤的任务:
- 以Sass文件为源(例如src/scss/main.scss)
- 使用 'postcss-sorting'
对 css 属性进行排序
- 将源文件覆盖到同一路径(例如 src/scss/main.scss)
- 获取排序后的 scss 文件并编译为 css
- 写入 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);
}
我什至不知道如何在标题中简短地解释我的问题。我想创建将遵循以下步骤的任务:
- 以Sass文件为源(例如src/scss/main.scss)
- 使用 'postcss-sorting' 对 css 属性进行排序
- 将源文件覆盖到同一路径(例如 src/scss/main.scss)
- 获取排序后的 scss 文件并编译为 css
- 写入 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);
}