使用 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 & Installer(http://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
的解决方案,但是给你:
- 将新项目
BuildInstaller
添加到您的解决方案中,
- 在 Configuration Manager 中取消选中此新项目的复选框 "Build" 以获取 Configuration/Platform、
的所有组合
- 仍然在 Configuration Manager 中,创建新配置,比方说 Installers,
- 对于此新配置,取消选中解决方案中所有项目的 "Build" 复选框,
BuildInstaller
、 除外
- 现在在文本编辑器中打开
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>
- 这样你就可以有效地 override the default build target,
- 所以现在:
- 每次为 Release/Debug 配置构建时,不会构建安装程序,出于多种原因,这是首选,
- 每次您为安装程序配置构建时,您的新 BuildInstaller.vcxproj 将接管,将构建 win32 和 x64 二进制文件,最后将 运行 自定义命令行可执行文件。当然,二进制文件将使用 Release 配置构建,这应该是需要的。
最初我想我可以删除 <ItemGroup>
元素并使用 Projects="..\Test.sln"
而不是 Projects="@(ProjectsToBuild)"
因为应该没有循环依赖(BuildInstaller.vcxproj 不是为发布构建的) 但是构建花了很长时间,所以一定有一些问题,很奇怪...
这是否满足您的需求?
我正在使用 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 & Installer(http://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
的解决方案,但是给你:
- 将新项目
BuildInstaller
添加到您的解决方案中, - 在 Configuration Manager 中取消选中此新项目的复选框 "Build" 以获取 Configuration/Platform、 的所有组合
- 仍然在 Configuration Manager 中,创建新配置,比方说 Installers,
- 对于此新配置,取消选中解决方案中所有项目的 "Build" 复选框,
BuildInstaller
、 除外
- 现在在文本编辑器中打开
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>
- 这样你就可以有效地 override the default build target,
- 所以现在:
- 每次为 Release/Debug 配置构建时,不会构建安装程序,出于多种原因,这是首选,
- 每次您为安装程序配置构建时,您的新 BuildInstaller.vcxproj 将接管,将构建 win32 和 x64 二进制文件,最后将 运行 自定义命令行可执行文件。当然,二进制文件将使用 Release 配置构建,这应该是需要的。
最初我想我可以删除 <ItemGroup>
元素并使用 Projects="..\Test.sln"
而不是 Projects="@(ProjectsToBuild)"
因为应该没有循环依赖(BuildInstaller.vcxproj 不是为发布构建的) 但是构建花了很长时间,所以一定有一些问题,很奇怪...
这是否满足您的需求?