.net 仅当实际生成项目时才运行MSBuild目标

.net 仅当实际生成项目时才运行MSBuild目标,.net,build,msbuild,build-process,msbuild-4.0,.net,Build,Msbuild,Build Process,Msbuild 4.0,我有一个生成*/.sln文件的MSBuild文件(生成所有存在的.sln文件) 生成使用生成目标,因此如果未对输入文件进行任何更改,则不应再次生成任何项目 我想执行一些自定义目标,只有当项目实际重新构建时 如何做到这一点 无论编译/生成是否实际发生,总是调用AfterBuild和AfterCompile。基本上您希望与PostBuildEvent相同的行为,例如,因此我查看了Microsoft.Common.Targets是如何实现的(此文件始终提供有关如何使用msbuild的详细信息)。以下是

我有一个生成*/.sln文件的MSBuild文件(生成所有存在的.sln文件)

生成使用生成目标,因此如果未对输入文件进行任何更改,则不应再次生成任何项目

我想执行一些自定义目标,只有当项目实际重新构建时

如何做到这一点


无论编译/生成是否实际发生,总是调用AfterBuildAfterCompile

基本上您希望与
PostBuildEvent
相同的行为,例如,因此我查看了
Microsoft.Common.Targets
是如何实现的(此文件始终提供有关如何使用msbuild的详细信息)。以下是解决方案:

<PropertyGroup>
  <RunPostBuildEvent>OnOutputUpdated</RunPostBuildEvent>
</PropertyGroup>
<Import Project="$(MSBuildToolsPath)\Microsoft.CSharp.targets" />
<Target Name="RunWhenBuild" AfterTargets="CoreBuild"       
        Condition="'$(_AssemblyTimestampBeforeCompile)'!='$(_AssemblyTimestampAfterCompile)'">
  <Message Importance="high" Text="RunWhenBuild!!"/>
</Target>

OnOutputUpdated

这就是原因:当有一个名为
RunPostBuildEvent
的属性,其值为
OnOutputUpdated
时,
CoreBuild
目标的依赖项最终将记录生成前后输出文件的时间戳。如果它们相等,则输出不是生成的。因此剩下的就是得到输出您的目标是在
CoreBuild
之后运行,并检查这些时间戳。

该目标是在每个项目文件中,还是在也属于解决方案的单独项目文件中?这似乎有点困难。此外,您希望在生成任何其他项目时生成目标,还是在生成所有项目时生成目标,还是在每个项目之后生成目标。Basically我想将每个构建的输出(仅构建的)复制到某个文件夹中,因此我只剩下实际构建的工件。是的,这是标准(对于C#而言是必需的)导入,位于每个csproj文件的末尾。没有它,您无法(轻松地)构建C#应用程序目标导入在最新版本(截至2018年)中仍然相关吗csproj格式?也就是说,默认情况下从当前的csproj格式中删除了该格式,我想在遵循该格式时可以继续忽略它?对于找到该格式并使用新csproj格式的用户,请注意,这意味着如果您使用
而不是此处提到的方法,您将无法使用
$(OutDir)
等。