Jenkins和MSBuild不会构建包含相同dll的多个版本的WiX .msi

时间:2016-10-12 20:53:33

标签: jenkins msbuild wix

背景

我有一个Jenkins进程,我在其中构建Windows服务,然后使用MSBuild从WiX项目编译.msi。服务本身根据其运行的配置执行不同的处理,此配置由通过app.config分配给服务的编号确定。因此,例如,FooService1处理某些记录,FooService2其他记录等。不同的版本运行完全相同的编译dll,唯一的区别是app.config中分配的服务器编号。

我将在同一台机器上运行相同服务的这些不同版本,并希望通过Jenkins自动生成服务的不同版本的构建过程。我正在使用powershell脚本在app.config中分配服务号,然后通过MSBuild传递该服务号并使用WiX变量修改Windows服务的名称以及服务运行的文件夹的名称。

问题/问题

所以.wixproj的第一个MSBuild就可以了。但接下来的MSBuild会报告它是

  

跳过目标"编译"因为所有输出文件都是与输入文件相关的最新文件

有没有办法去假装" MSBuild认为它应该再次编译.wixproj?我的最终目标是,如果我想要3个版本的服务,Jenkins将编译解决方案一次,然后构建WiX项目3次,从而产生包含FooService1.msi,FooService2.msi和FooService3.msi的/ bin。每个安装程序都包含相同的dll,但app.config会有所不同。

1 个答案:

答案 0 :(得分:1)

构建服务和MSI一次,在安装时转换配置。

在MSI中捆绑多个配置文件,并在部署时覆盖,如this answer。或者在安装时传递所需的值,并使用属性和XML转换来更新文件。为单个配置值构建多个MSI是过度的。

要在安装时传递值,您可以执行类似这样的操作

假设您在应用设置部分中有值

<appSettings>
    <add key="ServiceType" value="1" />
</appSettings>

添加wixUtil库

<Wix
    xmlns="http://schemas.microsoft.com/wix/2006/wi"
    xmlns:util="http://schemas.microsoft.com/wix/UtilExtension">

在Wix的Product元素中添加一个属性元素

<Property Id="SERVICETYPE" Value="25"/>

请注意,属性Id应为大写(这会使属性公开)

然后在您的产品元素中添加

<util:XmlFile
    Id="UpdateServiceType"
    Action="setValue"
    File="[INSTALLFOLDER]MyService.exe.config"
    SelectionLanguage="XPath"
    Permanent="yes"
    ElementPath="/configuration/appSettings/add[\[]@key='ServiceType'[\] ]/@value"
    Value="[SERVICETYPE]" />

然后您可以在安装时传入SERVICETYPE,即。

MyMSI.msi SERVICETYPE=2