【问题标题】:gulp-sass includePaths failing to include vendor scss (possible ordering issue as well)gulp-sass includePaths 未能包含供应商 scss(也可能是订购问题)
【发布时间】:2016-07-07 14:17:51
【问题描述】:

我的应用程序 sass(在 scss 文件中)位于我的 styles 目录中的各个子目录中,其中一些来自各个供应商的 @extend sass 样式(通过 bower)位于下的各个子目录中供应商目录。

不幸的是,sass 任务无法获取那些供应商 scss 文件和我失败的任何 @extend 声明,因为他们找不到他们试图扩展的 sass,例如

Error in plugin 'sass'
Message:
    styles/censum/censum.scss
Error: ".graph-row" failed to @extend ".row".
       The selector ".row" was not found.
       Use "@extend .row !optional" if the extend should be able to fail.
        on line 2 of styles/censum/censum.scss

我最小化的例子如下。

gulp.task('sass', function () {
  gulp.src('./styles/**/*.scss')
    .pipe(gulpSass({ includePaths: ['./vendor'] }).on('error', gulpSass.logError));
});

我还尝试将供应商目录添加到 gulp.src 并且不使用 includePaths,例如

gulp.task('sass', function () {
  gulp.src(['./vendor/**/*.scss', './styles/**/*.scss'])
    .pipe(gulpSass().on('error', gulpSass.logError));
});

这似乎确实引用了供应商文件(因为它拖了我猜的所有内容),但我确实遇到了以下问题:

Message:
    vendor/bower/eonasdan-bootstrap-datetimepicker/src/sass/_bootstrap-datetimepicker.scss
Error: Undefined variable: "$btn-primary-bg".
        on line 7 of vendor/bower/eonasdan-bootstrap-datetimepicker/src/sass/_bootstrap-datetimepicker.scss
$bs-datetimepicker-active-bg: $btn-primary-bg !default;

这可能是订购问题?

【问题讨论】:

  • 嗯,我想知道 includePaths 是否不会递归子目录?它似乎表明它在文档中确实如此
  • 您是在导入供应商文件还是尝试直接扩展它们?
  • 事实证明其意图是导入其中的一些。

标签: css sass gulp gulp-sass


【解决方案1】:

我所分享的内容是基于我对您问题的理解。我将从一个新项目的角度来讨论它,这对我来说似乎工作得很好。

假设我们有一个名为 sassy 的项目,其中有一个通过运行以下命令创建的 package.json 文件:

npm init -y

然后我们将像这样安装 Gulp 和 SASS 组件:

npm install gulp gulp-sass -save-dev

在我们项目根目录的 Gulpfile.js 中,我们有以下代码:

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

gulp.task('sass', function () {
  return gulp
    .src("./scss/**/*.scss")
    .pipe(sass({includePaths: ['./vendor']}))
    .pipe(gulp.dest("./dist"));
});

您可能从上面的代码中可以猜到,我们在项目的根目录下有一个 vendor 目录和一个 scss 目录。

由于我不知道您的 vendor 目录中有什么,因此我随机填充了我的目录。在 vendor/colors.scss 文件中,我有以下内容:

.danger {
    color: red;
}

.light {
    color: silver;
}

我还在 vendor/sizing/article.scss 找到了一个嵌套文件,其中包含以下代码:

.title {
    font-size: 22px;
}

现在让我们看看我的 scss 目录中有什么。

我有一个 scss/main.scss 文件,其中包含两个导入语句,如下所示:

@import "./sidebar/navigation";
@import "./content/blog";

再一次,所有这个项目都是随机的。我只是想展示所有这些文件和目录的构建过程。

我的 scss 文件夹中还有两个 SCSS 文件。我有一个带有以下代码的文件 scss/sidebar/navigation.scss

nav {
    padding: 10px;
}

最后我有一个包含大量导入和扩展的文件。此文件是 scss/content/blog.scss,它包含以下内容:

@import "colors";
@import "sizing/article";

.title {
    @extend .danger;
    @extend .title;
    font-weight: bold;
}

因为 Gulp 脚本包含 vendor 目录,所以我们可以为任何文件使用相对路径。我们从 vendor 目录导入这两个文件,然后在必要时扩展各种类。

运行 gulp sass 将在项目的 dist 目录中构建 CSS 文件。由于我只使用 scss/main.scss 进行导入,因此它将包含我们所有的样式。

这是你想要做的吗?如果是,请浏览我刚刚分享的所有内容,看看它是否适合您。

【讨论】:

  • 嗨,Nic,这个答案帮助我确认了修复:-)。我用包含我想要的导入的gulp.src('./styles/main.scss') 替换了gulp.src('./styles/**/*.scss'),这似乎已经清除了整个事情(我删除了 includePath 部分,似乎不再需要它)。
【解决方案2】:

IncludePaths 接受一个字符串数组。

尝试更新到以下内容。

gulp.task('sass', function () {
  gulp.src('./styles/**/*.scss')
    .pipe(gulpSass({ includePaths: ['./vendor'] }).on('error', gulpSass.logError));
});

查看文档:

https://github.com/sass/node-sass#includepaths

【讨论】:

  • 感谢现场!我已经解决了这个问题,但出现了同样的问题(我也更新了我的 Q)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-03-30
  • 2014-02-15
  • 1970-01-01
  • 2013-10-30
  • 1970-01-01
相关资源
最近更新 更多