Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/431.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript Grunt:获取错误的行号_Javascript_Node.js_Gruntjs - Fatal编程技术网

Javascript Grunt:获取错误的行号

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. 我真的很想知道那个意外的字符串在哪一行,但我

我正在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--stack
时,它会显示节点文件的整个node.js堆栈跟踪,但不会显示Gruntfile.js中的错误源

添加
grunt.option('stack',true)没有任何效果

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告诉我