【问题标题】:Running `grunt serve` ignores sass import运行 `grunt serve` 会忽略 sass 导入
【发布时间】:2014-07-09 06:11:44
【问题描述】:

背景资料:

我目前正在探索使用Yeoman 来生成一个使用generator-jekyllrb 的Jekyll 站点。我正在使用Grunt 来帮助将所有内容整合在一起。 generator-jekyllrb 的文档包含有关我的基本设置的更多信息。

问题

目前,我正在尝试使用已使用 Bower 安装的 Bootstrap。我的main.scss 文件如下所示:

@import 'bootstrap-sass-official/assets/stylesheets/bootstrap';
@import 'custom/reset';

当我运行grunt build 时,一切正常——Grunt 编译引导文件和我自己的自定义重置/sass 文件。

但是,当我运行 grunt serve 时,Grunt 最初似乎完全忽略了引导文件。它成功编译了我的自定义样式,但完全忽略了引导程序。

我的尝试

我确实设法找到了解决方法:如果我对main.scss 进行任何更改(即使是添加空格这样的小事),Grunt 将正确编译引导程序和我的样式。但是,这很烦人,我宁愿从一开始就让一切正常工作。

我已尝试删除 .jekyll.sass-cache.tmpdist 文件夹,以防某些缓存处于损坏状态,但这样做没有效果。

此时,我怀疑问题出在我的Gruntfile.js 文件上。 Grunt 在服务和构建时执行的任务完全不同,所以我想知道这个问题是否是由我为一项任务而不是另一项任务引起的。

不幸的是,我以前从未使用过 Yeoman 或 Grunt,所以我似乎无法准确确定问题所在或如何解决它。

我的代码

这是我的 gruntfile:

// Generated on 2014-07-08 using generator-jekyllrb 1.2.1
'use strict';

// Directory reference:
//   css: _assets/css
//   compass: _assets/scss
//   javascript: _assets/javascript
//   images: _assets/media
//   fonts: _assets/fonts

module.exports = function (grunt) {
  // Show elapsed time after tasks run
  require('time-grunt')(grunt);
  // Load all Grunt tasks
  require('load-grunt-tasks')(grunt);

  grunt.initConfig({
    // Configurable paths
    yeoman: {
      app: 'app',
      dist: 'dist'
    },
    watch: {
      compass: {
        files: [
            '<%= yeoman.app %>/_assets/scss/**/*.{scss,sass}',
            '<%= yeoman.app %>/_bower_components/bootstrap-sass-official/assets/stylesheets/*.{scss,sass}'],
        tasks: ['compass:server', 'autoprefixer:server']
      },
      autoprefixer: {
        files: ['<%= yeoman.app %>/_assets/css/**/*.css'],
        tasks: ['copy:stageCss', 'autoprefixer:server']
      },
      jekyll: {
        files: [
          '<%= yeoman.app %>/**/*.{html,yml,md,mkd,markdown}',
          '!<%= yeoman.app %>/_bower_components/**/*'
        ],
        tasks: ['jekyll:server']
      },
      livereload: {
        options: {
          livereload: '<%= connect.options.livereload %>'
        },
        files: [
          '.jekyll/**/*.html',
          '.tmp/_assets/css/**/*.css',
          '{.tmp,<%= yeoman.app %>}/<%= js %>/**/*.js',
          '<%= yeoman.app %>/_assets/media/**/*.{gif,jpg,jpeg,png,svg,webp}'
        ]
      }
    },
    connect: {
      options: {
        port: 9000,
        livereload: 35729,
        // change this to '0.0.0.0' to access the server from outside
        hostname: 'localhost'
      },
      livereload: {
        options: {
          open: true,
          base: [
            '.tmp',
            '.jekyll',
            '<%= yeoman.app %>'
          ]
        }
      },
      dist: {
        options: {
          open: true,
          base: [
            '<%= yeoman.dist %>'
          ]
        }
      },
      test: {
        options: {
          base: [
            '.tmp',
            '.jekyll',
            'test',
            '<%= yeoman.app %>'
          ]
        }
      }
    },
    clean: {
      dist: {
        files: [{
          dot: true,
          src: [
            '<%= yeoman.dist %>/*',
            // Running Jekyll also cleans the target directory.  Exclude any
            // non-standard `keep_files` here (e.g., the generated files
            // directory from Jekyll Picture Tag).
            '!<%= yeoman.dist %>/.git*'
          ]
        }]
      },
      server: [
        '.tmp',
        '.jekyll'
      ]
    },
    compass: {
      options: {
        // If you're using global Sass gems, require them here.
        // require: ['singularity', 'jacket'],
        bundleExec: true,
        sassDir: '<%= yeoman.app %>/_assets/scss',
        cssDir: '.tmp/_assets/css',
        imagesDir: '<%= yeoman.app %>/_assets/media',
        javascriptsDir: '<%= yeoman.app %>/_assets/javascript',
        importPath: '<%= yeoman.app %>/_bower_components',
        relativeAssets: false,
        httpImagesPath: '/_assets/media',
        httpGeneratedImagesPath: '/_assets/media/generated',
        outputStyle: 'expanded',
        raw: 'extensions_dir = "<%= yeoman.app %>/_bower_components"\n'
      },
      dist: {
        options: {
          generatedImagesDir: '<%= yeoman.dist %>/_assets/media/generated'
        }
      },
      server: {
        options: {
          debugInfo: true,
          generatedImagesDir: '.tmp/_assets/media/generated'
        }
      }
    },
    autoprefixer: {
      options: {
        browsers: ['last 2 versions']
      },
      dist: {
        files: [{
          expand: true,
          cwd: '<%= yeoman.dist %>/_assets/css',
          src: '**/*.css',
          dest: '<%= yeoman.dist %>/_assets/css'
        }]
      },
      server: {
        files: [{
          expand: true,
          cwd: '.tmp/_assets/css',
          src: '**/*.css',
          dest: '.tmp/_assets/css'
        }]
      }
    },
    jekyll: {
      options: {
        bundleExec: true,
        config: '_config.yml,_config.build.yml',
        src: '<%= yeoman.app %>'
      },
      dist: {
        options: {
          dest: '<%= yeoman.dist %>',
        }
      },
      server: {
        options: {
          config: '_config.yml',
          dest: '.jekyll'
        }
      },
      check: {
        options: {
          doctor: true
        }
      }
    },
    useminPrepare: {
      options: {
        dest: '<%= yeoman.dist %>'
      },
      html: '<%= yeoman.dist %>/index.html'
    },
    usemin: {
      options: {
        assetsDirs: '<%= yeoman.dist %>',
      },
      html: ['<%= yeoman.dist %>/**/*.html'],
      css: ['<%= yeoman.dist %>/_assets/css/**/*.css']
    },
    htmlmin: {
      dist: {
        options: {
          collapseWhitespace: true,
          collapseBooleanAttributes: true,
          removeAttributeQuotes: true,
          removeRedundantAttributes: true
        },
        files: [{
          expand: true,
          cwd: '<%= yeoman.dist %>',
          src: '**/*.html',
          dest: '<%= yeoman.dist %>'
        }]
      }
    },
    // Usemin adds files to concat
    concat: {},
    // Usemin adds files to uglify
    uglify: {},
    // Usemin adds files to cssmin
    cssmin: {
      dist: {
        options: {
          check: 'gzip'
        }
      }
    },
    imagemin: {
      dist: {
        options: {
          progressive: true
        },
        files: [{
          expand: true,
          cwd: '<%= yeoman.dist %>',
          src: '**/*.{jpg,jpeg,png}',
          dest: '<%= yeoman.dist %>'
        }]
      }
    },
    svgmin: {
      dist: {
        files: [{
          expand: true,
          cwd: '<%= yeoman.dist %>',
          src: '**/*.svg',
          dest: '<%= yeoman.dist %>'
        }]
      }
    },
    copy: {
      dist: {
        files: [
          {
            expand: true,
            dot: true,
            cwd: '<%= yeoman.app %>',
            src: [
              // Jekyll processes and moves HTML and text files.
              // Usemin moves CSS and javascript inside of Usemin blocks.
              // Copy moves asset files and directories.
              '_assets/media/**/*',
              '_assets/fonts/**/*',
              // Like Jekyll, exclude files & folders prefixed with an underscore.
              '!**/_*{,/**}',
              // Explicitly add any files your site needs for distribution here.
              //'_bower_components/jquery/jquery.js',
              //'favicon.ico',
              //'apple-touch*.png'
            ],
            dest: '<%= yeoman.dist %>'
          },
          {
            expand: true,
            flatten: true,
            dot: true,
            cwd: '<%= yeoman.app %>',
            src: [
              '_bower_components/bootstrap-sass-official/assets/fonts/**/*'
            ],
            dest: '<%= yeoman.dist %>/_assets/css/bootstrap'
          }
        ]
      },
      // Copy CSS into .tmp directory for Autoprefixer processing
      stageCss: {
        files: [
          {
            expand: true,
            dot: true,
            cwd: '<%= yeoman.app %>/_assets/css',
            src: '**/*.css',
            dest: '.tmp/_assets/css'
          },
          {
            expand: true,
            flatten: true,
            dot: true,
            cwd: '<%= yeoman.app %>',
            src: [
              '_bower_components/bootstrap-sass-official/assets/fonts/**/*'
            ],
            dest: '.tmp/_assets/css/bootstrap'
          }
        ]
      }
    },
    filerev: {
      options: {
        length: 4
      },
      dist: {
        files: [{
          src: [
            '<%= yeoman.dist %>/_assets/javascript/**/*.js',
            '<%= yeoman.dist %>/_assets/css/**/*.css',
            '<%= yeoman.dist %>/_assets/media/**/*.{gif,jpg,jpeg,png,svg,webp}',
            '<%= yeoman.dist %>/_assets/fonts/**/*.{eot*,otf,svg,ttf,woff}'
          ]
        }]
      }
    },
    buildcontrol: {
      dist: {
        options: {
          remote: '../',
          branch: 'gh-pages',
          commit: true,
          push: true
        }
      }
    },
    jshint: {
      options: {
        jshintrc: '.jshintrc',
        reporter: require('jshint-stylish')
      },
      all: [
        'Gruntfile.js',
        '<%= yeoman.app %>/_assets/javascript/**/*.js',
        'test/spec/**/*.js'
      ]
    },
    csslint: {
      options: {
        csslintrc: '.csslintrc'
      },
      check: {
        src: [
          '<%= yeoman.app %>/_assets/css/**/*.css',
          '<%= yeoman.app %>/_assets/scss/**/*.scss'
        ]
      }
    },
    concurrent: {
      server: [
        'compass:server',
        'copy:stageCss',
        'jekyll:server'
      ],
      dist: [
        'compass:dist',
        'copy:dist'
      ]
    }
  });

  // Define Tasks
  grunt.registerTask('serve', function (target) {
    if (target === 'dist') {
      return grunt.task.run(['build', 'connect:dist:keepalive']);
    }

    grunt.task.run([
      'clean:server',
      'concurrent:server',
      'autoprefixer:server',
      'connect:livereload',
      'watch'
    ]);
  });

  grunt.registerTask('server', function () {
    grunt.log.warn('The `server` task has been deprecated. Use `grunt serve` to start a server.');
    grunt.task.run(['serve']);
  });

  // No real tests yet. Add your own.
  grunt.registerTask('test', [
  //   'clean:server',
  //   'concurrent:test',
  //   'connect:test'
  ]);

  grunt.registerTask('check', [
    'clean:server',
    'jekyll:check',
    'compass:server',
    'jshint:all',
    'csslint:check'
  ]);

  grunt.registerTask('build', [
    'clean',
    // Jekyll cleans files from the target directory, so must run first
    'jekyll:dist',
    'concurrent:dist',
    'useminPrepare',
    'concat',
    'autoprefixer:dist',
    'cssmin',
    'uglify',
    'imagemin',
    'svgmin',
    'filerev',
    'usemin',
    'htmlmin'
    ]);

  grunt.registerTask('deploy', [
    'check',
    'test',
    'build',
    'buildcontrol'
    ]);

  grunt.registerTask('default', [
    'check',
    'test',
    'build'
  ]);
};

如果你想玩整个代码库,你可以克隆github repo

git clone https://github.com/Michael0x2a/uwfig.git
cd uwfig
bundle install
bower install
npm install

然后您可以通过运行重现该行为:

grunt serve

Grunt 应该在 localhost:9000 上提供默认的 Jekyll 页面。我在页面中添加了两个按钮,都使用 Bootstrap 中的样式。如果 Bootstrap 工作,左边的按钮会变成蓝色,而右边的按钮里面会有一个星形图标。目前,没有应用引导样式并且按钮是普通的。

我目前使用的是 Windows 8.1、Ruby 版本 1.9.3p545、Node.js 版本 0.10.26、grunt 版本 0.4.5 和 grunt-cli 版本 0.1.13。

【问题讨论】:

    标签: twitter-bootstrap gruntjs jekyll yeoman compass-sass


    【解决方案1】:

    在你的 Jekyll config.yml 文件中,你设置了吗:

    sass:
        sass_dir: root-path-of-your-imported-files-folder
    

    如果你有这个结构

    -root/
      -css/
        -main.scss
        -bootstrap-sass-official/
            -base.scss
            -...
        -custom/
            -reset.scss
            -...
    

    你的 sass_dircss/

    【讨论】:

      【解决方案2】:

      好吧,我已经设法解决了我的问题,虽然我不完全确定如何解决。

      以下是我所做的主要更改:

      1. 修改了我的项目和 Gruntfile 以使用wiredep,我基本上是从 generator-angular 创建的那个中复制的
      2. 修改了我的main.css 文件,如下所示:

        $icon-font-path: "/_bower_components/bootstrap-sass-official/assets/fonts/bootstrap/";
        
        // bower:scss
        @import "../../_bower_components/bootstrap-sass-official/assets/stylesheets/bootstrap.scss";
        // endbower 
        
        @import 'custom/reset';
        
      3. 在提供文件时调用copy:dist 任务而不是copy:stageCss

      我不完全确定到底是什么修复了它——我可以肯定的是,#3 绝对是一个因素,但也绝对不是唯一因素。在我应用更改 #3 之前没有任何效果,但是在新的 repo 上单独应用 #3 不会导致任何更改。

      您可以在此处查看完整的差异:

      https://github.com/Michael0x2a/uwfig/commit/8d037a619ff09e9d3f5eae4de85e06ea2e69b24c

      这是我最终的 Gruntfile,供参考:

      // Generated on 2014-07-08 using generator-jekyllrb 1.2.1
      'use strict';
      
      // Directory reference:
      //   css: _assets/css
      //   compass: _assets/scss
      //   javascript: _assets/javascript
      //   images: _assets/media
      //   fonts: _assets/fonts
      
      module.exports = function (grunt) {
        // Show elapsed time after tasks run
        require('time-grunt')(grunt);
        // Load all Grunt tasks
        require('load-grunt-tasks')(grunt);
      
        grunt.initConfig({
          // Configurable paths
          yeoman: {
            app: 'app',
            dist: 'dist'
          },
          watch: {
            bower: {
              files: ['bower.json'],
              tasks: ['wiredep']
            },
            compass: {
              files: [
                  '<%= yeoman.app %>/_assets/scss/**/*.{scss,sass}',
                  '<%= yeoman.app %>/_bower_components/bootstrap-sass-official/assets/stylesheets/*.{scss,sass}'],
              tasks: ['compass:server', 'autoprefixer:server']
            },
            autoprefixer: {
              files: ['<%= yeoman.app %>/_assets/css/**/*.css'],
              tasks: ['copy:stageCss', 'autoprefixer:server']
            },
            jekyll: {
              files: [
                '<%= yeoman.app %>/**/*.{html,yml,md,mkd,markdown}',
                '!<%= yeoman.app %>/_bower_components/**/*'
              ],
              tasks: ['jekyll:server']
            },
            livereload: {
              options: {
                livereload: '<%= connect.options.livereload %>'
              },
              files: [
                '.jekyll/**/*.html',
                '.tmp/_assets/css/**/*.css',
                '{.tmp,<%= yeoman.app %>}/<%= js %>/**/*.js',
                '<%= yeoman.app %>/_assets/media/**/*.{gif,jpg,jpeg,png,svg,webp}'
              ]
            }
          },
          connect: {
            options: {
              port: 9000,
              livereload: 35729,
              // change this to '0.0.0.0' to access the server from outside
              hostname: 'localhost'
            },
            livereload: {
              options: {
                open: true,
                base: [
                  '.tmp',
                  '.jekyll',
                  '<%= yeoman.app %>'
                ]
              }
            },
            dist: {
              options: {
                open: true,
                base: [
                  '<%= yeoman.dist %>'
                ]
              }
            },
            test: {
              options: {
                base: [
                  '.tmp',
                  '.jekyll',
                  'test',
                  '<%= yeoman.app %>'
                ]
              }
            }
          },
          clean: {
            dist: {
              files: [{
                dot: true,
                src: [
                  '<%= yeoman.dist %>/*',
                  // Running Jekyll also cleans the target directory.  Exclude any
                  // non-standard `keep_files` here (e.g., the generated files
                  // directory from Jekyll Picture Tag).
                  '!<%= yeoman.dist %>/.git*'
                ]
              }]
            },
            server: [
              '.tmp',
              '.jekyll'
            ]
          },
          compass: {
            options: {
              // If you're using global Sass gems, require them here.
              // require: ['singularity', 'jacket'],
              bundleExec: true,
              sassDir: '<%= yeoman.app %>/_assets/scss',
              cssDir: '.tmp/_assets/css',
              imagesDir: '<%= yeoman.app %>/_assets/media',
              javascriptsDir: '<%= yeoman.app %>/_assets/javascript',
              importPath: '<%= yeoman.app %>/_bower_components/',
              relativeAssets: false,
              httpImagesPath: '/_assets/media',
              httpGeneratedImagesPath: '/_assets/media/generated',
              outputStyle: 'expanded',
              raw: 'extensions_dir = "<%= yeoman.app %>/_bower_components"\n'
            },
            dist: {
              options: {
                generatedImagesDir: '<%= yeoman.dist %>/_assets/media/generated'
              }
            },
            server: {
              options: {
                debugInfo: true,
                generatedImagesDir: '.tmp/_assets/media/generated'
              }
            }
          },
          autoprefixer: {
            options: {
              browsers: ['last 2 versions']
            },
            dist: {
              files: [{
                expand: true,
                cwd: '<%= yeoman.dist %>/_assets/css',
                src: '**/*.css',
                dest: '<%= yeoman.dist %>/_assets/css'
              }]
            },
            server: {
              files: [{
                expand: true,
                cwd: '.tmp/_assets/css',
                src: '**/*.css',
                dest: '.tmp/_assets/css'
              }]
            }
          },
          wiredep: {
            options: {
              cwd: '<%= yeoman.app %>'
            },
            app: {
              src: ['<% yeoman.app%>/_layouts/*.html'],
              ignorePath:  /\.\.\//
            },
            sass: {
              src: ['<%= yeoman.app%>/_assets/scss/{,*/}*.{scss,sass}'],
              ignorePath: /(\.\.\/){1,2}bower_components\//
            }
          },
          jekyll: {
            options: {
              bundleExec: true,
              config: '_config.yml,_config.build.yml',
              src: '<%= yeoman.app %>'
            },
            dist: {
              options: {
                dest: '<%= yeoman.dist %>',
              }
            },
            server: {
              options: {
                config: '_config.yml',
                dest: '.jekyll'
              }
            },
            check: {
              options: {
                doctor: true
              }
            }
          },
          useminPrepare: {
            options: {
              dest: '<%= yeoman.dist %>'
            },
            html: '<%= yeoman.dist %>/index.html'
          },
          usemin: {
            options: {
              assetsDirs: '<%= yeoman.dist %>',
            },
            html: ['<%= yeoman.dist %>/**/*.html'],
            css: ['<%= yeoman.dist %>/_assets/css/**/*.css']
          },
          htmlmin: {
            dist: {
              options: {
                collapseWhitespace: true,
                collapseBooleanAttributes: true,
                removeAttributeQuotes: true,
                removeRedundantAttributes: true
              },
              files: [{
                expand: true,
                cwd: '<%= yeoman.dist %>',
                src: '**/*.html',
                dest: '<%= yeoman.dist %>'
              }]
            }
          },
          // Usemin adds files to concat
          concat: {},
          // Usemin adds files to uglify
          uglify: {},
          // Usemin adds files to cssmin
          cssmin: {
            dist: {
              options: {
                check: 'gzip'
              }
            }
          },
          imagemin: {
            dist: {
              options: {
                progressive: true
              },
              files: [{
                expand: true,
                cwd: '<%= yeoman.dist %>',
                src: '**/*.{jpg,jpeg,png}',
                dest: '<%= yeoman.dist %>'
              }]
            }
          },
          svgmin: {
            dist: {
              files: [{
                expand: true,
                cwd: '<%= yeoman.dist %>',
                src: '**/*.svg',
                dest: '<%= yeoman.dist %>'
              }]
            }
          },
          copy: {
            dist: {
              files: [
                {
                  expand: true,
                  dot: true,
                  cwd: '<%= yeoman.app %>',
                  src: [
                    // Jekyll processes and moves HTML and text files.
                    // Usemin moves CSS and javascript inside of Usemin blocks.
                    // Copy moves asset files and directories.
                    '_assets/media/**/*',
                    '_assets/fonts/**/*',
                    // Like Jekyll, exclude files & folders prefixed with an underscore.
                    '!**/_*{,/**}',
                    // Explicitly add any files your site needs for distribution here.
                    //'_bower_components/jquery/jquery.js',
                    //'favicon.ico',
                    //'apple-touch*.png'
                  ],
                  dest: '<%= yeoman.dist %>'
                },
                {
                  expand: true,
                  flatten: true,
                  dot: true,
                  cwd: '<%= yeoman.app %>',
                  src: [
                    '_bower_components/bootstrap-sass-official/assets/fonts/**/*'
                  ],
                  dest: '<%= yeoman.dist %>/_assets/css/bootstrap'
                }
              ]
            },
            server: {
              files: [
                {
                  expand: true,
                  dot: true,
                  cwd: '<%= yeoman.app %>',
                  src: [
                    // Jekyll processes and moves HTML and text files.
                    // Usemin moves CSS and javascript inside of Usemin blocks.
                    // Copy moves asset files and directories.
                    '_assets/media/**/*',
                    '_assets/fonts/**/*',
                    // Like Jekyll, exclude files & folders prefixed with an underscore.
                    '!**/_*{,/**}',
                    // Explicitly add any files your site needs for distribution here.
                    //'_bower_components/jquery/jquery.js',
                    //'favicon.ico',
                    //'apple-touch*.png'
                  ],
                  dest: '.tmp'
                },
                {
                  expand: true,
                  flatten: true,
                  dot: true,
                  cwd: '<%= yeoman.app %>',
                  src: [
                    '_bower_components/bootstrap-sass-official/assets/fonts/**/*'
                  ],
                  dest: '.tmp/_assets/css/bootstrap'
                }
              ]
            },
            // Copy CSS into .tmp directory for Autoprefixer processing
            stageCss: {
              files: [
                {
                  expand: true,
                  dot: true,
                  cwd: '<%= yeoman.app %>/_assets/css',
                  src: '**/*.css',
                  dest: '.tmp/_assets/css'
                }
              ]
            }
          },
          filerev: {
            options: {
              length: 4
            },
            dist: {
              files: [{
                src: [
                  '<%= yeoman.dist %>/_assets/javascript/**/*.js',
                  '<%= yeoman.dist %>/_assets/css/**/*.css',
                  '<%= yeoman.dist %>/_assets/media/**/*.{gif,jpg,jpeg,png,svg,webp}',
                  '<%= yeoman.dist %>/_assets/fonts/**/*.{eot*,otf,svg,ttf,woff}'
                ]
              }]
            }
          },
          buildcontrol: {
            dist: {
              options: {
                remote: '../',
                branch: 'gh-pages',
                commit: true,
                push: true
              }
            }
          },
          jshint: {
            options: {
              jshintrc: '.jshintrc',
              reporter: require('jshint-stylish')
            },
            all: [
              'Gruntfile.js',
              '<%= yeoman.app %>/_assets/javascript/**/*.js',
              'test/spec/**/*.js'
            ]
          },
          csslint: {
            options: {
              csslintrc: '.csslintrc'
            },
            check: {
              src: [
                '<%= yeoman.app %>/_assets/css/**/*.css',
                '<%= yeoman.app %>/_assets/scss/**/*.scss'
              ]
            }
          },
          concurrent: {
            server: [
              'compass:server',
              'copy:server',
              'jekyll:server'
            ],
            dist: [
              'compass:dist',
              'copy:dist'
            ]
          }
        });
      
        // Define Tasks
        grunt.registerTask('serve', function (target) {
          if (target === 'dist') {
            return grunt.task.run(['build', 'connect:dist:keepalive']);
          }
      
          grunt.task.run([
            'clean:server',
            'wiredep',
            'concurrent:server',
            'autoprefixer:server',
            'connect:livereload',
            'watch'
          ]);
        });
      
        grunt.registerTask('server', function () {
          grunt.log.warn('The `server` task has been deprecated. Use `grunt serve` to start a server.');
          grunt.task.run(['serve']);
        });
      
        // No real tests yet. Add your own.
        grunt.registerTask('test', [
        //   'clean:server',
        //   'concurrent:test',
        //   'connect:test'
        ]);
      
        grunt.registerTask('check', [
          'clean:server',
          'jekyll:check',
          'compass:server',
          'jshint:all',
          'csslint:check'
        ]);
      
        grunt.registerTask('build', [
          'clean',
          // Jekyll cleans files from the target directory, so must run first
          'jekyll:dist',
          'wiredep',
          'concurrent:dist',
          'useminPrepare',
          'concat',
          'autoprefixer:dist',
          'cssmin',
          'uglify',
          'imagemin',
          'svgmin',
          'filerev',
          'usemin',
          'htmlmin'
          ]);
      
        grunt.registerTask('deploy', [
          'check',
          'test',
          'build',
          'buildcontrol'
          ]);
      
        grunt.registerTask('default', [
          'check',
          'test',
          'build'
        ]);
      };
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-04-12
        • 2017-04-25
        • 2015-01-13
        • 2020-02-27
        • 2014-04-09
        • 2019-04-18
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多