【发布时间】:2021-09-30 05:43:05
【问题描述】:
我正在尝试创建一个 msbuild csproj,我可以在其中调用 dotnet run myproject 并在执行后删除 bin/obj 文件夹。 但是,CustomAfterRun 目标(如下)不会在 Run 目标之后执行。
<Project Sdk="Microsoft.NET.Sdk">
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net5.0</TargetFramework>
<EnableDefaultItems>false</EnableDefaultItems>
</PropertyGroup>
<ItemGroup>
<Compile Include="Program.cs" />
</ItemGroup>
<Target Name="CustomAfterRun" AfterTargets="Run">
<Message Importance="high" Text="[msbuild] Cleaning bin and obj..."/>
<RemoveDir Directories="$(TargetDir)" />
<RemoveDir Directories="$(ProjectDir)$(BaseIntermediateOutputPath)" />
</Target>
</Project>
如果我创建一个目标CustomAfterBuild(使用AfterTargets="Build"),它可以正常工作(当我运行dotnet build myproj 时它会在构建后执行)。
这是一个错误还是我做错了什么?
还有最疯狂的部分:如果在CustomAfterBuild 内部调用<CallTarget Targets="Run" />,那么在构建之后调用我的程序,在这种情况下CustomAfterRun 运行良好!这种方法的缺点是程序输出只有在我启用详细的详细级别时才可见,并且在 CustomAfterRun 运行(删除 bin/obj 文件夹)之后,它也会尝试再次运行程序(意味着运行目标是两次调用?!)给我一个错误:System.ComponentModel.Win32Exception (2): The system cannot find the file specified.。
编辑:作为替代方案,我也尝试覆盖 Run 目标,但这根本不起作用:
<Project>
<Import Project="Sdk.props" Sdk="Microsoft.NET.Sdk" />
<PropertyGroup>
<OutputType>Exe</OutputType>
<TargetFramework>net5.0</TargetFramework>
<EnableDefaultItems>false</EnableDefaultItems>
</PropertyGroup>
<ItemGroup>
<Compile Include="Program.cs" />
</ItemGroup>
<Import Project="Sdk.targets" Sdk="Microsoft.NET.Sdk" />
<Target Name="Run" >
<Message Importance="high" Text="[msbuild] overriden..."/>
</Target>
</Project>
【问题讨论】:
标签: msbuild msbuild-task