使用msbuild为多个平台最快地重建多个项目

使用msbuild为多个平台最快地重建多个项目,msbuild,Msbuild,我有一个包含很多项目的解决方案文件,我希望使用一个持续集成系统(Jenkins,恰巧如此)来构建其中的一个子集。目前我调用devenv并为每个调用指定项目/平台,总共调用了28次devenv。如果只做了一个小的更改,那么最终什么都不做就要花费相当多的时间(许多项目根本不会更改) 在linux上构建同样的东西,我使用忍者,如果没有任何改变,构建过程或多或少是即时的 我想要的是能够启动msbuild,因为它似乎是该作业的工具,并向它提供要为其构建的项目/平台的列表,并让它完成其工作。当然,我希望每个

我有一个包含很多项目的解决方案文件,我希望使用一个持续集成系统(Jenkins,恰巧如此)来构建其中的一个子集。目前我调用devenv并为每个调用指定项目/平台,总共调用了28次devenv。如果只做了一个小的更改,那么最终什么都不做就要花费相当多的时间(许多项目根本不会更改)

在linux上构建同样的东西,我使用忍者,如果没有任何改变,构建过程或多或少是即时的

我想要的是能够启动msbuild,因为它似乎是该作业的工具,并向它提供要为其构建的项目/平台的列表,并让它完成其工作。当然,我希望每个项目的并行构建也能实现


我已经查阅了很多文档,但到目前为止,msbuild始终坚持按顺序构建所有项目。

将项目添加到解决方案文件中,并运行如下命令:

msbuild.exe SolutionFile.sln /t:Build/p:Configuration=Release;Platform=Win32

您可以添加/m选项以在parralel中生成多个项目编辑:使用MsBuild.exe/m并行生成

要获得额外积分,请并行构建所有配置>:)

1) 确保所有相互依赖的项目都有参考资料

2) 将它们全部包含在一个组中,并使用Configuration Manager删除解决方案中不支持的平台和配置组合

<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0" >
    <PropertyGroup>
        <SrcRoot Condition="'$(SrcRoot)'==''">$([MSBuild]::GetDirectoryNameOfFileAbove( $(MSBuildProjectDirectory) , Project.props ))</SrcRoot>
    </PropertyGroup>
    <Import Project="$(SrcRoot)\Project.props" />
    <ItemGroup>
        <SolutionConfiguration Include="$(SrcRoot)\MySolution.sln">
            <Properties>Configuration=Release;Platform=x86</Properties>
        </SolutionConfiguration>
        <SolutionConfiguration Include="$(SrcRoot)\MySolution.sln">
            <Properties>Configuration=Debug;Platform=x86</Properties>
        </SolutionConfiguration>
        <SolutionConfiguration Include="$(SrcRoot)\MySolution.sln">
            <Properties>Configuration=Debug;Platform=x64</Properties>
        </SolutionConfiguration>
        <SolutionConfiguration Include="$(SrcRoot)\MySolution.sln">
            <Properties>Configuration=Debug;Platform=x64</Properties>
        </SolutionConfiguration>
    </ItemGroup>

    <Target Name="Build">
        <MsBuild BuildInParallel="true" ContinueOnError="true" Projects="@(SolutionConfiguration)" />
    </Target>
</Project>
3) 戴上你的疯狂科学家帽,创建一个新的MsBuild项目,用于构建你的解决方案

<?xml version="1.0" encoding="utf-8"?>
<Project DefaultTargets="Build" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" ToolsVersion="4.0" >
    <PropertyGroup>
        <SrcRoot Condition="'$(SrcRoot)'==''">$([MSBuild]::GetDirectoryNameOfFileAbove( $(MSBuildProjectDirectory) , Project.props ))</SrcRoot>
    </PropertyGroup>
    <Import Project="$(SrcRoot)\Project.props" />
    <ItemGroup>
        <SolutionConfiguration Include="$(SrcRoot)\MySolution.sln">
            <Properties>Configuration=Release;Platform=x86</Properties>
        </SolutionConfiguration>
        <SolutionConfiguration Include="$(SrcRoot)\MySolution.sln">
            <Properties>Configuration=Debug;Platform=x86</Properties>
        </SolutionConfiguration>
        <SolutionConfiguration Include="$(SrcRoot)\MySolution.sln">
            <Properties>Configuration=Debug;Platform=x64</Properties>
        </SolutionConfiguration>
        <SolutionConfiguration Include="$(SrcRoot)\MySolution.sln">
            <Properties>Configuration=Debug;Platform=x64</Properties>
        </SolutionConfiguration>
    </ItemGroup>

    <Target Name="Build">
        <MsBuild BuildInParallel="true" ContinueOnError="true" Projects="@(SolutionConfiguration)" />
    </Target>
</Project>

$([MSBuild]::GetDirectoryNameOffileOver($(MSBuildProjectDirectory),Project.props))
配置=释放;平台=x86
配置=调试;平台=x86
配置=调试;平台=x64
配置=调试;平台=x64
此项目需要分支根中的“project.props”来建立$(SrcRoot)文件夹。然后它将导入此项目。如果这不起作用,只需删除并将其更改为解决方案的名称或根目录中的任何其他文件。 然后,它创建一个由MsBuild任务并行批处理的项目组。因此,它不是按顺序构建不同的配置,而是一次构建所有配置


现在,将其与能够检测文件访问和写入的功能结合起来,您将能够检测竞争条件或一种配置的位可以覆盖另一种配置的区域。

我的解决方案已经包含了所有项目,但我只希望构建其中的一些项目。启动msbuild以生成每个版本并不比启动devenv.exe以生成每个版本好。我想启动一次msbuild,让它生成我需要的所有内容。这非常接近,但它在(例如)Win32版本中生成了所有内容。我只是想在那里构建一些项目,但是我找不到任何关于我可能在标签中添加什么来实现这一点的文档。例如Project=MyProject似乎被忽略了。我建议您创建新的解决方案配置,并选中/取消选中您想要构建的项目。然后将解决方案配置作为配置传入sln构建。