MSBuild - 执行自定义目标,无需修改单个项目

时间:2014-05-12 15:52:45

标签: msbuild

我在解决方案中的每个项目的AfterBuild事件之后执行自定义MSBuild任务。 我不想将每个Project文件修改为: 在Visual Studio(VS 2012 Ultimate)中修改项目后,Visual Studio会删除对项目文件所做的所有自定义更改,例如添加或删除文件/引用。

我不想使用" CustomAfterMicrosoftCommonTargets"正如前面提到的here,因为从Visual Studio构建时无法传递此命令行参数:

  

msbuild.exe app.proj /property:CustomAfterMicrosoftCommonTargets=custom.target

我找到了一个解决方案here,但我并没有得到它。 任何人都可以详细说明或帮我找出更好的解决方案吗?

2014年5月12日更新: 我发现,如果我在管理员模式下运行Visual Studio,Visual Studio不会清除自定义更改。 我现在可以想到有一个自定义导入文件已经获得了所需的覆盖,但我仍然必须为解决方案中的每个项目执行此操作。如果有人添加了新项目,他们必须记住添加此自定义。我不喜欢这样,但可能我现在可以忍受。

我尝试使用" CustomAfterMicrosoftCommonTargets"方法,但我无法从Visual Studio的预构建事件中设置此属性,即使在管理员没有帮助的情况下运行也是如此。 我试图在Pre-Build事件中设置一个具有相同名称的环境变量,但是在MSBuild执行时我从未获得新值。

谢谢!

1 个答案:

答案 0 :(得分:1)

最后,我找到了一个选项,我不必编辑单个项目文件。 我们的想法是在" AfterBuild"中调用您的自定义公共目标文件。 Visual Studio公开的事件。

IF "$(BuildingInsideVisualStudio)"=="true" (
$(MSBuildBinPath)\msbuild.exe "$(ProjectDir)CustomMSBuild.targets" /p:Configuration="$(Configuration)"/property:"ProjectUnderCompilation=$(MSBuildThisFileDirectory)$(MSBuildThisFile)"
)

所以我在编译时将项目作为属性传递并导入该项目文件。 如果我在自定义任务中抛出异常,它在父项目中显示为编译错误。 这非常有效,我能够对已通过的项目进行任何验证。

我看到的唯一不足之处是我正在产生另一个MSBuild.exe,而且到目前为止我还没有看到它在编译时的任何影响。

请让我知道您对此实施的看法。

<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003" DefaultTargets="MyTarget">
<UsingTask AssemblyFile="$(ProjectDir)\bin\TaskLibrary.dll" TaskName="CheckProjectReferences" />
<PropertyGroup>
    <ProjectUnderCompilation></ProjectUnderCompilation>
</PropertyGroup>
<Target Name="MyTarget">
    <Message Text="Inside MyTarget" Importance="High" />
    <CheckProjectReferences/>
</Target>
<Import Project="$(ProjectUnderCompilation)" />
</Project>