msbuild EXE项目的构建和部署自动化

时间:2011-03-11 19:22:06

标签: continuous-integration psake wixsharp

我正在进行一些自动构建更改,并对构建/打包EXE应用程序的最佳方法有一些疑问。

从概念上讲,有两个脚本。第一个构建所有内容将生成的二进制文件放在共享上,以便它们可用于部署。第二组脚本分别负责从该构建结果中复制和配置某些应用程序。

构建整个解决方案的第一个脚本通过覆盖msbuild输出路径将构建结果复制到已知的拾取位置。这会导致所有文件的二进制文件被删除到同一文件夹中(Web应用程序除外,其中每个项目都在_PublishedWebsites下的自己的网站中)。这是有问题的,因为当我为单个EXE项目构建安装程序时,我只想包含该EXE的EXE和依赖项。但是,由于所有项目输出都在同一个文件夹中,因此不清楚单个应用程序需要哪些项目。

鉴于构建已将所有可执行文件的二进制文件放在一个文件夹中,如何构建仅包含特定EXE所需二进制文件的MSI?

我正在使用psake / powershell构建脚本,使用msbuild编译解决方案文件。我正在使用WixSharp从命令行应用程序(而不是CSC)构建安装程序。

1 个答案:

答案 0 :(得分:0)

概要

因为Wix#实际构建了MSI,当你"运行"它创建的.exe,并使用WiX工具包,您需要输出可执行的Wix#+ WiX Toolkit创建到您的drop文件夹。然后确保WiX工具包可执行文件位于PATH或输出文件夹中,并创建Powershell脚本以调用drop文件夹中的Wix#executable(s)。一个简单的方法是为每个单独的产品安装程序"创建一个Wix#项目,并将每个Wix#可执行文件输出到您的drop文件夹,以便下游进一步处理/生成MSI文件Powershell(或其他)脚本。

我正在使用Wix#集成到VS2013 IDE中,因此我的答案应该在该上下文中进行解释。我的Wix#installer只是我整体解决方案中的几个项目。

单个Wix的示例#在可视化工作室解决方案中的项目

因此,例如,如果您的Wix#项目代码文件在VS中设置为名为MyWebsiteSetup的项目,而Wix#代码文件是MyWebsiteSetup.cs,则您的Wix#可执行文件将位于\ MyWebsiteSetup \ bin \调试\ MyWebsiteSetup.exe。

让构建将此MyWebSiteSetup.exe文件放在drop文件夹中,并将其他文件Wix#置于bin \ debug文件夹中。然后让您的第二组脚本运行MyWebsiteSetup.exe程序,该程序将生成MSI。我相信您可能需要将Wix#代码的安装组件文件也部署到drop文件夹,并且在预期的文件夹结构中。 Wix#似乎将所需的所有其他支持文件放在bin \ debug文件夹中,因此只需将从Wix#project的bin \ debug复制到drop文件夹的所有文件都可以获得所需的内容。 / p>

将示例适用于多个产品(多个Wix#PROJECTS)

现在,您的问题是如何在多个网站中执行此操作,其中所有文件都放在同一个drop文件夹中。有几种方法可以解决这个问题,但我建议的方法是在Visual Studio中为每个单独的产品安装一个单独的Wix#项目,并为每个部署到drop文件夹的项目提供Wix#输出文件以及产品文件。如果您的单独产品名为MyWebSiteSetupA,MyWebSiteSetupB和MyWebSiteSetupC,则它们将生成可执行文件MyWebSiteSetupA.exe,MyWebSiteSetupB.exe和MyWebSiteSetupC.exe。您只需让第二组脚本依次调用每个脚本。当然,这些项目的每个Wix#代码文件(.cs文件)都会被编码,以便知道运行时需要提取哪些文件,并且当运行生成的exe时,它将获得所需的文件,只要您在预期的情况下使它们可用,并为每个产品的安装程序构建单独的MSI。

当然,还有很多其他的方法,使用像PowerShell这样的灵活工具,每种方法都有利有弊,但我希望这有助于您开始使用一种方法,然后根据您的需求进行定制。