Node.js 获取错误消息";否";concat“;“找到目标”;运行grunt usemin时

Node.js 获取错误消息";否";concat“;“找到目标”;运行grunt usemin时,node.js,debugging,gruntjs,bower,filepath,Node.js,Debugging,Gruntjs,Bower,Filepath,我的grunt文件如下所示: module.exports = function(grunt) { // Project configuration. grunt.initConfig({ pkg: grunt.file.readJSON('package.json'), uglify: { options: { banner: '/*! <%= pkg.name %> <

我的grunt文件如下所示:

module.exports = function(grunt) {

    // Project configuration.
    grunt.initConfig({
        pkg: grunt.file.readJSON('package.json'),
        uglify: {
            options: {
                banner: '/*! <%= pkg.name %> <%= grunt.template.today("yyyy-mm-dd") %> */\n'
            },
            build: {
                src: 'src/**/*.js',
                dest: 'dist/<%= pkg.name %>.min.js'
            }
        },
        watch: {
            js: {
                files: ['src/**/*.js'],
                options: {
                    livereload: '<%= connect.options.livereload %>'
                }
            },
            livereload: {
                options: {
                    livereload: '<%= connect.options.livereload %>'
                },
                files: [
                    'src/**/*.html',
                    'src/**/*.css',
                    'src/assets/images/{,*/}*.{png,jpg,jpeg,gif,webp,svg}'
                ]
            }
        },
        connect: {
            options: {
                port: 9000,
                livereload: 35729,
                hostname: 'localhost'
            },
            livereload: {
                options: {
                    open: true,
                    // base: [
                    //     '.tmp',
                    //     ''
                    // ]
                    middleware: function(connect) {
                        return [
                            connect.static('.tmp'),
                            connect().use(
                                '/bower_components',
                                connect.static('./bower_components')
                            ),
                            connect().use(
                                '/app/styles',
                                connect.static('./app/styles')
                            ),
                            connect.static('src')
                        ];
                    }
                }
            }
        },
        copy: {
            app: {
                cwd: 'src', // set working folder / root to copy
                src: '**/*.html', // copy all files and subfolders
                dest: 'dist/', // destination folder
                expand: true
            },
            assets: {
                cwd: 'src', // set working folder / root to copy
                src: 'assets/*', // copy all files and subfolders
                dest: 'dist/', // destination folder
                expand: true
            }
        },
        useminPrepare: {
            options: {
                dest: 'dist'
            },
            html: 'src/index.html'
        },

        usemin: {
            html: ['dist/index.html']
        }

    });

    // Load the plugin that provides the "uglify" task.
    // grunt.loadNpmTasks('grunt-contrib-uglify');
    grunt.loadNpmTasks('grunt-contrib-connect');
    grunt.loadNpmTasks('grunt-contrib-watch');
    grunt.loadNpmTasks('grunt-contrib-uglify');
    grunt.loadNpmTasks('grunt-contrib-copy');
    grunt.loadNpmTasks('grunt-contrib-concat');
    grunt.loadNpmTasks('grunt-usemin');

    // Default task(s).
    grunt.registerTask('default', ['useminPrepare', 'copy', 'concat', 'uglify', 'usemin']);
    grunt.registerTask('serve', function(target) {
        grunt.task.run([
            'connect:livereload',
            'watch'
        ]);
    });

};
module.exports=函数(grunt){
//项目配置。
grunt.initConfig({
pkg:grunt.file.readJSON('package.json'),
丑陋的:{
选项:{
横幅:'/*!*/\n'
},
建造:{
src:'src/***.js',
dest:'dist/.min.js'
}
},
观察:{
js:{
文件:['src/**/*.js'],
选项:{
livereload:'
}
},
利弗雷罗德:{
选项:{
livereload:'
},
档案:[
“src/***.html”,
“src/***.css”,
'src/assets/images/{,*/}{png,jpg,jpeg,gif,webp,svg}'
]
}
},
连接:{
选项:{
港口:9000,
利弗雷罗德:35729,
主机名:“localhost”
},
利弗雷罗德:{
选项:{
开放:是的,
//基数:[
//“.tmp”,
//     ''
// ]
中间件:功能(连接){
返回[
connect.static('.tmp'),
连接()。使用(
“/bower_组件”,
连接.静态(“./bower_组件”)
),
连接()。使用(
“/app/styles”,
connect.static(“./app/styles”)
),
connect.static('src')
];
}
}
}
},
副本:{
应用程序:{
cwd:'src',//将工作文件夹/根目录设置为复制
src:'***.html',//复制所有文件和子文件夹
dest:'dist/',//目标文件夹
扩展:正确
},
资产:{
cwd:'src',//将工作文件夹/根目录设置为复制
src:'assets/*',//复制所有文件和子文件夹
dest:'dist/',//目标文件夹
扩展:正确
}
},
使用准备:{
选项:{
目的地:“距离”
},
html:'src/index.html'
},
usemin:{
html:['dist/index.html']
}
});
//加载提供“丑”任务的插件。
//grunt.loadNpmTasks(“grunt-contrib-uglify”);
grunt.loadNpmTasks('grunt-contrib-connect');
grunt.loadNpmTasks(“grunt-contrib-watch”);
grunt.loadNpmTasks(“grunt-contrib-uglify”);
grunt.loadNpmTasks('grunt-contrib-copy');
grunt.loadNpmTasks(“grunt-contrib-concat”);
grunt.loadNpmTasks('grunt-usemin');
//默认任务。
registerTask('default',['useminPrepare','copy','concat','uglify','usemin']);
grunt.registerTask('serve',函数(目标){
grunt.task.run([
'连接:livereload',
“注意”
]);
});
};
当我运行grunt时,获取错误消息为“No”concat“targets found”。
我已经尝试了2个小时来解决这个问题,但没有结果,请帮助我找到解决方案。

太晚了,但只是为了防止它对其他人有用:我相信useminprepare将自动生成concat配置并将其提供给grunt任务运行程序,所以我认为上面的回答不太准确

我将尝试查看src/index.html中的构建块,并检查路径是否正确指向useminPrepare将连接的资源。我现在正与这样一个问题作斗争:S


此处参考:

使用以下过程进行调试:

  • 运行

  • 指定
    temp
    存储位置(
    temp
    staging
    )目录

  • 在运行
    usemin
    之前,确保
    temp
    staging
    目录不为空

  • 如果为空,则运行
    grunt copy
    任务,该任务将
    temp
    staging
    目录设置为
    dest
    参数

关于目录和任务,需要记住的主要区别是,对于
useminPrepare
,目录需要指示为处理器管道输出正确配置所需的输入、瞬态和输出路径,而对于
usemin
,目录只反映输出路径,因为所有需要的资产都应该输出到目标目录(转换或刚刚复制)

参考资料


这是唯一指向正确方向的答案!