【问题标题】:grunt-watch is skipping some of my tasks, why?grunt-watch 正在跳过我的一些任务,为什么?
【发布时间】:2014-03-31 23:45:44
【问题描述】:

我已经设置了一个 grunt 文件来自动化我的一些任务。我还将监视任务拆分为更小的子任务,prevent it becoming one monolithic watch task

每个单独的任务过去都运行得非常好,但现在看起来 watch 在发生一些文件更改时丢失了它们。例如,它会检测我的 scss 中的更改并对其进行编译。但它会错过编译后的css中的后续更改,并跳过autoprefix和ftp-deploy。

我该如何纠正这个问题?我是否需要使用 debouncedelay,是我的手表生成设置错误,还是有其他问题?

module.exports = function(grunt) {

  // Load all grunt tasks matching the `grunt-*` pattern
  require('load-grunt-tasks')(grunt);

  // All configuration goes here 
  grunt.initConfig({
    pkg: grunt.file.readJSON('package.json'),

    // Template strings for directories
    dirs: {
      // Dev
      dev_js: 'js',
      dev_css: 'css',
      dev_scss: 'scss',
      dev_js_authored: '<%= dirs.dev_js %>/authored',
      dev_js_libs: '<%= dirs.dev_js %>/libs',
      dev_js_build: '<%= dirs.dev_js %>/build',
      dev_css_build: '<%= dirs.dev_css %>/build',
      // Production
      prod_server_root: '/wp-content/themes',
      prod_current_theme: '<%= dirs.prod_server_root %>/themename',
      prod_css: '<%= dirs.prod_current_theme %>/css'
    },

    // Template strings for ftp
    ftp_cred: {
      prod_host: 'ip-here',
      prod_auth: 'auth-here'
    },

    // Concatenate
    concat: {   
      js: {
        src: [
          '<%= dirs.dev_js_libs %>/*.js',
          '<%= dirs.dev_js_authored %>/*.js'
        ],
        dest: '<%= dirs.dev_js_build %>/production.js'
      }
    },

    // Minify
    uglify: {
      js: {
        src: '<%= dirs.dev_js_build %>/production.js',
        dest: '<%= dirs.dev_js_build %>/production.min.js'
      }
    },

    // Sass
    sass: {
      compile: {
        options: {
          style: 'compressed'
        },
        files: {
          'css/build/unprefixed.min.css': 'scss/global.scss'
        }
      }
    },

    // Autoprefixer
    autoprefixer: {
      prefix: {
        single_file: {
         src: '<%= dirs.dev_css_build %>/unprefixed.min.css',
         dest: '<%= dirs.dev_css_build %>/production.min.css'
        }
      }
    },

    // FTP
    'ftp-deploy': {
      css: {
        build: {
          auth: {
            host: '<%= ftp_cred.prod_host %>',
            port: 21,
            authKey: '<%= ftp_cred.prod_auth %>'
          },
          src: '<%= dirs.dev_css %>',
          dest: '<%= dirs.prod_css %>',
          exclusions: ['<%= dirs.dev_css_build %>/unprefixed.min.css']
        }        
      }
    },

    // Watch
    watch: {
      scripts_concat: {
        files: ['<%= dirs.dev_js_authored %>/*.js','<%= dirs.dev_js_libs %>/*.js'],
        tasks: ['concat:js']
      },
      scripts_min: {
        files: ['<%= dirs.dev_js_build %>/production.js'],
        tasks: ['uglify:js']
      },
      scss_compile: {
        files: ['<%= dirs.dev_scss %>/**/*.scss'],
        tasks: ['sass:compile']
      },
      css_prefix: {
        files: ['<%= dirs.dev_css_build %>/unprefixed.min.css'],
        tasks: ['autoprefixer:prefix']
      },
      ftp_css: {
        files: ['<%= dirs.dev_css_build %>/production.min.css'],
        tasks: ['ftp-deploy:css']
      },
      livereload: {
        options: { livereload: true },
        files: ['<%= dirs.dev_css_build %>/production.min.css','<%= dirs.dev_js_build %>/production.min.js']
      }
    }

  });

  // Load required plugins
  require('load-grunt-tasks')(grunt);

  // Define what to do at which command
  grunt.registerTask('default', ['watch']);

};

【问题讨论】:

    标签: javascript css gruntjs watch


    【解决方案1】:

    如果您运行grunt watch:scss_compileftp_css 任务将不会运行,因此对 production.min.css 的更改不会触发 ftp 部署...

    所以您可能想要在grunt-concurrent 的帮助下同时运行两个watch 任务

    concurrent: {
        options: {
            logConcurrentOutput: true
        },
        css: {
            tasks: ["watch:scss_compile", "watch:ftp_css"]
        }
    }
    

    然后:

    grunt.registerTask(["concurrent:css"]); // add this task to your default task
    

    查看参考资料了解更多详情:How to run two grunt watch tasks simultaneously

    然而,我会将watch 任务分成两个块:jscss,因为我假设所有与css 相关的任务无论如何都必须在更改时运行。我会做类似的事情:

      css: {
        files: ['<%= dirs.dev_scss %>/**/*.scss'],
        tasks: ['sass:compile', 'autoprefixer:prefix', 'ftp-deploy:css', 'watch:livereload']
      },
      livereload: {
        options: { livereload: true },
        files: [
            '<%= dirs.dev_css_build %>/production.min.css',
            '<%= dirs.dev_js_build %>/production.min.js'
        ]
      }
    

    【讨论】:

      【解决方案2】:

      好的,所以我发现了错误(这是我正在观看和输出文件的文件夹中的混淆)。最后,我将 watch 部分更改为更小的有意义的任务链集合,如下所示:

      watch: {
        js_prod: {
          files: ['<%= dirs.dev_js_authored %>/*.js','<%= dirs.dev_js_libs %>/*.js'],
          tasks: ['concat:js','uglify:js','ftp-deploy:js_prod','clean:temp_js']
        },
        js_standalone: {
          files: ['<%= dirs.dev_js_standalone %>/*.js'],
          tasks: ['ftp-deploy:js_standalone']
        },
        css_prod: {
          files: ['<%= dirs.dev_scss %>/**/*.scss'],
          tasks: ['sass:compile','autoprefixer:prefix','ftp-deploy:css_prod']
        },
        css_ie: {
          files: ['<%= dirs.dev_css_ie %>/*.css','!<%= dirs.dev_css_ie %>/*.min.css'],
          tasks: ['cssmin:ie','ftp-deploy:css_ie','clean:temp_css_ie']
        },
        livereload: {
          options: { livereload: true },
          files: [
            '<%= dirs.dev_css %>/**/*.css',
            '<%= dirs.dev_js_build %>/production.min.js',
            '<%= dirs.dev_js_standalone %>/*.js']
        }
      }
      

      这很好用,而且我不会再有观看任务不接受更改的问题,因为我不会在他们正在观看的任何区域同时工作。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-06-04
        • 1970-01-01
        • 2018-01-09
        • 1970-01-01
        • 2013-09-20
        • 1970-01-01
        • 2013-05-25
        • 1970-01-01
        相关资源
        最近更新 更多