使用MSBuild为可配置服务名称的Windows服务生成MSI安装程序

时间:2011-04-05 22:26:39

标签: windows configuration msbuild service windows-installer

问候, 我正试图弄清楚如何使用MSBuild和Visual Studio 2010来实现以下场景。

  1. 我想安装一组三个服务。默认安装目录应根据构建(qa,uat和production)而变化。
  2. 为了给这整个事物添加另一个有趣的皱纹,有时候我们处于高峰负荷时可以将uat环境投入使用,因此服务的每个构建都需要具有不同的名称。它并不经常发生,但它在列表中。如何配置服务安装程序以动态更改服务名称?
  3. 我希望能够为服务创建MSI安装程序(无论当前构建是什么)。我已经为我正在使用的各种网站提供了一个现有的,广泛的MSBuild脚本,但我不确定如何继续使这些服务工作。
  4. 显然,每个服务构建的配置文件都不同。
  5. 我已为每项服务添加了安装程序类。
  6. 我想我对如何开始这个有点困惑,所以我能得到的任何帮助都会很棒。我曾考虑过简单地硬编码不同的服务名称并使用条件编译语句来设置它们,但我认为这样做并不是特别明确的方法。有什么想法吗?

1 个答案:

答案 0 :(得分:3)

在构建期间压缩服务位并使用MSBuild使用或MSBuild扩展任务进行部署可能更简单。您可以将特定于环境的配置数据放在msbuild .properties文件中(mylocal.service.properites,qp.service.properties,uat.service.properties等)。这是我部署服务的方式。

注意:属性文件将包含数据库连接字符串,TargetDir,ServiceName等内容。

服务名称在安装时指定,请参阅下面的'sc','installutil'或WindowsService msbuild extensions pack task代码段。这意味着您可以复制相同的服务位,并使用唯一的名称安装每个目录(例如QAService,UATService,PRODService)。

注意:我想强调服务名称是部署时考虑因素,而不是构建时考虑因素。

<WindowsService TaskAction="Install"
                ServiceName="$(ServiceName)"
                MachineName="$(TargetServer)"
                ServicePath="$(FullServicePath)" 
                User="$(User)" />

MSI安装程序的方法类似。我假设你的安装程序提示所有必要的环境特定配置数据...所有[体面]安装程序都有办法从文件提供答案,而不是交互式地使用安装程序。因此,如上所述,您为每个环境创建一个答案文件,并在命令行上将其提供给安装程序。

您不希望在构建时执行此操作...因此每个平台都有一个单独的安装程序。被迫使用古老版本的wyse安装程序执行此操作。让我伤心。您需要一个可以在每个环境中运行的单个MSI安装程序(给定特定于环境的答案文件)。

MSI命令行和应答文件格式的详细信息因产品而异。您使用的安装程序包是什么?

干杯, / JHD