Grunt doesn't update main scss file

后端 未结 2 1462
星月不相逢
星月不相逢 2021-01-02 20:30

I have a project that uses GruntJS with grunt-contrib-sass, grunt-contrib-watch and grunt-newer.

My main app.scss file imports a few .scss files with the @import dir

相关标签:
2条回答
  • 2021-01-02 20:50

    Note: This is a minimally modified copy of this comment in an issue on the grunt-newer GitHub page.


    I came up with this simple delegation task that does the trick for tasks where you would like to react to changes other than specified in the src property:

    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( ':' ) );
    } );
    

    A complete example for grunt-contrib-sass would look like the following:

    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( ':' ) );
        } );
    };
    

    You just have to call newer:delegate:sass (via CLI, or some other task). grunt-newer checks the files given in the according delegate target (where I have the globbing pattern **/ included). If there are new files found (also .scss files in subfolders), the according sass task (with the given target) will be called.

    I'm unsure, though, if making a separate grunt plugin would be of use here.


    Edit: I recently released the above code (cleaned up) as separate npm package grunt-delegate.

    0 讨论(0)
  • 2021-01-02 20:56

    I think your watch tasks variable is backwards, you can check by opening terminal, going to the directory you would normally run grunt watch but try running newer:sass if that doen't work, try sass:newer if the later works change that line in your watch settings.

    Also, if you only have one sass task you can just change it to:

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

    Just as a side note, it seems that your sass has needlessly complicated rename function, if you're just trying to take scss/**/*.scss and turn them into style/**/*.css you should be able to use this (taken from the grunt-contrib-sass readme):

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

    if you have files that use multiple dots eg: file.src.scss add extDot: 'last' to the files array

    0 讨论(0)
提交回复
热议问题