添加Jade后无法再进行构建

时间:2015-03-10 17:03:00

标签: gruntjs pug

我有一个Angular项目,我用Yeoman来构建。它最初是纯JavaScript和HTML。不久之前,我将JavaScript切换为CoffeeScript,然后将HTML切换为Jade。

我的应用程序运行正常,因为我的模板是Jade,但我无法再成功运行grunt build。当我尝试时,我明白了:

>> No "concat" targets found.

我没有看到concat任务的任何定义,所以我认为这是有道理的,但我之前从未有过concat定义并且它运行良好。

Here is my Gruntfile.coffee供参考。

此外,这是old, working Gruntfile.coffee

非常感谢任何建议。

修改:FWIW,当我将app/index.html更改为app/index.jade时,我的问题似乎已经开始了。

1 个答案:

答案 0 :(得分:0)

因此,如果我只有RTFM,问题/解决方案就在我的鼻子底下。

有一段时间我跟着tutorial for using Yeoman and Jade together。我跟着它大部分到了这封信,但我错过了这个至关重要的花絮:

  

上面的示例告诉Jade在.jade文件夹中查找<%= yeoman.app %>个文件,并将它们编译到.tmp文件夹中。由于watch:livereloaduseminPreparehtmlmin正在<%= yeoman.app %>中查找您的HTML文件,我们必须更改它们。为此,只需将指向<% yeoman.app %>/*.html的引用替换为.tmp/*.html

我更改了一些引用,摇晃了一些旋钮,现在grunt build正常工作。这是我Gruntfile.coffee的工作版本:

# Generated on 2014-11-05 using generator-angular 0.9.8
'use strict'
# # Globbing
# for performance reasons we're only matching one level down:
# 'test/spec/{,*/}*.js'
# use this if you want to recursively match all subfolders:
# 'test/spec/**/*.js'

module.exports = (grunt) ->
  # Load grunt tasks automatically
  require('load-grunt-tasks') grunt
  # Time how long tasks take. Can help when optimizing build times
  require('time-grunt') grunt
  # Configurable paths for the application
  appConfig =
    app: require('./bower.json').appPath or 'app'
    dist: '../public'
  modRewrite = require('connect-modrewrite')

  # Define the configuration for all the tasks
  grunt.initConfig
    yeoman: appConfig
    watch:
      bower:
        files: [ 'bower.json' ]
        tasks: [ 'wiredep' ]
      js:
        files: [ '<%= yeoman.app %>/scripts/{,*/}*.js' ]
        tasks: [ 'newer:jshint:all' ]
        options: livereload: '<%= connect.options.livereload %>'
      jade:
        files: ['<%= yeoman.app %>/**/*.jade'],
        tasks: ['jade']
      coffee:
        files: [ '<%= yeoman.app %>/scripts/{,*/}*.{coffee,litcoffee,coffee.md}' ]
        tasks: [ 'newer:coffee:dist']
      jsTest:
        files: [ 'test/spec/{,*/}*.js' ]
        tasks: [
          'newer:jshint:test'
          'karma'
        ]
      compass:
        files: [ '<%= yeoman.app %>/styles/{,*/}*.{scss,sass}' ]
        tasks: [
          'compass:server'
          'autoprefixer'
        ]
      gruntfile: files: [ 'Gruntfile.js' ]
      livereload:
        options: livereload: '<%= connect.options.livereload %>'
        files: [
          '.tmp/{,*/}*.html'
          '.tmp/styles/{,*/}*.css'
          '<%= yeoman.app %>/images/{,*/}*.{png,jpg,jpeg,gif,webp,svg}'
        ]
    connect:
      options:
        port: 9000
        hostname: 'localhost'
        livereload: 35729
      proxies: [ {
        context: '/api'
        host: 'localhost'
        port: 3000
      } ]
      livereload: options:
        open: true
        middleware: (connect, options) ->
          if !Array.isArray(options.base)
            options.base = [ options.base ]
          middlewares = [
            modRewrite([ '!/api|/assets|\\..+$ /index.html' ])
            require('grunt-connect-proxy/lib/utils').proxyRequest
            connect.static('.tmp')
            connect().use('/bower_components', connect.static('./bower_components'))
            connect.static(appConfig.app)
          ]
          # Make directory browse-able.
          directory = options.directory or options.base[options.base.length - 1]
          middlewares.push connect.directory(directory)
          middlewares
      test: options:
        port: 9001
        middleware: (connect) ->
          [
            connect.static('.tmp')
            connect.static('test')
            connect().use('/bower_components', connect.static('./bower_components'))
            connect.static(appConfig.app)
          ]
      dist: options:
        open: true
        base: '<%= yeoman.dist %>'
    jshint:
      options:
        jshintrc: '.jshintrc'
        reporter: require('jshint-stylish')
      all: src: [
        'Gruntfile.js'
        '<%= yeoman.app %>/scripts/{,*/}*.js'
      ]
      test:
        options: jshintrc: 'test/.jshintrc'
        src: [ 'test/spec/{,*/}*.js' ]
    clean:
      dist: files: [ {
        dot: true
        src: [
          '.tmp'
          '<%= yeoman.dist %>/{,*/}*'
          '!<%= yeoman.dist %>/.git*'
        ]
      } ]
      server: '.tmp'
    autoprefixer:
      options: browsers: [ 'last 1 version' ]
      dist: files: [ {
        expand: true
        cwd: '.tmp/styles/'
        src: '{,*/}*.css'
        dest: '.tmp/styles/'
      } ]
    wiredep:
      app:
        src: [ '<%= yeoman.app %>/index.jade' ]
        ignorePath: /\.\.\//
      sass:
        src: [ '<%= yeoman.app %>/styles/{,*/}*.{scss,sass}' ]
        ignorePath: /(\.\.\/){1,2}bower_components\//
    jade:
      dist:
        options:
          pretty: true
          data:
            debug: true
        files: [
          expand: true
          cwd: '<%= yeoman.app %>'
          dest: '.tmp'
          src: '**/*.jade'
          ext: '.html'
        ]
    coffee:
      options:
        sourceMap: true
        bare: true
        sourceRoot: ''
      dist:
        files: [
          expand: true
          cwd: '<%= yeoman.app %>/scripts'
          src: '{,*/}*.coffee'
          dest: '.tmp/scripts'
          ext: '.js'
        ]
      test:
        files: [
          expand: true
          cwd: 'test/spec'
          src: '{,*/}*.coffee'
          dest: '.tmp/spec'
          ext: '.js'
        ]
    compass:
      options:
        sassDir: '<%= yeoman.app %>/styles'
        cssDir: '.tmp/styles'
        generatedImagesDir: '.tmp/images/generated'
        imagesDir: '<%= yeoman.app %>/images'
        javascriptsDir: '<%= yeoman.app %>/scripts'
        fontsDir: '<%= yeoman.app %>/styles/fonts'
        importPath: './bower_components'
        httpImagesPath: '/images'
        httpGeneratedImagesPath: '/images/generated'
        httpFontsPath: '/styles/fonts'
        relativeAssets: false
        assetCacheBuster: false
        raw: 'Sass::Script::Number.precision = 10\n'
      dist: options: generatedImagesDir: '<%= yeoman.dist %>/images/generated'
      server: options: debugInfo: true
    filerev: dist: src: [
      '<%= yeoman.dist %>/scripts/{,*/}*.js'
      '<%= yeoman.dist %>/styles/{,*/}*.css'
      '<%= yeoman.dist %>/images/{,*/}*.{png,jpg,jpeg,gif,webp,svg}'
      '<%= yeoman.dist %>/styles/fonts/*'
    ]
    useminPrepare:
      html: '.tmp/index.html'
      options:
        dest: '<%= yeoman.dist %>'
        flow: html:
          steps:
            js: [
              'concat'
              'uglifyjs'
            ]
            css: [ 'cssmin' ]
          post: {}
    usemin:
      html: [ '.tmp/**/*.html' ]
      css: [ '<%= yeoman.dist %>/styles/{,*/}*.css' ]
      options: assetsDirs: [
        '<%= yeoman.dist %>'
        '<%= yeoman.dist %>/images'
      ]
    imagemin: dist: files: [ {
      expand: true
      cwd: '<%= yeoman.app %>/images'
      src: '{,*/}*.{png,jpg,jpeg,gif}'
      dest: '<%= yeoman.dist %>/images'
    } ]
    svgmin: dist: files: [ {
      expand: true
      cwd: '<%= yeoman.app %>/images'
      src: '{,*/}*.svg'
      dest: '<%= yeoman.dist %>/images'
    } ]
    htmlmin: dist:
      options:
        collapseWhitespace: true
        conservativeCollapse: true
        collapseBooleanAttributes: true
        removeCommentsFromCDATA: true
        removeOptionalTags: true
      files: [ {
        expand: true
        cwd: '.tmp'
        src: [
          '*.html'
          '**/*.html'
        ]
        dest: '<%= yeoman.dist %>'
      } ]
    ngAnnotate: dist: files: [ {
      expand: true
      cwd: '.tmp/concat/scripts'
      src: [
        '*.js'
        '!oldieshim.js'
      ]
      dest: '.tmp/concat/scripts'
    } ]
    cdnify: dist: html: [ '<%= yeoman.dist %>/*.html' ]
    copy:
      dist: files: [
        {
          expand: true
          dot: true
          cwd: '<%= yeoman.app %>'
          dest: '<%= yeoman.dist %>'
          src: [
            '*.{ico,png,txt}'
            '.htaccess'
            '*.html'
            '**/*.html'
            'images/{,*/}*.{webp}'
            'fonts/*'
          ]
        }
        {
          expand: true
          cwd: '.tmp/images'
          dest: '<%= yeoman.dist %>/images'
          src: [ 'generated/*' ]
        }
        {
          expand: true
          cwd: '.'
          src: 'bower_components/bootstrap-sass-official/assets/fonts/bootstrap/*'
          dest: '<%= yeoman.dist %>'
        }
      ]
      styles:
        expand: true
        cwd: '<%= yeoman.app %>/styles'
        dest: '.tmp/styles/'
        src: '{,*/}*.css'
    concurrent:
      server: [
        'jade:dist'
        'coffee:dist'
        'compass:server'
      ]
      test: [ 'compass' ]
      dist: [
        'jade'
        'coffee'
        'compass:dist'
        'imagemin'
        'svgmin'
      ]
    karma: unit:
      configFile: 'test/karma.conf.js'
      singleRun: true
  grunt.registerTask 'serve', 'Compile then start a connect web server', (target) ->
    if target == 'dist'
      return grunt.task.run([
        'build'
        'connect:dist:keepalive'
      ])
    grunt.task.run [
      'clean:server'
      'wiredep'
      'railsServer:development'
      'concurrent:server'
      'autoprefixer'
      'configureProxies'
      'connect:livereload'
      'watch'
    ]
    return
  grunt.registerTask 'server', 'DEPRECATED TASK. Use the "serve" task instead', (target) ->
    grunt.log.warn 'The `server` task has been deprecated. Use `grunt serve` to start a server.'
    grunt.task.run [ 'serve:' + target ]
    return
  grunt.registerTask 'test', [
    'clean:server'
    'concurrent:test'
    'autoprefixer'
    'connect:test'
    'karma'
  ]
  grunt.registerTask 'build', [
    'clean:dist'
    'jade'
    'coffee'
    'wiredep'
    'useminPrepare'
    'concurrent:dist'
    'autoprefixer'
    'concat'
    'ngAnnotate'
    'copy:dist'
    'cdnify'
    'cssmin'
    'uglify'
    'filerev'
    'usemin'
    'htmlmin'
  ]
  grunt.registerTask 'default', [
    'newer:jshint'
    'test'
    'build'
  ]

  grunt.registerTask 'heroku:production', 'build'

  grunt.loadNpmTasks 'grunt-contrib-jade'
  grunt.loadNpmTasks 'grunt-contrib-coffee'
  grunt.loadNpmTasks 'grunt-connect-proxy'
  grunt.loadNpmTasks 'grunt-rails-server'