背景
我有一个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会有所不同。
答案 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