grunt-sync с grunt-contrib-watch

В настоящее время я пытаюсь настроить grunt-sync для запуска внутри часов, и у меня возникают проблемы. Я сообщил о проблеме на странице модуля на github, но решил опубликовать здесь, чтобы привлечь внимание всех разработчиков, а не ждать, пока один участник наткнется на мой отчет о проблеме.

Итак, я думаю, что это может быть просто пробел в моем понимании того, как выполнять грубые задачи через часы. У меня уже есть часы, работающие для нескольких задач, и я добавляю grunt-sync в свой рабочий процесс, чтобы автоматизировать публикацию моих изменений в сетевом каталоге, что бла-бла-бла ... не важно; мои часы работают для некоторых вещей, но не для этого. Я опускаю соответствующий раздел конфигурации вместе с моими «одновременными», «кармой» и «дерзкими» задачами, чтобы дать вам суть моей общей конфигурации ворчания.

module.exports = function(grunt){
grunt.initConfig({
    pkg: grunt.file.readJSON("package.json"),
    project: {
        app: 'app',
    },
    sync:{
        main: {
            files: 
            [
                {   
                    cwd: 'app/', 
                    src: [
                            '**/*.js',
                            '**/*.html',
                            '**/*.css',
                            '!app/node_modules/**'
                        ], 
                    dest: ['publish/']
                }
            ],
            verbose: true
        }
    },
    karma: {
        unit: {
            configFile: 'test/karma.conf.js'
        },
        continuous:{
            configFile: 'test/karma.conf.js',
            singleRun: true,
            browsers: ['PhantomJS']
        }
    },
    sass:{
        dev: {
            options:{
                style: 'expanded',
                compass: false
            },
            files:{
                'app/css/app.css':'app/css/app.scss'
            }
        },
        dist: {
            options: {
                style: 'compressed',
                compass: false
            },
            files:{
                'app/css/app.css':'app/css/app.scss'
            }
        }
    },
    watch: {
        sass: {
            files: 'app/css/**/{,*/}*.{scss,sass}',
            tasks: ['sass:dev']
        },
        styles: {
            files: ['app/css/app.css'],
            tasks: ['autoprefixer']
        },
        // karma: {
            // files: ['test/*.js',
                    // 'test/**/*.js'
                    // ],
            // tasks: ['karma:unit:run']
        // },
        livereload:{
            options: {livereload: true},
            files: ['app/**/*'],
        },
        sync:{
            files: ['app/**'],
            tasks: ['sync:main']
        }

    },
    concurrent:
    {
        target: {
            tasks:  [
                        'karma:unit',
                        'watch'
                    ],
            options: {
                logConcurrentOutput: true
            }
        }
    }
});

require('matchdep').filterDev('grunt-*').forEach(grunt.loadNpmTasks);
grunt.registerTask('default', [

                                'sass:dev',
                                'concurrent:target'
                             ]
);
};

В настоящее время получаю следующее предупреждение, когда я ворчу

Warning: Task "sync:main" not found. Use --force to continue.
Aborted due to warnings.

Поскольку есть только основная подзадача, я подумал, что, возможно, сработает изменение часов с выполнения ['sync:main'] на выполнение ['sync']. Предупреждение исчезает, но poof ничего не происходит... поэтому я не уверен, связана ли проблема с моей конфигурацией или с реализацией модуля.

Есть идеи?

Изменить, чтобы добавить:

На сайте github модуля я вижу следующее в sync.json

    {
  "main": {
    "files": [{
      "src": ["**"],
      "dest": "bin/to",
      "cwd": "bin/from"
    }]
  }
}

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


person K. Alan Bates    schedule 23.07.2014    source источник
comment
Можно ли запустить grunt sync:main из терминала без предупреждений?   -  person Kyle Robinson Young    schedule 23.07.2014
comment
ммм... не проверял. Я проверю!   -  person K. Alan Bates    schedule 23.07.2014
comment
Подождите... глядя на gruntfile модуля, там уже определен раздел наблюдения. Означает ли это, что задача по своей сути выполняется под наблюдением?   -  person K. Alan Bates    schedule 23.07.2014
comment
Если вы получаете то же предупреждение с grunt sync:main, это означает, что задача не загружена. Убедитесь, что grunt-sync указан в списке devDependencies вашего package.json, чтобы require('matchdep').filterDev('grunt-*').forEach(grunt.loadNpmTasks) мог его забрать.   -  person Kyle Robinson Young    schedule 24.07.2014
comment
дааааааа.......да. Не могу сказать, что это когда-либо случалось со мной. Я сослался на модуль grunt в своем файле grunt до того, как установил его с помощью npm, и решил поделиться свидетельством с stackoverflow. ‹понижает себя со старшего›   -  person K. Alan Bates    schedule 24.07.2014


Ответы (1)


Что ж... оказывается, я сослался на модуль в своем файле grunt перед тем, как запустить на нем npm install, а затем решил зайти в Интернет, чтобы рассказать всем об этом.

Редактировать:

Чтобы частично оправдать себя, я нашел консоль, которую использовал для запуска npm install grunt-sync --save-dev. Я запустил его, но оказался не в том каталоге; он добавил его в неправильный gruntfile.

Чтобы ответить на мой собственный вопрос, файл grunt, упакованный с модулем [grunt-sync], содержит раздел просмотра, поэтому вам просто нужно установить grunt-contrib-watch; вам не нужно делать ничего особенного. И это имеет смысл. Задача синхронизации папок была бы чертовски бесполезна без наблюдения за файловой системой, поэтому вполне разумно запускать задачу в очень широких пределах, но с присущим черным списком (она отслеживает все файлы во всех папках, но работает только с файлами, соответствующими src). шаблон.

Итак, чтобы заставить его синхронизировать все файлы при всех изменениях файлов,

sync: {
        main:{
            files:[{
                    src:[
                            '**'
                        ]
                    , dest: 'publish'
                    }
                  ]
            ,verbose: true
        }
    },

скопирует все файлы в подкаталог публикации. Я запускаю свою в параллельной задаче

concurrent:
    {
        target: {
            tasks:  [
                        'karma:unit',
                        'sync:main',
                        'watch'
                    ],
            options: {
                logConcurrentOutput: true
            }
        }
    }

Лично я, вероятно, заменю это grunt-rsync, потому что grunt-sync просто выполняет задачу копирования файла внутри [sync:main]. Я хочу, чтобы он делал только отправку дельт в папку публикации каждый раз, когда я сохраняю файл; это задача для rsync.

person K. Alan Bates    schedule 24.07.2014