使目标在MSBuild中的解决方案级别运行一次

使目标在MSBuild中的解决方案级别运行一次,msbuild,Msbuild,我需要一组任务,整个解决方案只需执行一次。这将运行将修改每个项目的任务,以便为每个项目运行一组单独的任务。我们在前面使用了一个单独的项目来完成这项工作,该解决方案具有解决方案级别的任务,但我们希望从这个角度出发。有人这样做了吗?或者有人对如何实现这一点有什么建议吗?由于解决方案文件不是MSBuild格式,因此它们不容易扩展或自定义。如果希望对生成过程进行更多控制,则必须创建一个“驱动程序”msbuild文件,该文件将替换您的解决方案文件。在这个驱动程序文件中,您将构建所需的所有项目并执行一些额外

我需要一组任务,整个解决方案只需执行一次。这将运行将修改每个项目的任务,以便为每个项目运行一组单独的任务。我们在前面使用了一个单独的项目来完成这项工作,该解决方案具有解决方案级别的任务,但我们希望从这个角度出发。有人这样做了吗?或者有人对如何实现这一点有什么建议吗?

由于解决方案文件不是MSBuild格式,因此它们不容易扩展或自定义。如果希望对生成过程进行更多控制,则必须创建一个“驱动程序”msbuild文件,该文件将替换您的解决方案文件。在这个驱动程序文件中,您将构建所需的所有项目并执行一些额外的任务。您可以使用。下面是一个示例,演示如何构建多个项目

<Project ...>
    <ItemGroup>
        <Projects Include="proj01.csproj"/>
        <Projects Include="proj02.csproj"/>
        <Projects Include="proj03.csproj"/>
    </ItemGroup>

    <Target Name="BuildAll">
        <MSBuild Projects="@(Projects)" BuildInParallel="true" />
    </Target>

</Project>


因此,在您的情况下,您只需在构建项目之前执行任务。还请注意,我为
BuildInParallel
指定了值true,表示MSBuild可以尝试一次生成多个项目。

另一种解决方案是使用一个目标,在删除尽可能多的全局属性的情况下,向MSBuild调用的目标分派数据。我的团队在Directory.Build.props导入的props文件的InitialTargets中有一个目标-类似于:


由于MSBuild似乎在
{project file,global properties,target}
集上同步并行生成,因此通过删除所有属性,您可以同步生成,并为所有正在生成的项目运行一次。缺点:您必须维护
RemoveProperties
属性-MSBuild无法删除所有全局属性。如果生成中的某些内容发出了一个新的
MSBuild
任务,并指定了自定义属性,则将调用目标的第二个实例


当然,您的构建将在此目标上同步。您可以尝试通过将
CompileDependsOn
设置为依赖于
Prebuild
目标来连接目标,以允许在构建中独立进行。但是,让目标尽早运行并普遍使用InitialTargets似乎是更好的选择。

这是一个有趣的想法。如果我想在构建项目之前执行一些额外的任务,我相信这也会起作用?(这些额外的任务将修改项目本身。)创建这些构建文件是一个非常常见的场景。许多人更喜欢编写这些类型的构建文件,而不是使用用于生产构建的解决方案。就我而言,我只使用Visual Studio的解决方案文件,从不用于实际生成。在这种方法中,如果我的项目1依赖于项目2,那么msbuild不会生成我的项目2两次,从而延迟生成过程吗?msbuild具有增量生成,因此它应该知道它已经生成并且是最新的。谢谢@sayedbrahimhashimi,我将尝试一下,看看效果如何。我在工作中做了“很多”MSBuild自定义,所以这些提示总是很有用的。