WIX MSBuild自动化帮助 - 解决方案最佳实践

时间:2009-07-24 20:41:29

标签: msbuild wix build-automation votive

我知道有很多关于同样信息的问题。我已经读完了所有内容,但是我的大脑全都转过身来,我不知道要走哪条路。再加上缺乏文档真的很痛苦。

这是我的场景。我们正在尝试使用WIX为我们的应用程序创建一个安装程序,以便我们的产品信息向我们的经销商发送。该应用程序包括大约2000个我们产品的图像和文档以及通过Microsoft Sync Framework更新的SQL CE数据库。数据经常变化,将这些2000作为内容文件保存在应用程序的项目中是非常不受欢迎的。该应用程序依赖于.NET Framework 3.5 SP1,SQL Server CE 3.5,Microsoft Sync Framework 1.0和ADO.NET Sync Services 2.0。

以下是该应用的要求:

  • 经销商将每年在CD上获得应用程序以进行任何更新(应用程序或数据更新)。
  • 应用必须从互联网上更新,以获取任何新的图像,文档或数据。
  • 如果客户端计算机上不存在先决条件,则必须安装先决条件。
  • 应该使用尽可能少的人工交互从MSBuild脚本生成完整的安装程序(我们不希望手动更新2000+文件列表)。

到目前为止我们所取得的成就是我们的解决方案中有一个Votive项目。我们在.wxs文件中手动指定了二进制文件。 Web已修改.wixproj文件以使用HeatDirectory任务从指定位置收集我们的数据(图像和文档和数据库)(这已损坏并发出ICE38错误)。这似乎没事,但仍然是很多工作。我们必须通过在发布模式下运行程序并将其复制到指定目录来手动更新我们的数据。

我希望看到其他人在这种情况下会做些什么。

  1. 您如何安排有关2000+数据文件的解决方案?您是否会创建一个自定义构建脚本来从服务器获取当前数据,或者将它们作为内容文件包含在主项目中?
  2. 如何让WIX包含所有项目输出(包括引用的程序集)和所有数据文件?如果您有任何完整的样品,那就太棒了。我所发现的只是这里和那里的小片段,而不是从头到尾的整个例子。
  3. 您如何处理版本号?你会把它们作为常量放在构建脚本中并通过$(var.VersionNumberName)引用它们吗?您是否可以从正在部署的项目中自动获取版本号?如果是这样,怎么样?
  4. 如果有比我找到的更好的信息,请包含。我读过很多文章,博客,Stackoverflow问题,tuturial,维基等。一切似乎都是点点滴滴。本教程很好,但没有解释任何有关MSBuild和Votive的内容。我想看看开始使用MSBuild和Votive以及所有WIX MSBuild目标的教程。如果没有人知道这样的教程,我可以把它们放在一起。我已经花了整整一周收集信息和阅读。我也是MSBuild的新手,所以如果有人在MSBuild上有任何好文章,请加入它们。

4 个答案:

答案 0 :(得分:2)

关键是将不同类型的复杂性隔离到单独的合并模块中,并将它们作为构建的一部分一起放入MSI中。通过这种方式,经常变化的事情可以在不影响根本不会发生变化的事情的情况下发生变化。

1)对于数据文件:

我们使用Paraffin生成WiX,因此合并模块用于基于html + Flash的帮助系统,该系统包含数千个文件(我无法说服客户转到CHM)。

将它们全部编译为合并模块。

2)程序集:假设这是一个不经常更改的集合,只需手动创建合并模块,或者使用正确的文件和依赖项创建WixEdit。

3)对于版本号,有很多方法可以根据您的构建系统进行管理。 AssemblyInfoTask是一种非常直接的方法,可以确保所有程序集的版本都适当。如果您使用TFS,MSBuild扩展包有一些版本控制。

答案 1 :(得分:0)

我有一个类似的情况,但无法找到解决方案,所以最终得到以下结果:

我编写了一个名为wixgen.exe的自定义命令行程序,用于生成wxs清单文件。它非常特定于我们的实现,因为它只知道如何创建两种类型的wxs文件。一个用于IIS网站/虚拟目录部署,另一个用于Windows服务部署。

每次构建都由我们的持续集成服务器触发时,构建后任务会使用正确的args运行wixgen,以便为要更改的项目生成新的manifest.wxs。它自动包含部署所需的所有文件。这些版本还使用了http://richardsbraindump.blogspot.com/2007/07/versioning-builds-with-tfs-and-msbuild.html

的技术变体对dll进行了版本控制

然后使用手动触发的单独构建来构建包含生成的wxs文件的wixproj项目并生成msi。

答案 2 :(得分:0)

我会放弃CD发送(所以90年代)并使用ClickOnce。由于您已经使用.NET框架,因此该解决方案似乎很合适。使用ClickOnce,您应该能够不断更新解决方案的内容,并使更新可用于您的内容。如果需要,请告诉我,请使用ClickOnce部署代码示例。

您可以找到更多ClickOnce信息here

答案 3 :(得分:0)

与dkackman的答案类似,您应该将构建分成几个组件,隔离构建组件以单独构建。

我来自一个主要的Java背景,但是对于构建MSI和.NET可执行文件,我们使用maven;使用'maven-wix-plugin'插件构建安装程序,并使用NMaven插件编译任何NET代码。但是,由于我们只在.NET中执行非常基本的开发,而且大部分是用Java开发的,因此我们不需要NMaven插件的复杂性太多(这可能是一个'好东西'(TM),因为它仅在版本0.17 )。

如果你是一个纯净的房子,你也可以看看Blydan(http://www.codeplex.com/byldan),这似乎是目前发展的焦点(它与NMaven和Byldan的团队相同)。 / p>

如果你想要更多关于NMaven或Byldan的信息提出另一个问题,我会尽可能多地提供信息(这不是一个巨大的数额,如我所说,我只做非常有限的NET发展)。