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

Posted

技术标签:

【中文标题】Jenkins 和 MSBuild 不会构建包含相同 dll 的多个版本的 WiX .msi【英文标题】:Jenkins and MSBuild won't build mutliple versions of WiX .msi that contain the same dlls 【发布时间】:2016-10-12 20:53:32 【问题描述】:

背景

我有一个 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】:

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

在 MSI 中捆绑多个配置文件并在部署时覆盖,如this 答案。或者在安装时传入所需的值并使用属性和 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

【讨论】:

我喜欢这是一种更简洁、更独立的方式来修改配置文件。但这似乎并没有解决需要在同一台机器上运行同一服务的多个版本的问题。我需要能够为每种服务类型提供单独的服务。所以最后我可以检查那台机器的进程管理器并查看 FooService1、FooService2 等。这就是为什么我试图生成多个包含相同 dll 的安装程序。 您也可以使用相同的技术为服务名称添加属性。应该更容易,因为您不需要 xslt。 哦,太好了!因此,我可以一举更改服务名称和服务运行的目录。这让生活更轻松。 是的,自从我搞砸了 MSI 已经有一段时间了,但是您应该能够在不更改 wix 的情况下传递安装目录。见this答案

以上是关于Jenkins 和 MSBuild 不会构建包含相同 dll 的多个版本的 WiX .msi的主要内容,如果未能解决你的问题,请参考以下文章

持续集成~Jenkins里的NuGet和MSBuild插件

Sonarscanner MSBuild 工具未在管道中运行 - Jenkins

Jenkins结合.net平台工具之Msbuild

Jenkins构建常见问题

Jenkins结合.net平台工具之Nuget

UWP Jenkins + NuGet + MSBuild 手把手教你做自动UWP Build 和 App store包