grunt-sync与grunt-contrib-watch

时间:2014-07-23 16:12:01

标签: gruntjs 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模块的代码并不是非常熟悉。

1 个答案:

答案 0 :(得分:0)

嗯......事实上我在我的gruntfile中引用了一个模块,之后我在它上面运行了npm install,然后决定上网告诉所有人。

  

编辑:

     
    

为了部分免除自己,我找到了我以前运行npm的控制台安装grunt-sync --save-dev。我跑了,但我在     错误的目录;它将它添加到错误的gruntfile中。

  

要回答我自己的问题,与[grunt-sync]模块一起打包的gruntfile包含一个watch部分,所以你只需要安装grunt-contrib-watch;你不必做任何特别的事。这是有道理的。如果没有文件系统监视,文件夹同步任务就会变得毫无价值,因此在一个非常宽泛的手表中运行任务是完全合理的,但是有一个固有的黑名单(它会监视所有文件夹中的所有文件,但只对匹配src的文件进行操作)图案。

所以要让它同步所有文件更改的所有文件,

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

会将所有文件复制到publish子目录。我在并发任务中运行我的

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

就个人而言,我可能会用grunt-rsync交换它,因为grunt-sync只是执行[sync:main]中的文件复制任务我想要它做的只是每次只发送deltas到publish文件夹我保存了一个文件;这是rsync的任务。