使用 msbuild 构建多架构安装程序

Building a multi-arch installer with msbuild

我正在使用 NSIS 为 C++ 程序构建多体系结构安装程序。我正在使用 Visual Studio 2010。一切都很好,除了我不知道如何让安装程序依赖于所有架构的构建。

我已经为 运行 makensis 创建了一个项目作为构建步骤,并将其配置为依赖于解决方案中的所有其他项目。我目前正在为 Win32 和 X86_64 架构构建。 NSIS 项目仅作为 X86_64 配置的一部分构建。但它打包了内置于 X86_64 和 Win32 配置中的文件。问题就在这里。如果我构建 Win32 然后立即 X86_64,一切都很好。如果我以 X86_64 开头,构建将失败,因为它找不到 Win32 文件。更糟糕的是,如果我更改了一些源代码并仅重新构建 X86_64,安装程序项目将愉快地选择过时的 Win32 文件,而不会出现任何问题。

我可以从 X86_64 构建强制 Win32 构建,或者做任何其他事情来使它工作吗?

我是 Unix 类型,Windows 对我来说是一个陌生的世界。

任何

我认为您需要先构建 Win32 配置,然后再构建 64 位配置。

makensis项目应该在两者都完成后构建(成功!)。

例如,可以从 Post 构建事件(对于 64 位配置)或作为单独的项目调用它。

我不确定您的 makensis 项目是基于 Visual & Installerhttp://www.visual-installer.com - 抱歉没有自我宣传 :) 还是纯粹的(文本 - batch) 项目包含在 VS 解决方案中。

在这两种情况下,VS 中的配置管理器都允许您定义构建顺序。 makensis 项目应该始终是最后一个,以便它可以从以前的配置中找到所有依赖项。

在 makensis 项目中使用相对路径也很好——比如 ${TARGET_PATH} 将为每个配置定义不同的值。

至于"foolproof"的解决办法,如果我没看错的话:

  • 您的解决方案包含多个项目(比方说 Test.sln),
  • 您想为多个平台构建此解决方案,
  • ...并使用 MakeNSIS 工具(我不知道那是什么)来创建为所有平台构建的安装程序打包二进制文件。

如有错误请指正。所以,要完成这个任务:

  • 我会完全放弃你介绍的项目(运行ning MakeNSIS),
  • 然后将创建 Test.msbuild 文件,例如下面的文件,
  • 注意 <Exec> element,那是你要 运行 MakeNSIS 的地方,
  • 然后简单地 运行 msbuild 为 msbuild Test.msbuild,
  • 使用此解决方案,您将拥有 Test.sln 中的所有项目,首先为 Win32 构建,然后为 x64 构建,之后 MakeNSIS 只会是 运行。
<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
  <Target Name="Build" DependsOnTargets="Build_Win32;Build_x64">
    <!-- Run whatever command you like, such as MakeNSIS .. ? -->
    <Exec Command="notepad.exe" />
  </Target>
  <Target Name ="Build_Win32">
    <MSBuild Projects="Test.sln" Properties="Configuration=Release;Platform=Win32" />
  </Target>
  <Target Name ="Build_x64">
    <MSBuild Projects="Test.sln" Properties="Configuration=Release;Platform=x64" />
  </Target>
</Project>

如果以上内容不是您所要求的,请对您的实际问题进行说明。

编辑:

在评论中澄清您的要求后,我会提出以下解决方案。我更喜欢上面的 Test.msbuild 的解决方案,但是给你:

  1. 将新项目 BuildInstaller 添加到您的解决方案中,
  2. Configuration Manager 中取消选中此新项目的复选框 "Build" 以获取 Configuration/Platform、
  3. 的所有组合
  4. 仍然在 Configuration Manager 中,创建新配置,比方说 Installers,
  5. 对于此新配置,取消选中解决方案中所有项目的 "Build" 复选框,BuildInstaller
  6. 除外
  7. 现在在文本编辑器中打开 BuildInstaller.vcxproj 并在结束 </Project> 标记之前附加以下代码段:
<ItemGroup>
  <ProjectsToBuild Include="..\**\*.vcxproj" Exclude="..\**\BuildInstaller.vcxproj"/>
</ItemGroup>
<Target Name="Build" DependsOnTargets="Build_Win32;Build_x64">
  <!-- Run whatever command you like, such as MakeNSIS .. ? -->
  <Exec Command="notepad.exe" />
</Target>
<Target Name="Build_Win32">
  <MSBuild Projects="@(ProjectsToBuild)" Properties="Configuration=Release;Platform=Win32" />
</Target>
<Target Name="Build_x64">
  <MSBuild Projects="@(ProjectsToBuild)" Properties="Configuration=Release;Platform=x64" />
</Target>
  1. 这样你就可以有效地 override the default build target,
  2. 所以现在:
    • 每次为 Release/Debug 配置构建时,不会构建安装程序,出于多种原因,这是首选,
    • 每次您为安装程序配置构建时,您的新 BuildInstaller.vcxproj 将接管,将构建 win32 和 x64 二进制文件,最后将 运行 自定义命令行可执行文件。当然,二进制文件将使用 Release 配置构建,这应该是需要的。

最初我想我可以删除 <ItemGroup> 元素并使用 Projects="..\Test.sln" 而不是 Projects="@(ProjectsToBuild)" 因为应该没有循环依赖(BuildInstaller.vcxproj 不是为发布构建的) 但是构建花了很长时间,所以一定有一些问题,很奇怪...

这是否满足您的需求?