Javascript Grunt:查看多个文件,只编译已更改的文件-livereload中断?

Javascript Grunt:查看多个文件,只编译已更改的文件-livereload中断?,javascript,coffeescript,gruntjs,livereload,grunt-contrib-watch,Javascript,Coffeescript,Gruntjs,Livereload,Grunt Contrib Watch,我对Grunt和Javascript/Coffeescript都是新手 我们正在一个相当大的项目中使用Grunt,该项目包含数百个.coffee文件。由于Grunt编译所有的咖啡文件(尽管只有一个文件发生了更改),我最初的问题是如何让Grunt只编译一个更改过的文件。 使用stackoverflow,我能够回答这个问题,谢谢大家:) 但现在看来,实施的解决方案打破了livereload。当我开始使用“grunt服务器”并在浏览器中显示我的页面时,一切看起来都很好。然后我更改一个.coffee文件

我对Grunt和Javascript/Coffeescript都是新手

我们正在一个相当大的项目中使用Grunt,该项目包含数百个.coffee文件。由于Grunt编译所有的咖啡文件(尽管只有一个文件发生了更改),我最初的问题是如何让Grunt只编译一个更改过的文件。 使用stackoverflow,我能够回答这个问题,谢谢大家:)

但现在看来,实施的解决方案打破了livereload。当我开始使用“grunt服务器”并在浏览器中显示我的页面时,一切看起来都很好。然后我更改一个.coffee文件并保存它。该文件已编译(我已检查),但我的浏览器从未重新加载。只有手动重新加载浏览器时,才会显示新修改的代码

所以问题是:为什么livereload不再有效

我不知道这是否重要,但Gruntfile是在较旧的版本中使用yeoman创建的(使用grunt regarde)。我使用grunt contrib watch和buildin livereload将package.json和GrunFile更新为新的规范。没有
grunt.event.on
一切正常

资料来源(部分):

grunt.initConfig({
观察:{
咖啡:{
文件:['/coffeescripts/***.coffee'],
任务:[“咖啡:应用程序”],
选项:{
nospawn:是的
},
},
指南针:{
文件:['/styles/***.{scss,sass}'],
任务:[“指南针”]
},
模板:{
文件:['/templates/**.tpl'],
任务:[“把手”]
},
利弗雷罗德:{
选项:{
利弗雷洛德:利弗雷洛德港口
},
档案:[
“/*.html”,
“/styles/***/.css”,
“/scripts/***/.js”,
“/spec/***/.js”,
“/img/{,*/}{png,jpg,jpeg,webp}”,
]
}
},
咖啡:{
应用程序:{
是的,
cwd:“/coffeescripts”,
src:“***咖啡”,
dest:“/scripts”,
分机:'.js',
选项:{
运行时:“内联”,
sourceMap:true
},
}
}
}
});
grunt.event.on('watch',函数(操作,文件路径){
filepath=filepath.replace(grunt.config('coffee.app.cwd')+'/','';
grunt.config('coffee.app.src',[filepath]);
});
grunt.registerTask('server',函数(目标){
如果(目标=='dist'){
返回grunt.task.run(['build','open','connect:dist:keepalive']);
}
grunt.task.run([
“清理:服务器”,
“咖啡”,
“指南针:服务器”,
“符号链接:鲍尔”,
'连接:livereload',
“把手”,
“通知:注意”,
“注意”
]);
});

grunt contrib手表与版本
v0.4.4
一起使用, 将livereload与版本
0.2.0
连接到我的解决方案:

grunt.initConfig({
        pkg: grunt.file.readJSON('package.json'),
        cssmin: {
            dist: {
                expand: true,
                cwd: 'app',
                src: ['**/*.css'],
                dest: 'WebContent'
            }
        },
        uglify: {
            options: {
                mangle: false
            },
            dist: {
                expand: true,
                cwd: 'app/js',
                src: ['**/*.js'],
                dest: 'WebContent/js'
            }
        },
        htmlmin: {
            options: {
                collapseWhitespace: true
            },
            dist: {
                expand: true,
                cwd: 'app',
                src: ['**/*.html'],
                dest: 'WebContent'
            }
        },
        watch: {
            options: {
                spawn: false
            },
            cssmin: {
                files: 'app/css/**/*.css',
                tasks: ['cssmin']
            },
            uglify: {
                files: 'app/js/**/*.js',
                tasks: ['uglify']
            },
            htmlmin: {
                files: 'app/**/*.html',
                tasks: ['htmlmin']
            }
        },
    });

    // Faz com que seja salvo somente o arquivo que foi alterado
    grunt.event.on('watch', function(action, filepath) {
        var tasks = ['cssmin', 'uglify', 'htmlmin'];

        for (var i=0, len=tasks.length; i < tasks.length; i++) {
            var taskName = tasks[i];

            if (grunt.file.isMatch(grunt.config('watch.'+ taskName +'.files'), filepath)) {
                var cwd = new String(grunt.config(taskName + '.dist.cwd')).split('/').join('\\') + '\\'; //inverte as barras e adiciona uma "\" no final
                var pathWithoutCwd = filepath.replace(cwd, ''); //obtem somente o path sem o cwd

                grunt.config(taskName + '.dist.src', pathWithoutCwd); //configura a task
            }   
        }
    });

    grunt.loadNpmTasks('grunt-contrib-watch');
    grunt.loadNpmTasks('grunt-contrib-cssmin');
    grunt.loadNpmTasks('grunt-contrib-uglify');
    grunt.loadNpmTasks('grunt-contrib-htmlmin');

    // Tarefas padrão
    grunt.registerTask('default', ['cssmin', 'uglify', 'htmlmin']);
};
grunt.initConfig({
pkg:grunt.file.readJSON('package.json'),
cssmin:{
地区:{
是的,
cwd:“应用程序”,
src:['***.css'],
目标:“网络内容”
}
},
丑陋的:{
选项:{
马槽:错
},
地区:{
是的,
cwd:'app/js',
src:['***.js'],
dest:'WebContent/js'
}
},
htmlmin:{
选项:{
collapseWhitespace:true
},
地区:{
是的,
cwd:“应用程序”,
src:['**.html'],
目标:“网络内容”
}
},
观察:{
选项:{
产卵:假
},
cssmin:{
文件:“app/css/***.css”,
任务:['cssmin']
},
丑陋的:{
文件:“app/js/***.js”,
任务:['uglify']
},
htmlmin:{
文件:“app/***.html”,
任务:['htmlmin']
}
},
});
//我希望你能在另一种情况下继续努力
grunt.event.on('watch',函数(操作,文件路径){
var tasks=['cssmin','uglify','htmlmin'];
for(var i=0,len=tasks.length;i
我想
grunt concurrent
就是您要搜索的内容

这是我的方法。(注意它是用咖啡脚本写的,但你应该能够很容易地适应它。)


您使用的手表版本是什么?grunt contrib手表与版本
v0.4.4
一起使用,连接livereload与版本
0.2.0
。我用这些信息更新了我上面的问题。对不起,我忘了。谢谢你的回答,但这不起作用。在进行了一些小的修改以使其在我的环境下运行之后,我尝试了您的代码,尽管只有修改过的cof
grunt.initConfig({
        pkg: grunt.file.readJSON('package.json'),
        cssmin: {
            dist: {
                expand: true,
                cwd: 'app',
                src: ['**/*.css'],
                dest: 'WebContent'
            }
        },
        uglify: {
            options: {
                mangle: false
            },
            dist: {
                expand: true,
                cwd: 'app/js',
                src: ['**/*.js'],
                dest: 'WebContent/js'
            }
        },
        htmlmin: {
            options: {
                collapseWhitespace: true
            },
            dist: {
                expand: true,
                cwd: 'app',
                src: ['**/*.html'],
                dest: 'WebContent'
            }
        },
        watch: {
            options: {
                spawn: false
            },
            cssmin: {
                files: 'app/css/**/*.css',
                tasks: ['cssmin']
            },
            uglify: {
                files: 'app/js/**/*.js',
                tasks: ['uglify']
            },
            htmlmin: {
                files: 'app/**/*.html',
                tasks: ['htmlmin']
            }
        },
    });

    // Faz com que seja salvo somente o arquivo que foi alterado
    grunt.event.on('watch', function(action, filepath) {
        var tasks = ['cssmin', 'uglify', 'htmlmin'];

        for (var i=0, len=tasks.length; i < tasks.length; i++) {
            var taskName = tasks[i];

            if (grunt.file.isMatch(grunt.config('watch.'+ taskName +'.files'), filepath)) {
                var cwd = new String(grunt.config(taskName + '.dist.cwd')).split('/').join('\\') + '\\'; //inverte as barras e adiciona uma "\" no final
                var pathWithoutCwd = filepath.replace(cwd, ''); //obtem somente o path sem o cwd

                grunt.config(taskName + '.dist.src', pathWithoutCwd); //configura a task
            }   
        }
    });

    grunt.loadNpmTasks('grunt-contrib-watch');
    grunt.loadNpmTasks('grunt-contrib-cssmin');
    grunt.loadNpmTasks('grunt-contrib-uglify');
    grunt.loadNpmTasks('grunt-contrib-htmlmin');

    // Tarefas padrão
    grunt.registerTask('default', ['cssmin', 'uglify', 'htmlmin']);
};
watch:
  compass:
    files: ['private/compass/**/*.scss']
    tasks: ['compass:dist']
    options:
      livereload: true
  coffee:
    options:
      livereload: 34567
    files: ['private/coffee/**/*/.coffee']
    tasks: ['coffee:dist']
  ci:
    options:
      livereload: 34568
    files: ['application/views/**/*.php', 'application/controllers/**/*.php']

concurrent:
  options:
    logConcurrentOutput: true
  dev: ['watch:compass', 'watch:coffee', 'watch:ci']