【问题标题】:Grunt useminPrepare and usemin not working with multiple tasks and files (concat fails)Grunt useminPrepare 和 usemin 不能处理多个任务和文件(concat 失败)
【发布时间】:2016-08-01 10:37:39
【问题描述】:

我希望我的项目中有两个目标。一个用于管理员页面,一个用于用户页面。出于性能原因,我不希望将管理插件包含在用户页面中。但是,在尝试运行构建时出现此错误:

Running "useminPrepare:admin" (useminPrepare) task
Configuration changed for concat, uglify, cssmin

Running "useminPrepare:user" (useminPrepare) task
Configuration changed for concat, uglify, cssmin

No "concat" targets found.
Warning: Task "concat" failed. Use --force to continue.

我在 GruntFile.js 中找不到 concat 任务来查看问题所在。我的 GruntFile.js usemin 任务如下:

    useminPrepare: {
        admin: {
            html: 'app/admin-index.html',
            options: {
                dest: 'dist'
            }
        },
        user: {
            html: 'app/index.html',
            options: {
                dest: 'dist'
            }
        },
    },
    usemin: {
        admin: {
            html: 'dist/admin-index.html'
        },
        user: {
            html: 'dist/index.html'
        }
    }

grunt.registerTask('build', [
    'clean:dist',
    'less',
    'useminPrepare:admin',
    'useminPrepare:user',
    'concat',
    'copy:dist',
    'cssmin',
    'uglify',
    'filerev',
    'usemin:admin',
    'usemin:user',
    'htmlmin'
]);

html 对应的 js 文件如下所示。首先是admin-index.html:

<!-- build:js(.) scripts/vendor.js -->

<!-- jQuery and Bootstrap -->
<script src="bower_components/jquery/dist/jquery.min.js"></script>
<script src="bower_components/bootstrap/dist/js/bootstrap.min.js"></script>

<!-- MetsiMenu -->
<script src="bower_components/metisMenu/dist/metisMenu.min.js"></script>

<!-- Peace JS -->
<script src="bower_components/pace/pace.min.js"></script>

<!-- Angular scripts-->
<script src="bower_components/angular/angular.min.js"></script>
<script src="bower_components/angular-ui-router/release/angular-ui-router.min.js"></script>
<script src="bower_components/angular-bootstrap/ui-bootstrap-tpls.min.js"></script>

<!-- Angular Dependiences -->
<!--                      -->
<!--                      -->
<!--                      -->

<!-- Datatables -->
<script src="bower_components/datatables.net/js/jquery.dataTables.min.js"></script>
<script src="bower_components/datatables.net-bs/js/dataTables.bootstrap.min.js"></script>
<script src="bower_components/datatables.net-buttons/js/dataTables.buttons.min.js"></script>
<script src="bower_components/jszip/dist/jszip.min.js"></script>
<script src="bower_components/pdfmake/build/pdfmake.min.js"></script>
<script src="bower_components/pdfmake/build/vfs_fonts.js"></script>
<script src="bower_components/datatables.net-buttons/js/buttons.html5.min.js"></script>
<script src="bower_components/datatables.net-buttons/js/buttons.print.min.js"></script>
<script src="bower_components/datatables.net-buttons/js/buttons.colVis.min.js"></script>

<!-- Datepicker -->
<script src="bower_components/bootstrap-datepicker/dist/js/bootstrap-datepicker.min.js"></script>
<script src="bower_components/bootstrap-datepicker/dist/locales/bootstrap-datepicker.tr.min.js"></script>
<script src="bower_components/datepair.js/dist/datepair.js"></script>

<!-- Timepicker -->
<script src="bower_components/jt.timepicker/jquery.timepicker.js"></script>

<!-- endbuild -->

<!-- build:js({.tmp,app}) scripts/scripts.js -->
<!-- Custom and plugin javascript -->
<script src="scripts/inspinia.js"></script>

<!-- Anglar App Script -->
<script src="scripts/app.js"></script>
<script src="scripts/config.js"></script>
<script src="scripts/directives.js"></script>
<script src="scripts/controllers.js"></script>
<!-- endbuild -->

现在是 index.html 文件:

<!-- build:js(.) scripts/uivendor.js -->

<!-- jQuery and Bootstrap -->
<script src="bower_components/jquery/dist/jquery.min.js"></script>
<script src="bower_components/bootstrap/dist/js/bootstrap.min.js"></script>

<!-- Datepicker -->
<script src="bower_components/bootstrap-datepicker/dist/js/bootstrap-datepicker.min.js"></script>
<script src="bower_components/bootstrap-datepicker/dist/locales/bootstrap-datepicker.tr.min.js"></script>

<!-- endbuild -->

【问题讨论】:

    标签: javascript gruntjs grunt-usemin grunt-contrib-concat


    【解决方案1】:

    也许您在 Gruntfile.js 的 initConfig 设置中没有上述 concat 参数,但在“BUILD”命令中设置了它。 Grunt 不知道那个 concat 字符串与什么相关,所以它会抛出一个错误

    尝试像下面这样删除“concat”

    grunt.registerTask('build', [
       'clean:dist',
       'less',
       'useminPrepare:admin',
       'useminPrepare:user',
       'copy:dist',
       'cssmin',
       'uglify',
       'filerev',
       'usemin:admin',
       'usemin:user',
       'htmlmin'
    ]);
    

    或在您的配置设置中添加一个 concat 键示例如下

      concat: {
        options: {
          separator: ';',
        },
        dist: {
          src: ['src/file1.js', 'src/file2.js', 'src/file3.js'],
          dest: 'dist/concat-file.js',
        },
       },
    

    【讨论】:

    • 当我删除 grunt.registerTask 中的 concat 任务时,它现在对 cssmin 任务产生相同的错误。我猜这些任务不适用于多个 usemin 目标,并且必须像您在第二个选项中提到的那样显式配置。但我找到了更好的解决方案。我只是合并了 usemin 任务并使用了文件数组。现在构建正在做我想要的。看看我下面的答案。
    • 是的,您可以使用文件数组作为源文件。感谢您对巴里斯的评论。
    【解决方案2】:

    合并这两个任务为我解决了这个问题。虽然像 Vijay 建议的那样明确声明 concat、cssmin、uglify 等任务也是一种选择,但这太麻烦了。我将 GruntFile.js 更改如下:

        useminPrepare: {
            html: ['app/admin-index.html', 'app/index.html'],
            options: {
                dest: 'dist'
            }
        },
        usemin: {
            html: ['dist/admin-index.html', 'dist/index.html'],
        }
    
    grunt.registerTask('build', [
        'clean:dist',
        'less',
        'useminPrepare',
        'concat',
        'copy:dist',
        'cssmin',
        'uglify',
        'filerev',
        'usemin',
        'htmlmin'
    ]);
    

    【讨论】:

      猜你喜欢
      • 2017-08-07
      • 2013-12-29
      • 2023-03-26
      • 2018-11-27
      • 1970-01-01
      • 1970-01-01
      • 2013-12-28
      • 2017-05-12
      • 1970-01-01
      相关资源
      最近更新 更多