我正在尝试按照此处的文档https://docs.microsoft.com/en-us/visualstudio/msbuild/how-to-extend-the-visual-studio-build-process?view=vs-2017进行操作,以将简单的Target添加到.NET Core项目文件的构建管道中。但是,我做错了,但看不到。
我已经获取了一个简单的“ Hello World”项目文件,添加了一个仅打印消息的简单目标,并按照文档建议重新定义了BuildDependsOn
来获取:
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp2.2</TargetFramework>
<BuildDependsOn>
Target1;
$(BuildDependsOn)
</BuildDependsOn>
</PropertyGroup>
<Target Name="Target1">
<Message Text="Running Target1" Importance="high" />
</Target>
</Project>
当我尝试使用msvc2017或dotnet CLI(“ dotnet build -c Release Hello.csproj”)“构建”该项目时,该消息不会打印。
当我使用msbuild查看经过完全预处理的项目时,我可以清楚地看到BuildDependsOn
属性的定义。我不确定为什么我的重新定义没有用。我还尝试过对RebuildDependsOn
进行同样的操作,但效果相同。
有什么建议吗?我在这里想念什么?
预先感谢您的帮助!
答案 0 :(得分:2)
之所以无法正常工作,是因为您有一个SDK风格的项目:<Project Sdk="Microsoft.NET.Sdk">
。
请注意,
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<TargetFramework>net46</TargetFramework>
</PropertyGroup>
</Project>
等效于此:
<Project>
<!-- Implicit top import -->
<Import Project="Sdk.props" Sdk="Microsoft.NET.Sdk" />
<PropertyGroup>
<TargetFramework>net46</TargetFramework>
</PropertyGroup>
<!-- Implicit bottom import -->
<Import Project="Sdk.targets" Sdk="Microsoft.NET.Sdk" />
</Project>
在项目结束时隐式导入Sdk.targets
会覆盖BuildDependsOn
的定义。
您可以改为显式添加导入,然后在BuildDependsOn
导入之后添加Sdk.targets
的定义。
<Project>
<Import Project="Sdk.props" Sdk="Microsoft.NET.Sdk" />
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>netcoreapp2.2</TargetFramework>
</PropertyGroup>
<Target Name="Target1">
<Message Text="Running Target1" Importance="high" />
</Target>
<Import Project="Sdk.targets" Sdk="Microsoft.NET.Sdk" />
<PropertyGroup>
<BuildDependsOn>
Target1;
$(BuildDependsOn)
</BuildDependsOn>
</PropertyGroup>
</Project>
请参见How to: Extend the Visual Studio build process和How to: Use MSBuild project SDKs。
答案 1 :(得分:0)
我更喜欢添加一个依赖于其他内容的构建目标的方法是whenComplete
和BeforeTargets
。
记录在这里:
https://docs.microsoft.com/en-us/visualstudio/msbuild/target-build-order?view=vs-2017
我认为这要简单得多,并且我添加的XML可能更少。
AfterTargets