MSBuild - 在不修改单个项目的情况下执行自定义目标

标签 msbuild

我有自定义 MSBuild 任务要在解决方案中的每个项目的 : AfterBuild 事件之后执行。 我不想将每个项目文件修改为: 一旦我在 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 执行时我从未获得新值。

谢谢!

最佳答案

最后我找到了一个选项,在其中我不必编辑单个项目文件。 这个想法是在 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>

关于MSBuild - 在不修改单个项目的情况下执行自定义目标,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23613533/

相关文章:

msbuild - 如何将 NuGet contentFiles 提取到特定目录?

.NET 相当于 Maven Parent Pom/依赖管理

asp.net - 如何通过MsDeploy在部署过程中排除Web.Config

regex - MSBuild RegexMatch 不匹配

TFS Build 未找到 Dll

visual-studio - MSBuild:包含自定义资源文件作为嵌入资源

visual-studio-2010 - 在解决方案文件上调用 TransformWebConfig

msbuild - 是否可以避免本地安装并使用 WiX 的平面文件?

.net - 使用 MSBuild 在 Server 2016 上构建面向 .Net 4.0 的 ASP.Net 项目

visual-studio - VS2017 中 Web Site 项目的 "Property Pages"选项存储在哪里?