.targets文件中的AppendTargetFrameworkToOutputPath失败

时间:2018-12-05 14:39:11

标签: msbuild .net-core visual-studio-2017

我正在尝试集中许多项目的一些构建配置,为此,MSBuild解决方案是使用.targets files

我要应用于所有项目的一种配置是防止netcoreapp2.1附加到所有输出目录。要实现这一目标,只需包含以下一行配置:

<AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>

但是,当我将此行放入Common.targets文件中,并使用.csproj将该文件包含在我的<Import Project="PathToCommonTargets" />文件中时,它没有任何作用,我仍然得到{{ 1}}放在我的输出文件夹的末尾。

我该如何解决?

原因更新: 我们是一家与其他十多家公司成为技术合作伙伴的公司。也就是说,我们有一个用于基础结构的中央源控件(例如映射到netcoreapp2.1),而对于每个公司,都有一个单独的源控件(例如映射到C:\InfraC:\CompanyA等) 。),最多可能包含100个解决方案,每个解决方案可能包含10个以上的项目。因此,我们最优先的要求是通过使所有内容(从Angular,Java,Swift和.NET)干燥来尽可能地降低成本。基于持续改进的精神,我们不希望将我们的输出放入C:\CompanyB中超过2000个项目文件中(并且不断增加),以减少开发人员花在进入输出文件夹中的时间,并且不希望将其重构为更高的水平。 .NET版本更容易且更便宜。要从\bin\Debug\netcoreapp2.1升级到netcoreapp2.0,我们会遇到噩梦,因为自动化中存在输出路径。这就是为什么我们尝试使用netcoreapp2.1。但是我真的很沮丧,为什么事情应该如此具有挑战性。对我而言,MSBuild应该首先加载所有内容,然后开始构建。这样,布尔属性将在构建流水线中随处可见,并且不需要配置那么多的复杂性。毕竟,如果布尔属性需要花费超过AppendTargetFrameworkToOutputPath来配置,那么它有什么用?

1 个答案:

答案 0 :(得分:2)

  

.targets文件中的AppendTargetFrameworkworkToOutputPath失败

属性AppendTargetFrameworkToOutputPath可以阻止MSBuild将TargetFramework附加到OutputPath,但是由于在创建项目时已经生成了TargetFramework文件夹,因此我们需要将<Import Project="PathToCommonTargets" />添加到项目后,手动删除TargetFramework文件夹,否则该文件夹将始终存在,那么我们可以在不将TargetFrameworkOutputPath的情况下构建项目。

如果TargetFramework文件夹在删除后仍然生成,则应将.targets的内容加倍,并且import语句正确。为了确保它们,我在.target文件中添加了一个测试自定义目标:

<?xml version="1.0" encoding="utf-8"?>

<Project xmlns="http://schemas.microsoft.com/developer/msbuild/2003">

  <PropertyGroup>    
    <AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath> 
  </PropertyGroup>

  <Target Name="Test" AfterTargets="Build">
    <Message Text="This is Test Custom Target!"></Message>
  </Target>

</Project>

构建项目时,我们可以在输出窗口中看到消息信息,这意味着.targets的内容和import语句正确。

更新

  

请问您如何删除TargetFramework?

要实现此目的,请卸载您的项目。然后在项目的最后,在结束标签</project>之前,放在脚本下面:

<Target Name="RemoveDirectories" AfterTargets="Build">  
    <RemoveDir  
        Directories="$(ProjectDir)$(OutDir)" /> 
</Target> 

此外,您需要将TargetFramework中的文件备份到bin \ debug或bin \ release文件夹,因此我们还需要在删除任务之前执行复制任务:

<ItemGroup>  
    <MySourceFiles Include="$(ProjectDir)$(OutDir)\*.*"/>  
</ItemGroup> 

<Copy  
    SourceFiles="@(MySourceFiles)"  
    DestinationFolder="$(ProjectDir)bin\$(ConfigurationName)"  
 /> 

 <RemoveDir  
    Directories="$(ProjectDir)$(OutDir)" />  

希望这会有所帮助。