使用nsis-maven-plugin填充VIProductVersion

时间:2013-02-22 20:09:38

标签: maven nsis

我想在我的pom.xml中使用我的nsis Windows安装程序中的version字段的值。为此,我使用nsis-maven-plugin生成target/project.nsh(其中包含相应的PROJECT_VERSION字段),然后!include进入setup.nsi。< / p>

问题在于:假设我的pom project.version是1.2-SNAPSHOT。 makensis将失败并显示错误:

[MAKENSIS] Error: invalid VIProductVersion format, should be X.X.X.X

所以我有两个问题:

  1. “-SNAPSHOT”字符串

    我可以在设置VIProductVersion字段之前将其删除,但是当我的版本没有时,我的版本会显示为1.2。

  2. 我的版本看起来像X.X,但需要是X.X.X.X

    只要我将pom VIProductVersion ${PROJECT_VERSION}.0.0更改为1.2.1

  3. ,只需用两个零(例如project.version)填充字段就会中断

    这有一个好的策略吗?

2 个答案:

答案 0 :(得分:1)

我对maven一无所知,但我可以告诉你为什么NSIS会像这样工作。

您可以使用VIAddVersionKey添加所需的任何字符串(包括“ProductVersion”)。 VIProductVersion设置win32 / PE版本资源的fixed (VS_FIXEDFILEINFO)部分,这就是为什么它必须包含4个16位数字...

答案 1 :(得分:0)

我遇到了完全相同的问题。 由于我在项目中使用copy-maven-problem,因此我还使用它来使用Groovy代码段进行project.nsh

<resource>
    <targetPath>${project.build.directory}</targetPath>
    <file>${project.build.directory}/installer-header.nsh</file>
    <destFileName>installer-header-processed.nsh</destFileName>
    <!-- groovy extension point -->
    <process>{{ 
            def versionsList = project.version.replaceFirst("-SNAPSHOT", "").tokenize('.')
            while(!(versionsList.size >= 4)){
                versionsList.add('0')
            }
            files[0].append("!define VI_PRODUCT_VERSION \"" + versionsList.join('.') + "\"\n")
        }}</process>
</resource>
<resource>
    <targetPath>${project.build.directory}</targetPath>
    <file>${project.build.directory}/installer-header-processed.nsh</file>
    <destFileName>installer-header.nsh</destFileName>
    <move>true</move>
</resource>

检查此插件的文档并调整变量/文件名(即我调用头文件installer-header.nsh

在此之后,您可以在标题中添加变量VI_PRODUCT_VERSION(根据需要重命名),您可以在setup.nsi中使用。

我知道这看起来像是糟糕的黑客,但它现在有效。我希望将来会有插件生成的变量..

PS:在包装阶段调用copy-maven-plugin BEFORE nsis-maven-plugin,以使其正常工作。我在nsis插件之前定义了复制插件 - 在准备包阶段生成.nsh,因此它在处理之前就存在了。