Javascript Grunt:获取错误的行号
我正在node.js中使用Grunt,并试图让Grunt告诉我它在GrunFile.js中发现错误的地方。它默认不会这么做,这似乎很奇怪 对于Javascript Grunt:获取错误的行号,javascript,node.js,gruntjs,Javascript,Node.js,Gruntjs,我正在node.js中使用Grunt,并试图让Grunt告诉我它在GrunFile.js中发现错误的地方。它默认不会这么做,这似乎很奇怪 对于grunt watch,我得到以下错误: Loading "Gruntfile.js" tasks...ERROR >> SyntaxError: Unexpected string Warning: Task "watch" not found. Use --force to continue. 我真的很想知道那个意外的字符串在哪一行,但我
grunt watch
,我得到以下错误:
Loading "Gruntfile.js" tasks...ERROR
>> SyntaxError: Unexpected string
Warning: Task "watch" not found. Use --force to continue.
我真的很想知道那个意外的字符串在哪一行,但我不能让格伦特告诉我
当我尝试grunt watch--stack
时,它会显示节点文件的整个node.js堆栈跟踪,但不会显示Gruntfile.js中的错误源
添加grunt.option('stack',true)如中所建议的,在Gruntfile.js顶部的code>没有任何效果
My Grunfile.js:
var path_dev = 'app/assets/_dev';
var path_live = 'app/assets';
var url_dev = '//assets.domain.dev/_dev';
module.exports = function (grunt) {
grunt.option('stack', true);
grunt.initConfig({
pkg: grunt.file.readJSON('package.json'),
banner: '/*!\n' +
'* <%= pkg.name %> - v<%= pkg.version %> - <%= grunt.template.today("yyyy-mm-dd") %> - Copyright <%= grunt.template.today("yyyy") %> \n' +
'* @author <%= pkg.author %>\n' +
'*/',
path_dev: path_dev,
path_live: path_live,
url_dev: url_dev,
clean: {
build: {
src: [
'<%= path_live %>/css/',
'<%= path_live %>/js/'
]
}
},
concat: {
options: {
separator: ';'
},
build: {
src: [
'<%= path_dev %>/js/core/jquery.min.js',
'<%= path_dev %>/js/core/bootstrap.min.js',
'<%= path_dev %>/js/core/jquery.slimscroll.min.js',
'<%= path_dev %>/js/core/jquery.scrollLock.min.js',
'<%= path_dev %>/js/core/jquery.appear.min.js',
'<%= path_dev %>/js/core/jquery.countTo.min.js',
'<%= path_dev %>/js/core/jquery.placeholder.min.js',
'<%= path_dev %>/js/core/js.cookie.min.js',
'<%= path_dev %>/js/main.js'
],
dest: '<%= path_live %>/js/global.js'
}
},
uglify: {
options: {
banner: '<%= banner %>'
},
build: {
files: {
'<%= path_live %>/js/global.js': ['<%= path_live %>/js/global.js']
}
}
},
copy: {
build: {
files: [
{
expand: true,
cwd: '<%= path_dev %>/css/',
src: 'bootstrap.min.css',
dest: '<%= path_live %>/css/'
},
{
expand: true,
cwd: '<%= path_dev %>/fonts/',
src: '**',
dest: '<%= path_live %>/fonts/'
},
{
expand: true,
cwd: '<%= path_dev %>/img/',
src: '**',
dest: '<%= path_live %>/img/'
},
{
expand: true,
cwd: '<%= path_dev %>/js/plugins/',
src: '**',
dest: '<%= path_live %>/js/plugins/'
}
]
}
}
});
var tasks_to_watch = [];
var less = {};
var watch = {};
//less:build
less['build'] = {
options: {
compress: true,
yuicompress: true,
optimization: 2,
},
files: {}
};
less['build']['files'][path_live+'/css/global.css'] = path_dev'/less/main.less';
less['build']['files'][path_live+'/css/apps/**/*.css'] = path_dev'/less/apps/**/*.less';
//less:dev_main
less['dev_main'] = {
options: {
sourceMap: true,
sourceMapURL: url_dev+'/css/global.css.map',
},
files: {}
};
less['dev_main']['files'][path_dev+'/css/global.css'] = path_dev'/less/main.less';
tasks_to_watch.push('less:dev_main');
//less:(dynamically find .less files)
grunt.file.recurse(path_dev+'/less/apps/', function(abspath, rootdir, subdir, filename) {
if(filename.match(/\.less$/g)){
var name = filename.substring(0, filename.lastIndexOf('.'));
var thisurl = url_dev+'/css/apps/app/'+name+'.css';
var thispath = path_dev+'/css/apps/app/'+name+'.css';
less[name] = {
options: {
sourceMap: true,
sourceMapURL: thisurl+'.map',
},
files: {}
};
less[name]['files'][thispath] = abspath;
tasks_to_watch.push('less:'+name);
}
}); //grunt.file.recurse()
watch = {
styles: {
files: [path_dev+'/less/**/*.less'],
tasks: tasks_to_watch,
options: {
nospawn: true
}
}
};
//now repurpose the array to contain all tasks, so we can register them all below
tasks_to_watch.push('less:build');
tasks_to_watch.push('watch');
//load tasks
grunt.loadNpmTasks('grunt-contrib-watch');
grunt.loadNpmTasks('grunt-contrib-less');
grunt.loadNpmTasks('grunt-contrib-clean');
grunt.loadNpmTasks('grunt-contrib-concat');
grunt.loadNpmTasks('grunt-contrib-uglify');
grunt.loadNpmTasks('grunt-contrib-copy');
grunt.config('less', less);
grunt.config('watch', watch);
//register tasks
grunt.registerTask('default', tasks_to_watch);
grunt.registerTask('build', ['clean:build', 'less:build', 'concat:build', 'uglify:build', 'copy:build']);
};
var path_dev='app/assets/_dev';
var path_live=‘应用程序/资产’;
var url_dev='//assets.domain.dev/_dev';
module.exports=函数(grunt){
选项('stack',true);
grunt.initConfig({
pkg:grunt.file.readJSON('package.json'),
横幅:'/*!\n'+
“*-v--版权所有\n”+
“*@author\n”+
'*/',
路径开发:路径开发,
现场路径:现场路径,
url\u dev:url\u dev,
清洁:{
建造:{
src:[
“/css/”,
“/js/”
]
}
},
康卡特:{
选项:{
分隔符:';'
},
建造:{
src:[
“/js/core/jquery.min.js”,
“/js/core/bootstrap.min.js”,
“/js/core/jquery.slimscroll.min.js”,
“/js/core/jquery.scrollLock.min.js”,
“/js/core/jquery.appeage.min.js”,
“/js/core/jquery.countTo.min.js”,
“/js/core/jquery.placeholder.min.js”,
“/js/core/js.cookie.min.js”,
“/js/main.js”
],
dest:“/js/global.js”
}
},
丑陋的:{
选项:{
横幅:“”
},
建造:{
档案:{
'/js/global.js':['/js/global.js']
}
}
},
副本:{
建造:{
档案:[
{
是的,
cwd:“/css/”,
src:'bootstrap.min.css',
目标:'/css/'
},
{
是的,
cwd:“/fonts/”,
src:“**”,
目标:'/fonts/'
},
{
是的,
cwd:“/img/”,
src:“**”,
目的地:'/img/'
},
{
是的,
cwd:“/js/plugins/”,
src:“**”,
dest:“/js/plugins/”
}
]
}
}
});
var任务到监视=[];
var-less={};
var-watch={};
//减:建造
小于['build']={
选项:{
是的,
是的,
优化:2,
},
文件:{}
};
less['build']['files'][path_live+'/css/global.css']=path_dev'/less/main.less';
less['build']['files'][path_live+'/css/apps/***/.css']=path_dev'/less/apps/***/.less';
//减:dev_main
减去['dev_main']={
选项:{
sourceMap:true,
sourceMapURL:url_dev+'/css/global.css.map',
},
文件:{}
};
less['dev_main']['files'][path_dev+'/css/global.css']=path_dev'/less/main.less';
tasks_to_watch.push('less:dev_main');
//less:(动态查找.less文件)
recurse(path_dev+'/less/apps/',函数(abspath、rootdir、subdir、filename){
if(filename.match(/\.less$/g)){
var name=filename.substring(0,filename.lastIndexOf('.');
var thisurl=url_dev+'/css/apps/app/'+name+'.css';
var thispath=path_dev+'/css/apps/app/'+name+'.css';
减去[名称]={
选项:{
sourceMap:true,
sourceMapURL:thisurl+'.map',
},
文件:{}
};
减去[name]['files'][thispath]=abspath;
任务到watch.push('less:'+名称);
}
});//grunt.file.recurse()
手表={
风格:{
文件:[path_dev+'/less/***/.less'],
任务:任务到监视,
选项:{
nospawn:是的
}
}
};
//现在重新调整阵列的用途以包含所有任务,这样我们就可以在下面全部注册它们
任务到监视。推送('less:build');
任务到监视。按(“监视”);
//加载任务
grunt.loadNpmTasks(“grunt-contrib-watch”);
grunt.loadNpmTasks(“grunt-contrib-less”);
grunt.loadNpmTasks(“grunt-contrib-clean”);
grunt.loadNpmTasks(“grunt-contrib-concat”);
grunt.loadNpmTasks(“grunt-contrib-uglify”);
grunt.loadNpmTasks('grunt-contrib-copy');
grunt.config('less',less);
grunt.config('watch',watch);
//注册任务
registerTask('default',任务到监视);
registerTask('build',['clean:build','less:build','concat:build','uglify:build','copy:build']);
};
问题在第104行、第105行和第116行,您在路径_dev
之后错过了加号+
:
less['build']['files'][path_live+'/css/global.css'] = path_dev+'/less/main.less';
请修复其他文件。您可以发布GrunFile吗?也可以尝试grunt--debug watch
谢谢您的帮助。我在上面添加了Gruntfile.js。运行grunt--debug watch
没有任何作用,不幸的是…谢谢Michelem,修复了它!好眼力。作为将来的参考,有没有办法让Grunt输出上发生的行号错误?我的Grunt告诉我