6

我们使用frontend-maven-plugin在构建中使用 grunt 和 bower。使用前端 Maven 插件,我可以在本地安装 NPM,使用 Bower 下载 Java 库,并运行 Grunt 来优化和混淆我的代码。

像这样进行一些简化:

<plugin>
  <groupId>com.github.eirslett</groupId>
  <artifactId>frontend-maven-plugin</artifactId>
  <version>0.0.24</version>
  <executions>
    <execution>
      <id>install node and npm</id>
      <goals> <goal>install-node-and-npm</goal> </goals>
      ...
    </execution>
    <execution>
      <id>npm-install</id>
      <goals> <goal>npm</goal> </goals>
      ...
    </execution>
    <execution>
      <id>bower-install</id>
      <goals> <goal>bower</goal> </goals>
      ...
    </execution>
    <execution>
      <id>grunt-build</id>
      <goals> <goal>grunt</goal> </goals>
      ...
    </execution>
  </executions>
</plugin>

请注意,最后一次执行是 grunt-build,这是将 JavaScript 文件连接在一起、优化(删除返回、注释和其他内容)和混淆的地方。

这适用于发布。但是,开发人员希望在不连接、优化和混淆 JavaScript 文件的情况下部署战争。这将帮助他们进行调试。为此,我们只需grunt-build从该插件的配置中删除执行部分。

我想使用配置文件来做到这一点。我可以有一个名为的配置文件development,允许开发人员在没有最后一部分的情况下进行构建。我可以简单地复制并粘贴文件的这一部分pom.xml,删除最后一次执行,并将其放入单独的配置文件中。全部完成。

但是,有一句古老的编程格言:不要重复自己。我会在我的pom.xml.

我想做的是有办法执行前三个执行,只有在这不是开发构建时才执行第四个。我也会在这方面做一些其他的小动作。例如,我将不得不复制 JavaScript 本身而不是咕哝的结果。但是,这很容易做到并且不会重复代码。

这会导致重复代码,因为我必须frontend-maven-plugin使用两个配置来定义。一次用于development配置文件,一次用于标准版本构建。据我所知,我不能说,运行这个配置frontend-maven-plugin,如果这不是一个开发版本,运行这个实例,frontend-maven-plugin它只会做咕噜咕噜的东西。

有没有办法在 中定义相同的插件两次pom.xm,并让 Maven 以正确的顺序运行两个实例?

4

2 回答 2

4

让我从Maven 论坛中引用:

我的收获是,如果一个人只是跳上配置文件作为每种条件情况的解决方案,那么构建将像一部糟糕的恐怖电影中的九头蛇一样长出第二个脑袋,你会真的后悔的。

关键是配置文件通常是正确使用 Maven 的权宜之计。除非您知道自己要做什么,否则它们应始终被视为“最后的手段”。

在我的情况下,[...]。配置文件对此非常有用,但我现在可以确切地看到九头蛇头适合野兽的位置,除非绝对必要,否则不打算对它们做更多的事情。

我已经有了个人资料的经验。我赞同这个观点。

Maven 的 POM 具有声明性。这意味着您无需定义在构建期间要做什么,而是声明项目外观(通过项目对象模型)。有了这个,Maven 就知道在构建过程中该做什么以及何时该做。通过使用 XML,它也是严格的自上而下的分层结构。与程序或脚本构建定义(注意声明定义)相比,我认为所有这些都是一个很大的优势(不是唯一的,还有更多)) 与 Ant 或 Gradle 一样。使用 Maven 配置文件,您可以从“侧面”向这个(分层的)声明“注入”一些东西。当然,你可以这样做,但你必须知道你在做什么,并且在你这样做之前你应该彻底考虑过。

从概念的角度来看,您有两个项目有大部分共同点。这就是 Maven 的 POM 层次结构及其继承发挥作用的地方:

product ... parent for all projects below
  +- pom.xml ... contains build steps (apart from Grunt) and all other declarations 
  +- dev
  |    +- pom.xml ... almost empty since everything's inherited from parent
  |    +- ... sources, resources, etc. ...
  +- release
       +- pom.xml ... contains Grunt build step only, everything else's inherited from parent
                      and redirects all of <build>
                          <outputDirectory> <testOutputDirectory>
                          <sourceDirectory> <scriptSourceDirectory> <testSourceDirectory>
                          <resources> <testResources>
                      to ../dev/<all of the dirs above>

有关要重定向的所有构建目录,请参阅POM 参考的 BaseBuild 元素集资源构建元素集。

请参阅Maven 包含另一个用于插件配置的 pom

唯一正确的答案是使用继承。

我也赞同这一点。

不过,如果您选择配置文件,我建议您调用它dev而不是development. 您的开发人员将永远感激不尽。:)

于 2015-10-22T22:10:34.347 回答
3

你很幸运,该grunt插件的目标定义了一个skip属性,所以你只需要true在你的自定义配置文件中设置这个属性。

因此,您需要创建development将自定义属性设置为skipGrunttrue配置文件和将其设置为的默认配置文件false

然后,在grunt目标的插件配置中,可以添加

<configuration>
    <skip>${skipGrunt}</skip>
    <!-- rest of configuration -->
</configuration>

这句话可以更笼统地说:当您需要跳过插件的特定执行时,通常有一个自定义skip属性可以设置为true.

于 2015-10-22T19:36:19.537 回答