或者通过属性集嵌套项集,写为:
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<FilePath>TestMSBuild</FilePath>
<ProjFileName>TestMSBuild\TestMSBuild.vcproj</ProjFileName>
</PropertyGroup>
<ItemGroup>
<ProjectReferences1 Include="$(FilePath)\$(ProjFileName)" />
<ProjectReferences2 Include=".\$(FilePath)\$(ProjFileName)" />
</ItemGroup>
<Target Name="BuildCppProject">
<VCBuild
Projects="@(ProjectReferences1)"
Configuration="Release|Win32"
Rebuild="true"/>
<VCBuild
Projects="@(ProjectReferences2)"
Configuration="Debug|Win32"
Rebuild="true"/>
</Target>
</Project>
注:该写法完全参数化,提高了灵活性,是较常用的写法。
(2)使用MSBuild任务
通过执行MSBuild任务,直接Build该项目,实际上MSBuild任务在执行时,发现是C++项目,也会自动调用VCBuild任务。而实际上VCBuild任务即是在执行vcbuild.exe命令。但使用MSBuild、VCBuild任务和使用Exec任务执行vcbuild.exe命令,方式不一样,速度也不相同。此任务使用同一个 MSBuild 进程来生成子项目,可以跳过的已生成目标列表在父生成进程与子生成进程之间共享。此任务的速度更快,因为它不创建任何新的 MSBuild 进程。该方法会产生一个warning。
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<ProjectReferences Include=".\TestMSBuild\TestMSBuild\TestMSBuild.vcproj" />
</ItemGroup>
<Target Name="BuildCppProject">
<MSBuild
Projects="@(ProjectReferences)"
Properties="Configuration=Release;Optimize=$(Optimize)"
Targets="Build">
<Output
TaskParameter="TargetOutputs"
ItemName="AssembliesBuiltByChildProjects" />
</MSBuild>
</Target>
</Project>
也可以通过MSBuild任务直接处理TestMSBuild项目的解决方案文件。
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<ItemGroup>
<ProjectReferences Include=".\TestMSBuild\TestMSBuild.sln" />
</ItemGroup>
<Target Name="BuildCppProject">
<MSBuild
Projects="@(ProjectReferences)"
Properties="Configuration=Release;Optimize=$(Optimize)"
Targets="Build">
<Output
TaskParameter="TargetOutputs"
ItemName="AssembliesBuiltByChildProjects" />
</MSBuild>
</Target>
</Project>
(3)使用Exec任务,使其执行vcbuild.exe命令
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<VCBuildCommand>"D:\Program Files\Microsoft Visual Studio 8\VC\vcpackages\vcbuild.exe"</VCBuildCommand>
<VCProjectFile>".\TestMSBuild\TestMSBuild\TestMSBuild.vcproj"</VCProjectFile>
<Configuration>"Release|Win32"</Configuration>
</PropertyGroup>
<Target Name="BuildVCProject">
<Exec Command="$(VCBuildCommand) /rebuild $(VCProjectFile) $(Configuration)" />
</Target>
</Project>
通过Exec任务执行vcbuild.exe命令,Build速度较慢,其执行过程如下图所示。
(4 )使用Exec任务,使其执行devenv.com命令
<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
<PropertyGroup>
<DevenvCommand>"D:\Program Files\Microsoft Visual Studio 8\Common7\IDE\devenv.com"</DevenvCommand>
<SolutionFile>".\TestMSBuild\TestMSBuild.sln"</SolutionFile>
</PropertyGroup>
<Target Name="BuildVCProject">
<Exec Command="$(DevenvCommand) /clean Release $(SolutionFile)" />
<Exec Command="$(DevenvCommand) /build Release $(SolutionFile)" />
<Exec Command="$(DevenvCommand) /clean Debug $(SolutionFile)" />
<Exec Command="$(DevenvCommand) /build Debug $(SolutionFile)" />
</Target>
</Project>
实际上,通过Exec任务执行devenv.com命令,也可以直接在命令行窗口写入如下命令:
devenv /clean Release C:\TestMSBuild\TestMSBuild.sln
devenv /build Release C:\TestMSBuild\TestMSBuild.sln
devenv /clean Debug C:\TestMSBuild\TestMSBuild.sln
devenv /build Debug C:\TestMSBuild\TestMSBuild.sln
注意:本文中的测试文件均为.csproj文件,要使用相对路径,须将这些.csproj文件放在C:根目录下。
责任编辑:小草