【问题标题】:How to get gulp to watch my sass file changes and create one css file?如何让 gulp 观察我的 sass 文件更改并创建一个 css 文件?
【发布时间】:2017-01-05 21:56:36
【问题描述】:

我正在开发一个使用 ASP.NET MVC 5 框架开发的应用程序。我正在使用 Visual Studio 2013 编写我的应用程序。

我需要使用gulp 来自动编译我的 sass 文件并将它们发布到 bundle.css 文件中。

要做到这一点,这就是我所做的

  1. 在我的机器上安装了NodeJs
  2. 使用npm install -g gulp 全局安装gulp
  3. 在项目的根项目中创建了一个名为gulpfile.js的文件
  4. 使用npm init 命令创建了package.json 文件
  5. 通过从我的项目npm install gulp --save-dev 的根目录执行以下命令,将 gulp 添加到我的开发依赖项中
  6. 将以下代码添加到我的gulpfile.js
  7. 我从命令控制台触发了gulp 命令,显示以下信息

    使用 gulpfile ...gulpfile.js

    开始“观看”...

    21 毫秒后完成“观看”

    开始“默认”...

    31 µs 后完成“默认”

但是当我将代码写入我的 ~/Assets/Sass/**/*.sass 时,没有任何东西可以按预期保存到 ~/Public/Css/bundle.css

这是gulpfile.js 的样子

const gulp = require('gulp'),
      sass = require('gulp-ruby-sass');

// Default task which will be be fired when the runner is started
gulp.task('default', ['watch']);

// listener task
gulp.task('watch', function(){

    //Watch any change in the sass directory and trigger the "compileSass" for every save
    gulp.watch('~/Assets/Sass/**/*.sass', ['compileSass']);

});

// Task to compile the sass files
gulp.task('compileSass', () =>
    sass('~/Assets/Sass/**/*.sass')
        .on('error', sass.logError)
        .pipe(gulp.dest('~/Public/Css/bundle.css'))
);

我在这里缺少什么?每次保存后如何让被监视者观看并触发任务?

更新

我从使用gulp-ruby-sass 插件切换到使用gulp-scss。现在,我每次保存 scss 文件时都会运行任务,但由于某种原因它不会更新目标文件。

这是我的gulpfile.js 文件的样子

const gulp = require('gulp'),
      scss = require('gulp-scss');

// Default task which will be be fired when the runner is started
gulp.task('default', ['watch']);

// listener task
gulp.task('watch', function(){

    //Watch any change in the "Sass" directory and trigger the "compileScss" for every save
    gulp.watch('./Assets/Scss/**/*.scss', ['compileScss']);

});

// Task to compile the "Scss" files
gulp.task('compileScss', function () {
    gulp.src('./Assets/Scss/**/*.scss')
        .pipe(scss({ "bundleExec": true }))
        .pipe(gulp.dest('./Public/Css/bundle.css'));
});

【问题讨论】:

  • 我不确定 gulp 是否理解路径中的波浪号 (~)。尝试使用./ 而不是~/ 开始您的路径。另外,我会验证您的compileSass 任务在直接调用时是否按预期工作(没有手表)。
  • 感谢您的有用提示!现在我将 ~ 更改为 . 后出现新错误。这是错误'sass' is not recognized as an internal or external command, operable program or batch file. Error in plugin 'gulp-ruby-sass' Message: Gem undefined is not installed.
  • 如果你想使用gulp-ruby-sass,你可能需要在你的机器上安装Ruby和sass gem——参考this question。但是,您可能会发现使用 gulp-sass 会更容易,除非您有充分的理由使用 gulp-ruby-sass。
  • @SergeyK 谢谢。我切换到使用gulp-scss 现在每次我保存扩展名为scss 的文件时,我都可以在控制台中看到一个新行,上面写着Starting compileScss.... Finished compileScss` 但文件bundle.css 没有得到填充。是的,我在我的 site.scss 文件中添加了代码。请查看我更新的问题以查看我当前的代码
  • 这是指定目的地的正确方法。对scss 的调用可能出现问题,并且流中没有错误处理程序,因此错误被吞没了。您可以尝试将.on('error', ...) 处理程序添加到流(您可以安装gulp-util 并将其通过管道传输到gutil.log)。我还强烈建议您使用 gulp-sass 而不是 gulp-scss,因为 gulp-scss 已明确标记为已过时。

标签: css node.js sass gulp


【解决方案1】:

您可能缺少 gulp-watch要求

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

来自gulp-watch

watch(glob, [options, callback]) 创建一个监视者 由 glob 匹配的文件,可以是 glob 字符串或数组 全局字符串。

返回将发出乙烯基文件的直通流(带有 附加事件属性)对应于文件系统上的事件。

你必须提供一个函数。这意味着任务名称是不够的。

尝试使用 gulp-batch 在手表上运行一些任务:

npm install gulp-batch --save-dev

您的观看任务:

// listener task
gulp.task('watch', function(){

   var watch = require('gulp-watch');
   var batch = require('gulp-batch');

    //Watch any change in the sass directory and trigger the "compileSass" for every save
    watch('~/Assets/Sass/**/*.sass', batch(function (events, done) {
        // run your compileSass task
        gulp.start('compileSass', done);

    }));

});

编辑:

您可以在“Task Runner Explorer”窗口中从 Visual Studio 2015 运行任务。

但是,如果您有一个提示运行 gulp-watch,它应该具有相同的效果,并在检测到您正在观看的文件的更改时运行您的编译任务,无论它们是在哪里编辑的。

【讨论】:

  • 现在控制台看起来甚至不像正在观看。它只是执行命令并提示您输入新命令。我相信 gulp 带有一个 watch api,它允许你观看文件。这是一个展示如何使用它的教程,我遵循了scotch.io/tutorials/automate-your-tasks-easily-with-gulp-js
  • 我很抱歉。老实说,我从未使用过 gulp 的内置手表。甚至 gulp 的传道者也建议使用插件 gulp-watch。所以我认为这是标准。无论如何,如果你让它工作,我很想知道你是如何让它工作的。我希望我能帮助你更多。
  • 使用gulp.watch 一点也不稀奇。 gulp-watch 有一些很棒的功能,但是在这种简单的情况下,不需要添加额外的节点模块权重和 gulpfile 权重。 @WilmerSaint 您可以在几秒钟内了解 gulp.watch - 查看 npmjs.com/package/gulp-sass 中的“sass:watch”任务
【解决方案2】:

要检查的基本事项是文件夹位置是否存在、文件名和读/写权限。

示例 gulpfile.js 在 Zurb Foundation 6 项目中使用 gulp.watchgulp-load-plugins (foundation-cli)。

注意.pipe(gulp.dest('../your/path/css')); 不包括 ~ 或指定文件名或扩展名。它只指定一个路径。放置在该路径中的文件的默认名称为style.css,因为源文件名称为style.scss。见gulp.src('scss/style.scss')行。

var gulp = require('gulp');
var $    = require('gulp-load-plugins')();

// Multiple locations of SCSS to combine
var sassPaths = [
  'bower_components/foundation-sites/scss',
  'bower_components/motion-ui/src'
];

gulp.task('sass', function() {
  return gulp.src('scss/style.scss')           // SCSS Source file
    .pipe($.sass({
      includePaths: sassPaths,
      outputStyle: 'compressed'               // if css compressed **file size**
    })
      .on('error', $.sass.logError))
    .pipe($.autoprefixer({
      browsers: ['last 2 versions', 'ie >= 9']
    }))
    .pipe(gulp.dest('../your/path/css'));     // OUTPUT Destination
});

gulp.task('default', ['sass'], function() {
  gulp.watch(['scss/**/*.scss'], ['sass']);   // FILES to Watch
});

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-03-23
    • 2019-10-17
    • 1970-01-01
    • 2015-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多