title: grunt serve: concurrent:server aborts due to warnings
body: <p>suddenly my projects stops working with grunt. Unfortunately, I haven't committed my changes for a while into git, so I can't tell whats different.</p>
  
  <p>When I run <code>grunt server --verbose</code>, I get the following output (everything above <code>...</code> passes with an <code>OK</code>):</p>
  
  <pre><code>...
  Running "wiredep" task
  
  Running "wiredep:app" (wiredep) task
  Verifying property wiredep.app exists in config...OK
  Files: app/index.html
  Verifying property wiredep.app.src exists in config...OK
  
  Running "wiredep:sass" (wiredep) task
  Verifying property wiredep.sass exists in config...OK
  Files: app/styles/analyzer.scss, app/styles/colors.scss, app/styles/login.scss, app/styles/main.scss, app/styles/shared.scss, app/styles/styles.scss, app/styles/tagsinput.scss
  Verifying property wiredep.sass.src exists in config...OK
  
  Running "concurrent:server" (concurrent) task
  Verifying property concurrent.server exists in config...OK
  Files: [no src] -&gt; server
  Options: limit=2
      Warning:  Use --force to continue.
  
          Aborted due to warnings.
  
  
  Execution Time (2014-06-24 08:34:05 UTC)
  loading tasks        8ms  0%
  serve                2ms  0%
  clean:server        10ms  0%
  wiredep:app        242ms  ▇▇▇▇▇▇▇ 4%
  wiredep:sass        17ms  0%
  concurrent:server   5.3s  ▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇▇ 95%
  Total 5.6s
  </code></pre>
  
  <p>So, grunt aborts when trying to execute the task <code>concurrent:server</code>. Inside this task, the <code>compass:server</code> task is executed (see the <code>Gruntfile.js</code> below). So, it must have something todo with compass, but I'm not sure if this line <code>Files: [no src] -&gt; server</code> could give more hints to the problem.</p>
  
  <p>This is my <code>Gruntfile.js</code>:</p>
  
  <pre><code>// Generated on 2014-06-16 using generator-angular 0.9.0-1
  '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 = function (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
    var appConfig = {
      app: require('./bower.json').appPath || 'app',
      dist: 'dist'
    };
  
    // Define the configuration for all the tasks
    grunt.initConfig({
  
      // Project settings
      yeoman: appConfig,
  
      // Watches files for changes and runs tasks based on the changed files
      watch: {
        bower: {
          files: ['bower.json'],
          tasks: ['wiredep']
        },
        js: {
          files: ['&lt;%= yeoman.app %&gt;/scripts/{,*/}*.js'],
          tasks: [],
          options: {
            livereload: '&lt;%= connect.options.livereload %&gt;'
          }
        },
        jsTest: {
          files: ['test/spec/{,*/}*.js'],
          tasks: ['newer:jshint:test', 'newer:jshint:all', 'karma']
        },
        compass: {
          files: ['&lt;%= yeoman.app %&gt;/styles/{,*/}*.{scss,sass}'],
          tasks: ['compass:server', 'autoprefixer'],
          options: {
              spawn: false,
          }
        },
        gruntfile: {
          files: ['Gruntfile.js']
        },
        livereload: {
          options: {
            livereload: '&lt;%= connect.options.livereload %&gt;'
          },
          files: [
            '&lt;%= yeoman.app %&gt;/{,*/}*.html',
            '&lt;%= yeoman.app %&gt;/scripts/directives/**/*.html',
            '.tmp/styles/{,*/}*.css',
            '&lt;%= yeoman.app %&gt;/images/{,*/}*.{png,jpg,jpeg,gif,webp,svg}'
          ]
        }
      },
  
      // The actual grunt server settings
      connect: {
        options: {
          port: 9000,
          // Change this to '0.0.0.0' to access the server from outside.
          hostname: 'localhost',
          livereload: 35729
        },
        livereload: {
          options: {
            open: false,
            middleware: function (connect) {
              return [
                connect.static('.tmp'),
                connect().use(
                  '/bower_components',
                  connect.static('./bower_components')
                ),
                connect.static(appConfig.app)
              ];
            }
          }
        },
        test: {
          options: {
            port: 9001,
            middleware: function (connect) {
              return [
                connect.static('.tmp'),
                connect.static('test'),
                connect().use(
                  '/bower_components',
                  connect.static('./bower_components')
                ),
                connect.static(appConfig.app)
              ];
            }
          }
        },
        dist: {
          options: {
            open: false,
            base: '&lt;%= yeoman.dist %&gt;'
          }
        }
      },
  
      // Make sure code styles are up to par and there are no obvious mistakes
      jshint: {
        options: {
          jshintrc: '.jshintrc',
          reporter: require('jshint-stylish')
        },
        all: {
          src: [
            'Gruntfile.js',
            '&lt;%= yeoman.app %&gt;/scripts/{,*/}*.js'
          ]
        },
        test: {
          options: {
            jshintrc: 'test/.jshintrc'
          },
          src: ['test/spec/{,*/}*.js']
        }
      },
  
      // Empties folders to start fresh
      clean: {
        dist: {
          files: [{
            dot: true,
            src: [
              '.tmp',
              '&lt;%= yeoman.dist %&gt;/{,*/}*',
              '!&lt;%= yeoman.dist %&gt;/.git*'
            ]
          }]
        },
        server: '.tmp'
      },
  
      // Add vendor prefixed styles
      autoprefixer: {
        options: {
          browsers: ['last 1 version']
        },
        dist: {
          files: [{
            expand: true,
            cwd: '.tmp/styles/',
            src: '{,*/}*.css',
            dest: '.tmp/styles/'
          }]
        }
      },
  
      // Automatically inject Bower components into the app
      wiredep: {
        app: {
          src: ['&lt;%= yeoman.app %&gt;/index.html'],
          ignorePath: new RegExp('^&lt;%= yeoman.app %&gt;/|../')
        },
        sass: {
          src: ['&lt;%= yeoman.app %&gt;/styles/{,*/}*.{scss,sass}'],
          ignorePath: /(\.\.\/){1,2}bower_components\//
        }
      },
  
      // Compiles Sass to CSS and generates necessary files if requested
      compass: {
        options: {
          sassDir: '&lt;%= yeoman.app %&gt;/styles',
          cssDir: '.tmp/styles',
          generatedImagesDir: '.tmp/images/generated',
          imagesDir: '&lt;%= yeoman.app %&gt;/images',
          javascriptsDir: '&lt;%= yeoman.app %&gt;/scripts',
          fontsDir: '&lt;%= yeoman.app %&gt;/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: '&lt;%= yeoman.dist %&gt;/images/generated'
          }
        },
        server: {
          options: {
            debugInfo: true
          }
        }
      },
  
      // Renames files for browser caching purposes
      filerev: {
        dist: {
          src: [
            '&lt;%= yeoman.dist %&gt;/scripts/{,*/}*.js',
            '&lt;%= yeoman.dist %&gt;/styles/{,*/}*.css',
            '&lt;%= yeoman.dist %&gt;/images/{,*/}*.{png,jpg,jpeg,gif,webp,svg}',
            '&lt;%= yeoman.dist %&gt;/styles/fonts/*'
          ]
        }
      },
  
      // Reads HTML for usemin blocks to enable smart builds that automatically
      // concat, minify and revision files. Creates configurations in memory so
      // additional tasks can operate on them
      useminPrepare: {
        html: '&lt;%= yeoman.app %&gt;/index.html',
        options: {
          dest: '&lt;%= yeoman.dist %&gt;',
          flow: {
            html: {
              steps: {
                js: ['concat', 'uglifyjs'],
                css: ['cssmin']
              },
              post: {}
            }
          }
        }
      },
  
      // Performs rewrites based on filerev and the useminPrepare configuration
      usemin: {
        html: ['&lt;%= yeoman.dist %&gt;/{,*/}*.html'],
        css: ['&lt;%= yeoman.dist %&gt;/styles/{,*/}*.css'],
        options: {
          assetsDirs: ['&lt;%= yeoman.dist %&gt;','&lt;%= yeoman.dist %&gt;/images']
        }
      },
  
      // The following *-min tasks will produce minified files in the dist folder
      // By default, your `index.html`'s &lt;!-- Usemin block --&gt; will take care of
      // minification. These next options are pre-configured if you do not wish
      // to use the Usemin blocks.
      // cssmin: {
      //   dist: {
      //     files: {
      //       '&lt;%= yeoman.dist %&gt;/styles/main.css': [
      //         '.tmp/styles/{,*/}*.css'
      //       ]
      //     }
      //   }
      // },
      // uglify: {
      //   dist: {
      //     files: {
      //       '&lt;%= yeoman.dist %&gt;/scripts/scripts.js': [
      //         '&lt;%= yeoman.dist %&gt;/scripts/scripts.js'
      //       ]
      //     }
      //   }
      // },
      // concat: {
      //   dist: {}
      // },
  
      imagemin: {
        dist: {
          files: [{
            expand: true,
            cwd: '&lt;%= yeoman.app %&gt;/images',
            src: '{,*/}*.{png,jpg,jpeg,gif}',
            dest: '&lt;%= yeoman.dist %&gt;/images'
          }]
        }
      },
  
      svgmin: {
        dist: {
          files: [{
            expand: true,
            cwd: '&lt;%= yeoman.app %&gt;/images',
            src: '{,*/}*.svg',
            dest: '&lt;%= yeoman.dist %&gt;/images'
          }]
        }
      },
  
      htmlmin: {
        dist: {
          options: {
            collapseWhitespace: true,
            conservativeCollapse: true,
            collapseBooleanAttributes: true,
            removeCommentsFromCDATA: true,
            removeOptionalTags: true
          },
          files: [{
            expand: true,
            cwd: '&lt;%= yeoman.dist %&gt;',
            src: ['*.html', 'views/{,*/}*.html'],
            dest: '&lt;%= yeoman.dist %&gt;'
          }]
        }
      },
  
      // ngmin tries to make the code safe for minification automatically by
      // using the Angular long form for dependency injection. It doesn't work on
      // things like resolve or inject so those have to be done manually.
      ngmin: {
        dist: {
          files: [{
            expand: true,
            cwd: '.tmp/concat/scripts',
            src: '*.js',
            dest: '.tmp/concat/scripts'
          }]
        }
      },
  
      // Replace Google CDN references
      cdnify: {
        dist: {
          html: ['&lt;%= yeoman.dist %&gt;/*.html']
        }
      },
  
      // Copies remaining files to places other tasks can use
      copy: {
        dist: {
          files: [{
            expand: true,
            dot: true,
            cwd: '&lt;%= yeoman.app %&gt;',
            dest: '&lt;%= yeoman.dist %&gt;',
            src: [
              '*.{ico,png,txt}',
              '.htaccess',
              '*.html',
              'views/{,*/}*.html',
              'images/{,*/}*.{webp}',
              'fonts/*'
            ]
          }, {
            expand: true,
            cwd: '.tmp/images',
            dest: '&lt;%= yeoman.dist %&gt;/images',
            src: ['generated/*']
          }, {
            expand: true,
            cwd: '.',
            src: 'bower_components/bootstrap-sass-official/vendor/assets/fonts/bootstrap/*',
            dest: '&lt;%= yeoman.dist %&gt;'
          }]
        },
        styles: {
          expand: true,
          cwd: '&lt;%= yeoman.app %&gt;/styles',
          dest: '.tmp/styles/',
          src: '{,*/}*.css'
        }
      },
  
      // Run some tasks in parallel to speed up the build process
      concurrent: {
        server: [
          'compass:server'
        ],
        test: [
          'compass'
        ],
        dist: [
          'compass:dist',
          'imagemin',
          'svgmin'
        ]
      },
  
      // Test settings
      karma: {
        unit: {
          configFile: 'test/karma.conf.js',
          singleRun: false
        }
      }
    });
  
  
    grunt.loadNpmTasks('grunt-sass');
  
    grunt.registerTask('serve', 'Compile then start a connect web server', function (target) {
      if (target === 'dist') {
        return grunt.task.run(['build', 'connect:dist:keepalive']);
      }
      grunt.task.run([
        'clean:server',
        'wiredep',
        'concurrent:server',
        'autoprefixer',
        'connect:livereload',
        'watch'
      ]);
    });
  
    grunt.registerTask('server', 'DEPRECATED TASK. Use the "serve" task instead', function (target) {
      grunt.log.warn('The `server` task has been deprecated. Use `grunt serve` to start a server.');
      grunt.task.run(['serve:' + target]);
    });
  
    grunt.registerTask('test', [
      'clean:server',
      'autoprefixer',
      'connect:test',
      'karma'
    ]);
  
    grunt.registerTask('build', [
      'clean:dist',
      'wiredep',
      'useminPrepare',
      'concurrent:dist',
      'autoprefixer',
      'concat',
      'ngmin',
      'copy:dist',
      'cdnify',
      'cssmin',
      'uglify',
      'filerev',
      'usemin',
      'htmlmin'
    ]);
  
    grunt.registerTask('default', [
      'newer:jshint',
      'test',
      'build'
    ]);
  };
  </code></pre>
  
  <p>I generated the project with the yo angular generator. And this is my environment:</p>
  
  <ul>
  <li><code>node -v: v0.10.25</code></li>
  <li><code>ruby -v: ruby 2.1.2p95 (2014-05-08 revision 45877) [x86_64-darwin13.0]</code></li>
  <li><code>yo -v: 1.1.2</code></li>
  <li><p><code>gem list:</code> </p>
  
  <p><strong>* LOCAL GEMS *</strong></p>
  
  <p>bigdecimal (1.2.4)
  bundler (1.6.2)
  bundler-unload (1.0.2)
  chunky_png (1.3.1)
  compass (0.12.6)
  executable-hooks (1.3.1)
  fssm (0.2.10)
  gem-wrappers (1.2.4)
  io-console (0.4.2)
  json (1.8.1)
  minitest (4.7.5)
  psych (2.0.5)
  rake (10.1.0)
  rdoc (4.1.0)
  rubygems-bundler (1.4.3)
  rvm (1.11.3.9)
  sass (3.3.8, 3.2.19)
  test-unit (2.1.2.0)</p></li>
  <li><p><code>grunt --verison: grunt-cli v0.1.13, grunt v0.4.5</code></p></li>
  <li>Mac OS X 10.9</li>
  </ul>
  
  <p>This is my <code>package.json</code>:</p>
  
  <pre><code>{
    "name": "project1",
    "version": "0.0.0",
    "dependencies": {},
    "devDependencies": {
      "grunt": "^0.4.1",
      "grunt-autoprefixer": "^0.7.3",
      "grunt-concurrent": "^0.5.0",
      "grunt-contrib-clean": "^0.5.0",
      "grunt-contrib-coffee": "^0.10.1",
      "grunt-contrib-compass": "~0.8.0",
      "grunt-contrib-concat": "^0.4.0",
      "grunt-contrib-connect": "^0.7.1",
      "grunt-contrib-copy": "^0.5.0",
      "grunt-contrib-cssmin": "^0.9.0",
      "grunt-contrib-htmlmin": "^0.3.0",
      "grunt-contrib-imagemin": "^0.7.0",
      "grunt-contrib-jshint": "^0.10.0",
      "grunt-contrib-uglify": "^0.4.0",
      "grunt-contrib-watch": "^0.6.1",
      "grunt-filerev": "^0.2.1",
      "grunt-google-cdn": "^0.4.0",
      "grunt-newer": "^0.7.0",
      "grunt-ngmin": "^0.0.3",
      "grunt-svgmin": "^0.4.0",
      "grunt-usemin": "^2.1.1",
      "grunt-wiredep": "^1.7.0",
      "jshint-stylish": "^0.2.0",
      "load-grunt-tasks": "^0.4.0",
      "time-grunt": "^0.3.1",
      "coffee-script": "~1.7.1",
      "grunt-karma": "~0.8.3",
      "karma-phantomjs-launcher": "~0.1.4",
      "karma": "~0.12.16",
      "karma-jasmine": "~0.1.5",
      "karma-coffee-preprocessor": "~0.2.1",
      "karma-chrome-launcher": "~0.1.4",
      "karma-script-launcher": "~0.1.0",
      "karma-firefox-launcher": "~0.1.3",
      "karma-safari-launcher": "~0.1.1",
      "karma-ng-html2js-preprocessor": "~0.1.0",
      "karma-junit-reporter": "~0.2.2",
      "grunt-ng-constant": "~0.5.0",
      "grunt-bowercopy": "~1.0.1",
      "karma-coverage": "~0.2.4",
      "grunt-protractor-runner": "~1.0.0",
      "karma-jasmine-given": "~0.1.1",
      "grunt-sass": "~0.13.1"
    },
    "engines": {
      "node": "&gt;=0.10.0"
    },
    "scripts": {
      "test": "grunt test"
    }
  }
  </code></pre>
  
  <p>And this is my <code>bower.json</code>:</p>
  
  <pre><code>{
    "name": "project1",
    "version": "0.0.0",
    "dependencies": {
      "angular": "1.3.0-beta.11",
      "json3": "~3.3.1",
      "es5-shim": "~3.1.0",
      "jquery": "~1.11.1",
      "bootstrap-sass-official": "~3.1.1",
      "bootstrap": "~3.1.1",
      "angular-resource": "1.3.0-beta.11",
      "angular-cookies": "1.3.0-beta.11",
      "angular-sanitize": "1.3.0-beta.11",
      "angular-animate": "1.3.0-beta.11",
      "angular-touch": "1.3.0-beta.11",
      "angular-route": "1.3.0-beta.11",
      "font-awesome": "~4.1",
      "underscore": "~1.6.0"
    },
    "devDependencies": {
      "angular-mocks": "1.3.0-beta.11",
      "angular-scenario": "1.3.0-beta.11"
    },
    "appPath": "app"
  }
  </code></pre>