Javascript Grunt:查看多个文件,只编译已更改的文件-livereload中断?
我对Grunt和Javascript/Coffeescript都是新手 我们正在一个相当大的项目中使用Grunt,该项目包含数百个.coffee文件。由于Grunt编译所有的咖啡文件(尽管只有一个文件发生了更改),我最初的问题是如何让Grunt只编译一个更改过的文件。 使用stackoverflow,我能够回答这个问题,谢谢大家:) 但现在看来,实施的解决方案打破了livereload。当我开始使用“grunt服务器”并在浏览器中显示我的页面时,一切看起来都很好。然后我更改一个.coffee文件并保存它。该文件已编译(我已检查),但我的浏览器从未重新加载。只有手动重新加载浏览器时,才会显示新修改的代码 所以问题是:为什么livereload不再有效 我不知道这是否重要,但Gruntfile是在较旧的版本中使用yeoman创建的(使用grunt regarde)。我使用grunt contrib watch和buildin livereload将package.json和GrunFile更新为新的规范。没有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.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']