Gruntjs 使用外部配置通过同一构建过程构建多个输出

Gruntjs 使用外部配置通过同一构建过程构建多个输出,gruntjs,Gruntjs,我正试图利用GruntJS创建一个构建过程,该过程在我公司的多个团队和项目中是统一的。我们的想法是,我们为每个应用程序都有一个配置文件,它只指定需要处理的文件以及它们最后需要连接到的包。所有应用程序的构建过程都是相同的:选择应用程序的配置,使用统一的构建过程处理每个捆绑包中的文件 例如: asset.json配置文件指定了两个捆绑包,“main”与1.js+2.js,以及“secondary”与2.js和3.js 构建过程表示对每个bundle进行预处理、缩小,然后基于bundle连接到一个js

我正试图利用GruntJS创建一个构建过程,该过程在我公司的多个团队和项目中是统一的。我们的想法是,我们为每个应用程序都有一个配置文件,它只指定需要处理的文件以及它们最后需要连接到的包。所有应用程序的构建过程都是相同的:选择应用程序的配置,使用统一的构建过程处理每个捆绑包中的文件

例如:

  • asset.json配置文件指定了两个捆绑包,“main”与1.js+2.js,以及“secondary”与2.js和3.js
  • 构建过程表示对每个bundle进行预处理、缩小,然后基于bundle连接到一个js文件中
  • 获取“main.js”和“secondary.js”的输出
  • 我遇到的问题是Grunt采用“静态”配置并执行它。我已经对配置的构建进行了抽象,以便可以动态添加块,但现在我看不到比在每个包上循环并为每个包的构建过程的每个部分构建一个唯一的任务、构建要执行的任务队列更好的方法,然后在构建过程中运行队列中的每个任务。这当然是可能的,但它需要大量的手工工作,而且似乎容易损坏。当我在捆绑包上循环时,是否有办法按顺序执行每个任务?有没有更好的方法来实现相同的净结果


    我想澄清的是,我完全知道Grunt可以构建多个文件。我试图做的是将多少捆绑包的规范与构建步骤本身分开。Grunt core必须将这两件事结合在一起,这意味着每个项目都必须进入并修改它们的构建步骤,而不是外部配置。根据上面的示例,我应该能够将步骤1中指定的asset.json文件替换为任何具有1、2、3、。。。N个捆绑包,每个捆绑包中包含N个文件(并可能指定脚本或样式之类的“类型”)

    编辑10/12/13:昨天发布的细节可能是解决问题的另一种方法


    这可以通过将要构建的模块名作为命令行参数传递并加载到grunt配置中的整个资产文件中来实现。请注意,这是示例代码,我没有测试过,所以您可能需要为您的情况设置正确的路径等

    首先,将
    assets.json
    文件更新为普通JavaScript文件,然后将其进行如下改造:

    module.exports = {
        main: ["1.js", "2.js"],
        secondary: ["2.js","3.js"]
    }
    
    接下来,您可以将命令行参数传递给Grunt,Grunt应该在assets.js中指定一个模块名。例如:

    grunt --bundle=main
    
    现在,您需要在GrunFile中加载
    assets.js
    文件:

    var assets = require('./assets'); // assuming assets.js is on the same level as your Gruntfile
    
    然后您可以使用以下命令获取参数名称:

    var bundle = grunt.option("bundle");
    

    现在,您可以使用
    bundle
    作为输出文件名,并使用
    assets.bundle
    获取该bundle的数组文件。

    Anzeo,感谢这里的想法,但这并不是我真正遇到的问题;我需要维护多个配置(针对不同的项目),每个配置包含一个或多个要处理和打包的文件包。开发人员不需要指定要构建的特定捆绑包;这对于目录观察者和其他我们需要的东西来说是不好用的。我对每个项目都有一个单独的资产文件(JSON或JS)感到满意,但如何让每个资产文件都有多个按顺序构建的捆绑包是一个问题。。。“文件”选项可以获取生成文件的对象。。。动态地建立那个列表可能没那么糟糕。@JonHartmann好吧,我当时不明白你真正的问题。如果你提出了一个解决方案作为你自己问题的答案,一定要发布一个解决方案。同时,我会看看我是否能想出一个正确的答案:)谢谢你的关注。。。最终,虽然我分解并编写了补充模块,将基本配置处理为最终的“静态”配置,但它会根据需要为该操作写出。它很笨重,但我最终决定,任何其他事情都需要深入研究格朗特的死刑。谢谢你抽出时间来反驳我。如果我遇到合适的解决方案,我会记得把它贴在这里。