1

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

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

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

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

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

4

1 回答 1

0

概括

由于当您“运行”它创建的 .exe 并使用 WiX 工具包时,Wix# 实际上会构建 MSI,因此您需要将创建的可执行 Wix# + WiX Toolkit 输出到您的放置文件夹。然后确保 WiX 工具包可执行文件位于您的 PATH 或输出文件夹中,并在放置文件夹中创建调用 Wix# 可执行文件的 Powershell 脚本。一种直接的方法是为每个单独的“产品安装程序”创建一个 Wix# 项目,并将每个这些 Wix# 可执行文件输出到您的放置文件夹,以便下游 Powershell(或其他)进一步处理/生成 MSI 文件脚本。

我正在使用集成到 VS2013 IDE 中的 Wix#,所以我的答案应该在这种情况下进行解释。我的 Wix# 安装程序只是我的整体解决方案中的几个项目之一。

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

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

让构建将此 MyWebSiteSetup.exe 文件与其他文件一起放置在放置文件夹中,以及 Wix# 放置在 bin\debug 文件夹中的其他文件。然后让您的第二组脚本运行 MyWebsiteSetup.exe 程序,该程序将生成 MSI。我相信您可能需要将 Wix# 代码所需的安装组件文件也部署到放置文件夹中,并在预期的文件夹结构中。Wix# 似乎将它需要的所有其他支持文件放在 bin\debug 文件夹中,因此只需将所有文件从 Wix# 项目的 bin\debug 复制到放置文件夹即可满足您的需求。

使示例适用于多种产品(多种 Wix# 项目)

现在,您的问题是如何为所有文件都放在同一个放置文件夹中的多个网站执行此操作。有几种方法可以解决这个问题,但我建议的一种方法是在 Visual Studio 中为每个单独的产品创建一个单独的 Wix# 项目,并将每个项目的 Wix# 输出文件与产品一起部署到放置文件夹文件。如果您的单独产品被命名为 MyWebSiteSetupA、MyWebSiteSetupB 和 MyWebSiteSetupC,它们将生成可执行文件 MyWebSiteSetupA.exe、MyWebSiteSetupB.exe 和 MyWebSiteSetupC.exe。您只需让您的第二组脚本依次调用其中的每一个。当然,这些项目的每个 Wix# 代码文件(.cs 文件)都会被编码,以了解它在运行时需要获取哪些文件,并且在运行生成的 exe 时,它​​将获得它需要的文件,

当然,还有许多其他方法可以使用 PowerShell 等灵活的工具,每种方法都各有利弊,但我希望这有助于您开始使用一种可以根据您的需求定制的方法。

于 2014-12-18T04:11:45.780 回答