3

我正在使用 rpm-maven-plugin 构建三个软件包。一个父级和两个需要相同版本的父级的插件。一切正常,直到我用XY-SNAPSHOT版本构建它。然后我的 rpm 版本被截断为XY部分,但值${project.version}仍然是 XY-SNAPSHOT。它导致插件需要XY-SNAPSHOT父版本,而我已经安装了XY版本。

我想知道我是否可以在“要求”部分使用“截断”版本或强制插件截断我的版本......

这是我的配置:

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>rpm-maven-plugin</artifactId>
    <version>2.0.1</version>
    <executions>
        <execution>
            <id>parent-package</id>
            <goals>
                <goal>rpm</goal>
            </goals>
            <configuration>
                <name>parent-package</name>
                <mappings>
                    (...)
                </mappings>
            </configuration>
        </execution>
        <execution>
            <id>first-plugin</id>
            <goals>
                <goal>rpm</goal>
            </goals>
            <configuration>
                <name>first-plugin</name>
                <mappings>
                    (...)
                </mappings>
                <requires>
                    <require>parent-package = ${project.version}</require>
                </requires>
            </configuration>
        </execution>
        <execution>
            <id>second-plugin</id>
            <goals>
                <goal>rpm</goal>
            </goals>
            <configuration>
                <name>second-plugin</name>
                <mappings>
                    (...)
                </mappings>
                <requires>
                    <require>parent-package = ${project.version}</require>
                </requires>
            </configuration>
        </execution>
    </executions>
</plugin>
4

2 回答 2

6

RPM 规范将 a-视为特殊字符。看看这是我在谷歌能找到的最好的

The version number is used in version comparisons. The RPM comparison algorithm 
is fairly complex, but can get fooled by strange version numbers. So, your best 
bet is to stick to dotted numerics, such as 1.5 or 2.3.1.1.4 or 1.0. Version 
numbers such as these will compare best from within the RPM system. For example:
    Version: 1.1.2
You cannot use a dash in the version number, as RPM uses the dash to separate 
the Name-Version-Release elements. 

因此,诸如 Maven 版本之类的1.0-SNAPSHOT将不是有效的 RPM 版本号。

Mojo 的 RPM Maven 插件对版本号进行了一些转换以“帮助”您。具体来说,它会-SNAPSHOT像您发现的那样去除,如果有,-SNAPSHOT它将 rpm 版本设置为SNAPSHOTyyyymmddHHMMSS(请注意,该版本用于区分同一 RPM 版本的两个不同版本)

您需要做的是将一些属性设置为转换后的版本。有很多方法可以做到这一点。正如我在评论中建议的那样,您可以使用它build-helper:regex-property来转换属性。这种方法的缺点是,如果 RPM 插件修改了它用于版本转换的规则,您的正则表达式可能会使您不同步。

正确的解决方案是使用rpm:version目标rpm.version为您设置属性,因此您的配置变为:

<plugin>
    <groupId>org.codehaus.mojo</groupId>
    <artifactId>rpm-maven-plugin</artifactId>
    <version>2.0.1</version>
    <executions>
        <execution>
            <id>properties</id>
            <goals>
                <goal>version</goal>
            </goals>
        </execution>
        <execution>
            <id>parent-package</id>
            <goals>
                <goal>rpm</goal>
            </goals>
            <configuration>
                <name>parent-package</name>
                <mappings>
                    (...)
                </mappings>
            </configuration>
        </execution>
        <execution>
            <id>first-plugin</id>
            <goals>
                <goal>rpm</goal>
            </goals>
            <configuration>
                <name>first-plugin</name>
                <mappings>
                    (...)
                </mappings>
                <requires>
                    <require>parent-package = ${rpm.version}</require>
                </requires>
            </configuration>
        </execution>
        <execution>
            <id>second-plugin</id>
            <goals>
                <goal>rpm</goal>
            </goals>
            <configuration>
                <name>second-plugin</name>
                <mappings>
                    (...)
                </mappings>
                <requires>
                    <require>parent-package = ${rpm.version}</require>
                </requires>
            </configuration>
        </execution>
    </executions>
</plugin>

如果您需要属性具有不同的名称,只需使用versionProperty配置参数,但请记住,对于多次执行,您可能希望将其保留为默认值

于 2012-09-18T14:23:07.347 回答
1

为了扩展@StephenConnolly 的出色答案,mavenrpm版本控制策略有一些特定的差异。差异主要在于 maven 的版本限定符和 rpm 的构建(或发布)属性。

Maven 将任何没有限定符的版本视为比没有限定符的版本更新。Maven 还对任何以 SNAPSHOT 结尾的限定符进行特殊处理。另一方面,RPM 需要一个内部版本号并比较该值。毫不奇怪,rpm 对 SNAPSHOT 没有特殊的逻辑。

由于我们在 maven 中工作,我们需要遵循 maven 的规则/行为并确定如何在 rpm 中按摩值以使其工作。这意味着我们需要建立规则来按摩 rpm 释放值,以基于 maven 限定符实现以下目标:

  • 1.0-alpha-1-SNAPSHOT
  • 1.0-alpha-1
  • 1.0-alpha-2
  • 1.0-beta-1
  • 1.0-快照
  • 1.0

此外,我们希望 rpm 的多个 SNAPSHOT 构建能够识别更新(按构建日期)并正确升级。

release 属性的文档描述了实现此所需行为的规则。

欢迎您覆盖此默认行为,但我提醒您要非常小心,确保使用相同元数据(arch、os、version、release)构建的 rpm 包含相同的内容。

于 2015-01-02T15:14:01.990 回答