在没有 MSBuild 或插件的情况下按顺序在 Visual Studio 中构建配置?
Sequentially build configurations in Visual Studio without MSBuild or plugins?
MSDN 描述了如何创建批处理构建,但没有提供自动化不同批处理的方法(以及 GUI 的一键式解决方案)
This question 描述了有条件地调用第二个构建,但似乎不足以满足两个以上的顺序配置
This question 解决了同样的情况,但同样只针对两种配置
在我的测试用例中,每个配置:
- 定义自己的 MACROS(影响源代码)
- 适用于多个项目(class 库)。这些项目是相互依赖的,并且在当前配置的上下文中需要特定的构建顺序
我想 visual studio 使用单个构建命令顺序构建多个配置。
子配置是否可以嵌套在父配置下,并在父配置构建时visual studio顺序执行?
更新:尝试解决方案 1 [2016-03-11]
为了回应 Stijn 建议的答案,我尝试了以下方法:
使用 3 个测试项目和 6 个配置设置 DotNetFramework 4.5 WinForms 解决方案:
- CORE_DEBUG
- CORE_RELEASE
- EXTENDED_DEBUG
- EXTENDED_RELEASE
- 调试
- 发布
调试配置必须:
- 不触发它自己的配置构建(即 'Debug')
- 必须依次触发CORE_DEBUG和EXTENDED_DEBUG配置
我已将以下修改后的目标添加到第一个项目的项目文件中:
<Target Name="AfterBuild" Condition="'$(Configuration)|$(Platform)' == 'Debug|AnyCPU'">
现在使用 'Debug' 配置构建,会触发 EXTENDED_RELEASE 构建。查看解决方案文件,我看到 Visual Studio 决定自动 link 'Debug' 到 'EXTENDED_RELEASE':
{4F9706AA-26A9-483C-81C4-22E301C54C89}.Debug|Any CPU.ActiveCfg = EXTENDED_RELEASE|Any CPU
{4F9706AA-26A9-483C-81C4-22E301C54C89}.Debug|Any CPU.Build.0 = EXTENDED_RELEASE|Any CPU
从解决方案文件中删除以上两行没有帮助,因为 Visual Studio 只是重新生成它们。总之,这现在有两个不良结果:
- Visual Studio 为 Project1
执行 'Debug' 构建
- Visual Studio 然后对 Project2 和 Project3
执行 'EXTENDED_RELEASE'
Conclusion: While this approach can work, it also (first) performs debug and release configuration builds respectively. Visual Studio
also lists all 6 Configurations in the build menu (we only want Debug
and Release to be visible, and behind the scenes Debug must trigger
CORE_DEBUG and EXTENDED_DEBUG, and Release must trigger CORE_RELEASE
and EXTENDED_RELEASE)
更新:尝试解决方案 2 [2016-03-16]
转到 makefile 项目解决方案:我已经创建了一个 makefile 项目,正如下面 stijn 的回答所指定的那样,它工作得很好!
Conclusion : This is the preferred solution in my opinion because it gives the user the most power and ability to control exactly how the build(s) must be executed and how the configurations must be handled.
第二个SO question的原理可以调整为通过多次调用MsBuild来顺序构建多个configuration/platform。例如:
<Target Name="AfterBuild" Condition="'$(Configuration)|$(Platform)' == 'Debug|AnyCPU'">
<MSBuild Projects="$(MySolution)" Properties="Configuration=Release;Platform=x86"/>
<MSBuild Projects="$(MySolution)" Properties="Configuration=Debug;Platform=x64"/>
<MSBuild Projects="$(MySolution)" Properties="Configuration=Release;Platform=x64"/>
</Target>
这可以通过使用项目批处理来清理,删除条件并自动确定调用哪个配置,然后只构建其他配置等,但这有点超出这里的范围。
我不太相信在 AfterBuild 目标中执行此操作是最好的方法,因为那样的话您需要调整您的 'normal' 项目之一以触发其他所有项目的构建。另一种方法是将 MakeFile Project 添加到您的解决方案中,设置它的依赖项,以便它在构建顺序中排在最后(至少如果这是您需要的),并设置它的命令行以某种方式调用 msbuild与上述类似。您甚至可以将所有逻辑保存在同一个项目文件中:将 'Build Command Line' 设置为
msbuild $(MsBuildThisFile) /t:CustomBuild /p:Configuration=$(Configuration);Platform=$(Platform)
因此构建项目将 'recurse' 并使用与 VS 调用相同的属性再次调用自身,但执行 CustomBuild 目标,然后您可以构建另一个 projects/solutions 来品尝.
编辑回复:更新
您就快完成了,但是您必须转到 Configuration Manager 并确保配置设置正确才能开始。从头开始:
- 创建新解决方案,添加 3 个项目
- 右键解决,select配置管理器
- 在 活动解决方案配置中 组合框 select new
- 为 name 输入 CORE_DEBUG,select DEBUG 在 Copy settings from 下并确保 Create new project configurations 像
一样检查
- 重复其他配置
- 例如EXTENDED_RELEASE,它现在应该看起来像
- 您可能已经完成了其中的大部分工作,但是不知何故调试被分配给了 EXTENDED_RELEASE,所以这是您应该修复的一件事;您可以通过手动编辑解决方案来做到这一点,而不是删除行,您必须将它们编辑为正确,否则 VS 只需再次添加它们,正如您注意到的那样
现在在文本编辑器中打开第一个项目,在已插入但已注释掉 AfterBuild 的文件末尾添加
<ItemGroup>
<Configurations Condition="'$(Configuration)'=='Debug'" Include="CORE_DEBUG;EXTENDED_DEBUG" />
<Configurations Condition="'$(Configuration)'=='Release'" Include="CORE_RELEASE;EXTENDED_RELEASE" />
<Projects Include="$(SolutionDir)WindowsFormsApplication1.csproj;$(SolutionDir)WindowsFormsApplication2.csproj;$(SolutionDir)WindowsFormsApplication3.csproj" />
</ItemGroup>
<Target Name="AfterBuild" Condition="'@(Configurations)' != ''">
<Message Text="Projects=@(Projects) Configuration=%(Configurations.Identity)" />
<MSBuild Projects="@(Projects)" Targets="Build" Properties="Configuration=%(Configurations.Identity)" />
</Target>
您可能需要调整项目的路径。这将为 Debug 构建构建 CORE_DEBUG 和 EXTENDED_DEBUG,对于 Release 构建同样如此。当 Configurations ItemGroup 为空时跳过 AfterBuild,即当不构建 Debug 或 Release 时,这正是重点。
编辑 re: makefile
您可以为 makefile 命令行指定多个命令。单击 'Build Command Line' 框旁边的箭头和 select '' 为确保一切正确,必须将 Configuration Manager 设置为仅为 Debug/Release 构建 makefile 项目,例如:
makefile 项目的命令行看起来像
或者,我自己更喜欢这个,你创建一个内容与上面相同的 msbuild 文件:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Configurations Condition="'$(Configuration)'=='Debug'" Include="CORE_DEBUG;EXTENDED_DEBUG" />
<Configurations Condition="'$(Configuration)'=='Release'" Include="CORE_RELEASE;EXTENDED_RELEASE" />
<Projects Include="$(SolutionDir)WindowsFormsApplication1.csproj;$(SolutionDir)WindowsFormsApplication2.csproj;$(SolutionDir)WindowsFormsApplication3.csproj" />
</ItemGroup>
<Target Name="Build" Condition="'@(Configurations)' != ''">
<Message Text="Projects=@(Projects) Configuration=%(Configurations.Identity)" />
<MSBuild Projects="@(Projects)" Targets="Build" Properties="Configuration=%(Configurations.Identity)" />
</Target>
</Project>
然后您的 makefile 命令会像
一样调用该文件
msbuild /path/to/msbuildfile /t:Build /p:Configuration=Debug;SolutionDir=$(SolutionDir)
MSDN 描述了如何创建批处理构建,但没有提供自动化不同批处理的方法(以及 GUI 的一键式解决方案)
This question 描述了有条件地调用第二个构建,但似乎不足以满足两个以上的顺序配置
This question 解决了同样的情况,但同样只针对两种配置
在我的测试用例中,每个配置:
- 定义自己的 MACROS(影响源代码)
- 适用于多个项目(class 库)。这些项目是相互依赖的,并且在当前配置的上下文中需要特定的构建顺序
我想 visual studio 使用单个构建命令顺序构建多个配置。
子配置是否可以嵌套在父配置下,并在父配置构建时visual studio顺序执行?
更新:尝试解决方案 1 [2016-03-11]
为了回应 Stijn 建议的答案,我尝试了以下方法:
使用 3 个测试项目和 6 个配置设置 DotNetFramework 4.5 WinForms 解决方案:
- CORE_DEBUG
- CORE_RELEASE
- EXTENDED_DEBUG
- EXTENDED_RELEASE
- 调试
- 发布
调试配置必须:
- 不触发它自己的配置构建(即 'Debug')
- 必须依次触发CORE_DEBUG和EXTENDED_DEBUG配置
我已将以下修改后的目标添加到第一个项目的项目文件中:
<Target Name="AfterBuild" Condition="'$(Configuration)|$(Platform)' == 'Debug|AnyCPU'">
现在使用 'Debug' 配置构建,会触发 EXTENDED_RELEASE 构建。查看解决方案文件,我看到 Visual Studio 决定自动 link 'Debug' 到 'EXTENDED_RELEASE':
{4F9706AA-26A9-483C-81C4-22E301C54C89}.Debug|Any CPU.ActiveCfg = EXTENDED_RELEASE|Any CPU
{4F9706AA-26A9-483C-81C4-22E301C54C89}.Debug|Any CPU.Build.0 = EXTENDED_RELEASE|Any CPU
从解决方案文件中删除以上两行没有帮助,因为 Visual Studio 只是重新生成它们。总之,这现在有两个不良结果:
- Visual Studio 为 Project1 执行 'Debug' 构建
- Visual Studio 然后对 Project2 和 Project3 执行 'EXTENDED_RELEASE'
Conclusion: While this approach can work, it also (first) performs debug and release configuration builds respectively. Visual Studio also lists all 6 Configurations in the build menu (we only want Debug and Release to be visible, and behind the scenes Debug must trigger CORE_DEBUG and EXTENDED_DEBUG, and Release must trigger CORE_RELEASE and EXTENDED_RELEASE)
更新:尝试解决方案 2 [2016-03-16]
转到 makefile 项目解决方案:我已经创建了一个 makefile 项目,正如下面 stijn 的回答所指定的那样,它工作得很好!
Conclusion : This is the preferred solution in my opinion because it gives the user the most power and ability to control exactly how the build(s) must be executed and how the configurations must be handled.
第二个SO question的原理可以调整为通过多次调用MsBuild来顺序构建多个configuration/platform。例如:
<Target Name="AfterBuild" Condition="'$(Configuration)|$(Platform)' == 'Debug|AnyCPU'">
<MSBuild Projects="$(MySolution)" Properties="Configuration=Release;Platform=x86"/>
<MSBuild Projects="$(MySolution)" Properties="Configuration=Debug;Platform=x64"/>
<MSBuild Projects="$(MySolution)" Properties="Configuration=Release;Platform=x64"/>
</Target>
这可以通过使用项目批处理来清理,删除条件并自动确定调用哪个配置,然后只构建其他配置等,但这有点超出这里的范围。
我不太相信在 AfterBuild 目标中执行此操作是最好的方法,因为那样的话您需要调整您的 'normal' 项目之一以触发其他所有项目的构建。另一种方法是将 MakeFile Project 添加到您的解决方案中,设置它的依赖项,以便它在构建顺序中排在最后(至少如果这是您需要的),并设置它的命令行以某种方式调用 msbuild与上述类似。您甚至可以将所有逻辑保存在同一个项目文件中:将 'Build Command Line' 设置为
msbuild $(MsBuildThisFile) /t:CustomBuild /p:Configuration=$(Configuration);Platform=$(Platform)
因此构建项目将 'recurse' 并使用与 VS 调用相同的属性再次调用自身,但执行 CustomBuild 目标,然后您可以构建另一个 projects/solutions 来品尝.
编辑回复:更新 您就快完成了,但是您必须转到 Configuration Manager 并确保配置设置正确才能开始。从头开始:
- 创建新解决方案,添加 3 个项目
- 右键解决,select配置管理器
- 在 活动解决方案配置中 组合框 select new
- 为 name 输入 CORE_DEBUG,select DEBUG 在 Copy settings from 下并确保 Create new project configurations 像
- 重复其他配置
- 例如EXTENDED_RELEASE,它现在应该看起来像
- 您可能已经完成了其中的大部分工作,但是不知何故调试被分配给了 EXTENDED_RELEASE,所以这是您应该修复的一件事;您可以通过手动编辑解决方案来做到这一点,而不是删除行,您必须将它们编辑为正确,否则 VS 只需再次添加它们,正如您注意到的那样
现在在文本编辑器中打开第一个项目,在已插入但已注释掉 AfterBuild 的文件末尾添加
<ItemGroup>
<Configurations Condition="'$(Configuration)'=='Debug'" Include="CORE_DEBUG;EXTENDED_DEBUG" />
<Configurations Condition="'$(Configuration)'=='Release'" Include="CORE_RELEASE;EXTENDED_RELEASE" />
<Projects Include="$(SolutionDir)WindowsFormsApplication1.csproj;$(SolutionDir)WindowsFormsApplication2.csproj;$(SolutionDir)WindowsFormsApplication3.csproj" />
</ItemGroup>
<Target Name="AfterBuild" Condition="'@(Configurations)' != ''">
<Message Text="Projects=@(Projects) Configuration=%(Configurations.Identity)" />
<MSBuild Projects="@(Projects)" Targets="Build" Properties="Configuration=%(Configurations.Identity)" />
</Target>
您可能需要调整项目的路径。这将为 Debug 构建构建 CORE_DEBUG 和 EXTENDED_DEBUG,对于 Release 构建同样如此。当 Configurations ItemGroup 为空时跳过 AfterBuild,即当不构建 Debug 或 Release 时,这正是重点。
编辑 re: makefile
您可以为 makefile 命令行指定多个命令。单击 'Build Command Line' 框旁边的箭头和 select '' 为确保一切正确,必须将 Configuration Manager 设置为仅为 Debug/Release 构建 makefile 项目,例如:
makefile 项目的命令行看起来像
或者,我自己更喜欢这个,你创建一个内容与上面相同的 msbuild 文件:
<?xml version="1.0" encoding="utf-8"?>
<Project ToolsVersion="12.0" DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<Configurations Condition="'$(Configuration)'=='Debug'" Include="CORE_DEBUG;EXTENDED_DEBUG" />
<Configurations Condition="'$(Configuration)'=='Release'" Include="CORE_RELEASE;EXTENDED_RELEASE" />
<Projects Include="$(SolutionDir)WindowsFormsApplication1.csproj;$(SolutionDir)WindowsFormsApplication2.csproj;$(SolutionDir)WindowsFormsApplication3.csproj" />
</ItemGroup>
<Target Name="Build" Condition="'@(Configurations)' != ''">
<Message Text="Projects=@(Projects) Configuration=%(Configurations.Identity)" />
<MSBuild Projects="@(Projects)" Targets="Build" Properties="Configuration=%(Configurations.Identity)" />
</Target>
</Project>
然后您的 makefile 命令会像
一样调用该文件msbuild /path/to/msbuildfile /t:Build /p:Configuration=Debug;SolutionDir=$(SolutionDir)