12

我在编译我的 SASS 文件时遇到问题,现在将它们拆分出来并在我的主 scss 文件中导入我需要的文件。

我有一个样式文件夹,其中包含:

主文件

top_menu.scss

我在 main.scss 中添加了一些导入:

@import 'font-awesome';
@import 'bootstrap';
@import 'custom_bootstrap';    
@import 'top_menu';

我的 gulp-sass 任务看起来像这样

gulp.task('compile_sass', ['compile_bower_sass'], function () {
  return gulp.src(paths.scss_files, {base:'src'})
    .pipe(gulp.dest(paths.dist))
    .on('error', gutil.log)
    .pipe(sass().on('error', sass.logError))
    .pipe(minifycss({
      keepSpecialComments: false,
      removeEmpty: true
    }))
    .pipe(rename({suffix: '.min'}))
    .pipe(gulp.dest(paths.dist))
});

path.scss_files 变量设置为:

scss_files: './src/assets/styles/**/*.scss'

当任务运行时,我收到一个错误:

找不到或无法读取要导入的文件:top_menu

我实际上希望能够将我的 scss 拆分为单独的相关子文件夹,然后使用 @import: 'navigation\top_menu' 有点东西。

为什么会出现这个错误?

谢谢

编辑:

compile_bower_sass 任务编译其他一些 scss 文件(font-awesome、bootstrap、custom_bootstrap),正如您从我的 main.scss 上的 @import 行中看到的那样。

运行 compile_sass 任务并查看输出 (dist) 文件夹时,我看到 css 文件是从 compile_bower_sass 任务生成的(因此 font-awesome.css、bootstrap.css、custom_bootstrap.min.css)。我注意到 top_menu.scss 文件也被复制了,但没有被编译,所以我想这就是发生错误的原因。

我是否需要在我的任务中指定一个顺序,所以我是否可以确保它最后编译 main.scss 以确保任何必需的文件(例如我的自定义 top_menu.scss)首先被编译并且可供我的主文件访问?

编辑 2

好的,所以我认为我的想法归结为编译顺序是正确的。

如果我更改我的 scss_files 变量以明确设置它们通过管道传输到 gulp-sass 的顺序(这次我进一步组织到文件夹中)

scss_files:          ['./src/assets/styles/custom_bootstrap.scss',
                        './src/assets/styles/navigation/top_menu.scss',
                        './src/assets/styles/navigation/user_toolbar.scss',
                        './src/assets/styles/main.scss']

现在我原来的 compile-sass 任务按原样工作。

那么,我的下一个问题是如何配置 gulp-sass 以确保最后编译 main.scss 文件?或者我是不是走错了路?

编辑 3:

第一次问这个问题时,我可能应该添加这些额外的任务配置。所以 compile_sass 任务需要先运行 compile_bower_sass。

    /*-BOWER PACKAGEs INCLUSION --------------------------------------------*/
    gulp.task('compile_bower_sass', ['compile_bower_css'], function(){
      var sassFiles = mainBowerFiles('**/*.scss');
      return gulp.src(sassFiles)
        .pipe(rename(function(path){
          path.basename = path.basename.replace(/^_/, '');
          return path;
          // required where the string begins with _ , meaning that sass won't compile it (bootstrap)
        }))
        .pipe(sass({onError: function(e) { console.log(e); } }))
        .pipe(gulp.dest(paths.dist_styles));
    });

    gulp.task('compile_bower_css', function(){
      var cssFiles = mainBowerFiles('**/*.css');
      return gulp.src(cssFiles)
        .pipe(gulp.dest(paths.dist_styles));
    });

gulp.task('compile_sass', ['compile_bower_sass'], function () {
  return gulp.src(paths.scss_files, {base:'src'})
  .pipe(sass({outputStyle: 'compressed'})
      .on('error',   sass.logError))
  .pipe(rename({suffix: '.min'}))
  .pipe(gulp.dest(paths.dist))
});

我现在结束了

找不到或无法读取要导入的文件:font-awesome

在我的 dist 样式文件夹中,我可以看到 font-awesome.css 已经生成。我在 gulp 和 sass 编译方面还很陌生,所以毫无疑问我在这里误解了一些东西。

当使用@import 语句时,文件是在寻找那个名为 scss 还是 css 文件?

4

4 回答 4

10

我一直有同样的问题(使用带有 Sierra 的 mac),它似乎只发生在我使用包含的 glob 样式时。

事实证明这是由于竞争条件造成的,您可以通过像这样短暂等待来解决它...

var gulp = require('gulp');
var sass = require('gulp-sass');
var wait = require('gulp-wait');

gulp.task('scss', function () {
    gulp.src('resources/scss/**/*.scss')
        .pipe(wait(200))
        .pipe(sass())
        .pipe(gulp.dest('public/dist'));
});
于 2017-10-10T16:08:57.433 回答
7

在行之间添加换行符@import

我尝试了许多其他解决方案,有些人认为这是与设置有关的 SublimeText 问题"atomic_save": true,这对我不起作用。

我什至尝试添加一个.pipe(wait(500)). 也没有用。

然后我只是在违规之前添加了一个换行符@import。因此,在您的情况下,如果它引发有关 的错误top_menu,请放置一个换行符,使其变为:

@import 'custom_bootstrap';    

@import 'top_menu';

我不知道为什么,但这是唯一对我有用的东西。

作为最佳实践,我会在所有行之间添加换行符以防万一。

于 2017-10-13T15:17:36.063 回答
0

我试图重现您遇到的问题,但对我来说它似乎运行良好。

我将附上我的代码和文件夹结构的照片以进行比较。

唯一的遗漏是 ['compile_bower_sass'] 部分,因为我不完全确定您在这里需要什么。是否有可能应该使用 loadPath 代替?

您还会从文件夹的屏幕截图中注意到您的 scss 文件也被复制到 dist。这可能是不可取的。

这是 Gulp 代码:

var gulp = require('gulp');
var sass = require('gulp-sass');
var minifycss = require('gulp-minify-css');
var rename = require('gulp-rename');
var gutil = require('gulp-util');

var paths = {
  scss_files: './src/assets/styles/**/*.scss',
  dist: './dist'
};

gulp.task('compile_sass', function () {
  return gulp.src(paths.scss_files, {base:'src'})
    .pipe(gulp.dest(paths.dist))
    .on('error', gutil.log)
    .pipe(sass().on('error', sass.logError))
    .pipe(minifycss({
      keepSpecialComments: false,
      removeEmpty: true
    }))
    .pipe(rename({suffix: '.min'}))
    .pipe(gulp.dest(paths.dist))
});

这是文件夹: http ://take.ms/AOFND

也许您只需要:

var gulp = require('gulp');
var sass = require('gulp-sass');
var rename = require('gulp-rename');

var paths = {
  scss_files: './src/assets/styles/**/*.scss',
  dist: './dist'
};

gulp.task('compile_sass', function () {
  return gulp.src(paths.scss_files, {base:'src'})
    .pipe(sass({outputStyle: 'compressed'})
        .on('error', sass.logError))
    .pipe(rename({suffix: '.min'}))
    .pipe(gulp.dest(paths.dist))
});
于 2015-06-29T10:18:43.557 回答
0

我在尝试从 Gulp 3.9.1 迁移到 4.0.2 时遇到错误,这需要以不同的方式设置 gulpfile.js。我在我的文件中尝试了换行符,也尝试了等待,以防它是一个竞争条件。

利用gulp-plumber,它消除了错误,我的 sass 编译成功。

function compile_sass() {
    return gulp
        .src('./wwwroot/css/**/*.scss')
        .pipe(plumber())
        .pipe(sass())       
        .pipe(gulp.dest("./wwwroot/css"));
}

重要的部分是

.pipe(管道工())

于 2021-01-15T23:53:24.340 回答