2014-05-12 34 views
3

我有自定义MSBuild任务后执行:AfterBuild事件为解决方案中的每个项目。 我不想将每个项目文件修改为: 一旦我修改了Visual Studio(VS 2012 Ultimate)中的项目,说添加或删除文件/引用,Visual Studio就会清除所有对项目文件所做的自定义更改。MSBuild - 执行自定义目标无w/o修改单个项目

我不想用“CustomAfterMicrosoftCommonTargets”提到here,因为没有办法,而从Visual Studio构建通过这个命令行参数:

msbuild.exe app.proj /属性:CustomAfterMicrosoftCommonTargets = custom.target

我找到了一个解决方案here,但我并不完全明白。 任何人都可以请详细说明或帮助我找出更好的解决方案吗?

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

我试图使用“CustomAfterMicrosoftCommonTargets”方法,但我无法从Visual Studio的Pre-build事件中设置此属性,即使以管理员身份运行也没有帮助。 我试图从Pre-Build事件中设置一个具有相同名称的环境变量,但在执行MSBuild时我从未获得新值。

谢谢!

+1

您确定VS是否覆盖您对项目文件的更改?我已经在所有项目中使用了VS2012和2013以及自定义目标,并且从未遇到VS移除我的目标的问题。 –

+0

^Seva说什么:如果VS修改你的项目文件,你做错了什么。也许显示你如何尝试在项目文件中实现你的自定义目标? – stijn

+0

我想,如果您没有在管理模式下运行,Visual Studio会消除您的自定义更改。切换到管理员模式后,我的更改现在保留。不过,我希望有一个解决方案,而不是修改解决方案中的每个单独项目。 –

回答

1

最后我发现了一个选项,我不必编辑单个项目文件。 这个想法是在Visual Studio公开的“AfterBuild”事件中调用自定义公共目标文件。

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> 
相关问题