0

我想为我的 nsis Windows 安装程序使用 pom.xml 中版本字段的值。为此,我使用nsis-maven-plugin生成一个target/project.nsh(将包含一个适当的PROJECT_VERSION字段),然后!include进入我的setup.nsi.

这就是问题所在:假设我的 pomproject.version是 1.2-SNAPSHOT。makensis将因错误而失败:

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

所以我有两个问题:

  1. “-SNAPSHOT”字符串

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

  2. 我的版本看起来像 XX,但必须是 XXXX

    VIProductVersion ${PROJECT_VERSION}.0.0一旦我将我的 pom 更改project.version为 1.2.1 ,用两个零(例如)硬填充字段就会中断

有什么好的策略吗?

4

2 回答 2

1

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

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

于 2013-02-23T02:42:28.227 回答
0

我有同样的问题。由于我在项目中使用了copy-maven-problem,因此我还使用它来project.nsh处理 Groovy 代码段:

<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.

我知道这看起来像 q bad hack,但它现在有效。我希望将来会有插件生成的变量..

PS:在打包阶段调用 nsis-maven-plugin 之前的 copy-maven-plugin 以使其工作。我在 nsis 插件之前定义了 copy 插件——它.nsh是在 prepare-package 阶段生成的,所以它在处理之前就存在了。

于 2014-04-02T15:46:15.697 回答