Grunt没有更新主scss文件

时间:2014-06-02 10:02:33

标签: sass gruntjs grunt-contrib-watch

我有一个项目使用GruntJS和grunt-contrib-sass,grunt-contrib-watch和grunt-newer。

我的主要app.scss文件使用@import指令(如

)导入一些.scss文件
  

@import“common / vars.scss”;

如果我在主app.scss中进行更改,一切正常。问题是,当我对正在导入的文件(如vars.scss)进行更改时,app.scss不会更新。

这是我的观察任务:

    watch: {
      css: {
        files: ['scss/**/*.scss'],
        tasks: ['newer:sass'],
        options: {
          spawn: false,
        }
      }
    }

这是本身的任务:

sass: {
      dist: {
        options: {
          style: 'compressed',
          noCache: true
        },
        /* looks for every .scss file in the scss folder (checks nested folders too), 
         * compile it and create another file wit the same name in the style folder */
        files: [{
          expand: true,
          cwd: 'scss',
          src: ['**/*.scss'],
          dest: 'style',
          rename: function (dest, src) {
            var folder    = src.substring(0, src.lastIndexOf('/'));
            var filename  = src.substring(src.lastIndexOf('/'), src.length);

            filename  = filename.substring(0, filename.lastIndexOf('.'));

            return dest + '/' + folder + filename + '.css';
          }
        }]
      }
    }

知道如何更改Gruntfile.js以涵盖这种情况吗? :)谢谢。

2 个答案:

答案 0 :(得分:2)

注意:这是this comment in an issue on the grunt-newer GitHub page的最低修改副本。

我提出了这个简单的委派任务,它可以解决您希望对src属性中指定的更改做出反应的任务:

grunt.initConfig( {
    delegate: {
        some_other_TASK: {
            src: [ 'some/src/path/**/*.ext' ],
            dest: 'some/dest/path/'
        }
    }
} );

grunt.registerTask( 'delegate', function() {
    grunt.task.run( this.args.join( ':' ) );
} );

grunt-contrib-sass的完整示例如下所示:

module.exports = function( grunt ) {
    require( 'load-grunt-tasks' )( grunt );

    grunt.initConfig( {
        delegate: {
            sass: {
                src: [ 'scss/**/*.scss' ],
                dest: 'style'
            }
        },

        sass: {
          dist: {
            options: {
              style: 'compressed',
              noCache: true
            },
            files: [{
              expand: true,
              cwd: 'scss',
              src: ['*.scss'],
              dest: 'style',
              ext: '.css'
            }]
          }
        }
    } );

    grunt.registerTask( 'delegate', function() {
        grunt.task.run( this.args.join( ':' ) );
    } );
};

您只需致电newer:delegate:sass(通过CLI或其他任务)。 grunt-newer检查相应delegate目标中给出的文件(我在其中包含了globbing模式**/)。如果找到新文件(子文件夹中也是.scss个文件),将调用相应的sass任务(具有给定目标)。

我不确定,如果制作一个单独的grunt插件在这里会有用。

编辑:我最近将上述代码(已清理)作为单独的npm包grunt-delegate发布。

答案 1 :(得分:-2)

我认为您的监视tasks变量是向后的,您可以通过打开终端进行检查,转到您通常运行的目录grunt watch但是如果不起作用则尝试运行newer:sass如果后期作品在您的观看设置中更改该行,请尝试sass:newer

此外,如果您只有一个sass任务,您可以将其更改为:

watch: {
      css: {
        files: ['scss/**/*.scss'],
        tasks: ['sass']
        options: {
          spawn: false
        }
      }
    }

正如旁注,似乎你的sass有不必要的复杂重命名功能,如果你只是想把scss/**/*.scss转换成style/**/*.css你应该能够使用它(取自grunt-contrib-sass自述文件):

grunt.initConfig({
  sass: {
    dist: {
      files: [{
        expand: true,
        cwd: 'scss',
        src: ['**/*.scss'],
        dest: 'styles',
        ext: '.css'
      }]
    }
  }
});

如果您有使用多个点的文件,例如:file.src.scssextDot: 'last'添加到文件数组