Параллельные задачи Grunt перезаписывают журналы других задач

Я столкнулся с интересной проблемой, когда оказалось, что некоторые задачи ворчания, которые записывают в терминал во время задачи, перезаписывают друг друга при одновременном запуске. Например:

Я пытаюсь одновременно запустить две задачи: одну для модульного тестирования и одну для тестирования e2e. Оба должны автоматически отслеживать файлы, над которыми я работаю, и поэтому в моем Gruntfile.js есть следующее (это только интересные фрагменты:

Gruntfile.js:

concurrent: {
  options: { logConcurrentOutput: true },
  server: [
    'copy:styles'
  ],
  test: [
    'copy:styles'
  ],
  dist: [
    'copy:styles',
    'imagemin',
    'svgmin'
  ],
  continuous: {
      tasks: [
                'karma:unit_auto',
                'karma:e2e_auto'
              ]
  }
},
karma: {
        unit: {
            configFile: 'karma.conf.js',
            singleRun: true
        },
        unit_auto: {
            configFile: 'karma.conf.js',
            autoWatch: true,
            singleRun: false
        },
        e2e: {
            configFile: 'karma-e2e.conf.js',
            singleRun: true
        },
        e2e_auto: {
            configFile: 'karma-e2e.conf.js',
            autoWatch: true,
            singleRun: false
        }
    }
////////// and later in the file....... ///////////
grunt.registerTask('continuous', [
    'clean:server',
    'concurrent:continuous'
]);

Когда я запускаю grunt Continuous из командной строки, я вижу два всплывающих окна браузера, как я и ожидал. Часто при первом запуске я получаю вывод из терминала, который хотел бы видеть:

При первом запуске $grunt Continuous:

user@myMachine:/path/to/working/directory$ grunt continuous
Running "clean:server" (clean) task

Running "concurrent:continuous" (concurrent) task
Running "karma:e2e_auto" (karma) task
Running "karma:unit_auto" (karma) task
INFO [karma]: Karma v0.12.10 server started at http://localhost:9999/
WARN [karma]: Port 9998 in use
INFO [launcher]: Starting browser Chrome
WARN [karma]: Port 9999 in use
INFO [karma]: Karma v0.12.10 server started at http://localhost:10000/_e2e/
INFO [launcher]: Starting browser Chrome
INFO [Chrome 33.0.1750 (Linux)]: Connected on socket raGtr-40ZhPP7nCFXwvB with id 67817341
INFO [Chrome 33.0.1750 (Linux)]: Connected on socket IM2e8gy38Np1dL4fXwuy with id 77648855
Chrome 33.0.1750 (Linux): Executed 4 of 4 SUCCESS (0.11 secs / 0.104 secs)
Chrome 33.0.1750 (Linux): Executed 1 of 1 SUCCESS (0.206 secs / 0.167 secs)

Однако, когда я изменяю (и сохраняю) просматриваемые файлы, я начинаю видеть странные результаты. Обратите внимание, что сохранение одного и того же файла снова и снова часто дает разные результаты параллельных задач:

После многократного сохранения одних и тех же файлов:

INFO [watcher]: Changed file "/var/www/web-tcad/app/scripts/app.js".
INFO [watcher]: Changed file "/var/www/web-tcad/app/scripts/app.js".
Chrome 33.0.1750 (Linux): Executed 4 of 4 SUCCESS (0.114 secs / 0.103 secs)
Chrome 33.0.1750 (Linux): Executed 1 of 1 SUCCESS (0.159 secs / 0.12 secs)
INFO [watcher]: Changed file "/var/www/web-tcad/app/scripts/app.js".
INFO [watcher]: Changed file "/var/www/web-tcad/app/scripts/app.js".
Chrome 33.0.1750 (Linux): Executed 0 of 4 SUCCESS (0 secs / 0 secs)
Chrome 33.0.1750 (Linux): Executed 1 of 1 SUCCESS (0.181 secs / 0.148 secs)
INFO [watcher]: Changed file "/var/www/web-tcad/app/scripts/app.js".
INFO [watcher]: Changed file "/var/www/web-tcad/app/scripts/app.js".
Chrome 33.0.1750 (Linux): Executed 0 of 4 SUCCESS (0 secs / 0 secs)
Chrome 33.0.1750 (Linux): Executed 1 of 1 SUCCESS (0.141 secs / 0.12 secs)
INFO [watcher]: Changed file "/var/www/web-tcad/app/scripts/app.js".
INFO [watcher]: Changed file "/var/www/web-tcad/app/scripts/app.js".
Chrome 33.0.1750 (Linux): Executed 0 of 4 SUCCESS (0 secs / 0 secs)
Chrome 33.0.1750 (Linux): Executed 1 of 1 SUCCESS (0.241 secs / 0.219 secs)
INFO [watcher]: Changed file "/var/www/web-tcad/app/scripts/app.js".
INFO [watcher]: Changed file "/var/www/web-tcad/app/scripts/app.js".
Chrome 33.0.1750 (Linux): Executed 0 of 1 SUCCESS (0 secs / 0 secs)
Chrome 33.0.1750 (Linux): Executed 1 of 1 SUCCESS (0.253 secs / 0.227 secs)
INFO [watcher]: Changed file "/var/www/web-tcad/app/scripts/controllers/mmsLandingPageCtrl.js".
INFO [watcher]: Changed file "/var/www/web-tcad/app/scripts/controllers/mmsLandingPageCtrl.js".
Chrome 33.0.1750 (Linux): Executed 3 of 4 SUCCESS (0 secs / 0.091 secs)
Chrome 33.0.1750 (Linux): Executed 1 of 1 SUCCESS (0.208 secs / 0.151 secs)
INFO [watcher]: Changed file "/var/www/web-tcad/app/scripts/controllers/mmsLandingPageCtrl.js".
INFO [watcher]: Changed file "/var/www/web-tcad/app/scripts/controllers/mmsLandingPageCtrl.js".
Chrome 33.0.1750 (Linux): Executed 0 of 4 SUCCESS (0 secs / 0 secs)
Chrome 33.0.1750 (Linux): Executed 1 of 1 SUCCESS (0.249 secs / 0.218 secs)

Я считаю, что проблема здесь возникает из-за того, как журнал на самом деле пишет в терминал... а именно, я думаю, что каждый раз, когда запускается тест, задача grunt стирает последнюю строку терминала и заменяет ее текущим прогрессом. Есть ли какие-либо предложения, что вы все должны контролировать это поведение или настроить мои ворчащие задачи по-другому, чтобы избежать проблемы?

Ваше здоровье!


person Mik Cox    schedule 24.04.2014    source источник


Ответы (1)


В моей настройке karma grunt я фактически использую grunt-contrib-watch и запускаю задачу karma из часов. На самом деле у меня есть другие шаги в настройке сборки, поэтому очень полезно запустить его из задачи наблюдения.

Вы, вероятно, хотите что-то вроде этого:

karma: {
  e2e: {
    configFile: 'karma-e2e.conf.js',
    background: true
  },
  unit: {
    configFile: 'karma.conf.js',
    background: true
  }
},
watch: {
  karma_e2e: {
    files: [<<list of your files to watch for e2e>>],
    tasks: ['karma:e2e:run'],
    options: {
      atBegin: true,
      spawn: false    // necessary to preserve console output
    }
  },
  karma_unit: {
    files: [<<list of your files to watch for unit>>],
    tasks: ['karma:unit:run'],
    options: {
      atBegin: true,
      spawn: false    // necessary to preserve console output
    }
  }
}

grunt.registerTask('continuous', [
  'clean:server',
  'watch'
]);
person jdiaz5513    schedule 25.04.2014
comment
Во-первых, приведенный выше код не совсем работает и дает сбой: Выполняется задача watch:karma_e2e (watch) Ожидание... OK Выполняется задача karma:e2e_auto:run (karma) Сервер не прослушивает порт 9998. Изменение 'karma:e2e_auto:run' в 'karma:e2e_auto' устраняет эту проблему (очевидно, проблема с версиями Karma/grunt-karma), но тогда поведение задачи наблюдения по-прежнему странное. Он запускает новый браузер каждый раз, когда файл изменяется, и на самом деле не показывает результаты моих модульных тестов, а только то, что задачи «karma:e2e_auto» и «karma:unit» были запущены и завершены. - person Mik Cox; 29.04.2014
comment
С еще парой изменений (которые я опубликую, как только мы выясним окончательное решение) у меня есть задача наблюдения, регистрирующая вывод подзадач karma:unit и karma:e2e. Этот рабочий процесс по-прежнему вызывает открытие и закрытие окна браузера при каждом тесте... есть ли способ обойти это? Это значительно замедляет процесс разработки... - person Mik Cox; 29.04.2014