AppendTargetFrameworkToOutputPath 在 .targets 文件中失败

moh*_*eli 5 msbuild .net-core visual-studio-2017

我试图集中许多项目的一些构建配置,而 MSBuild 解决方案是使用.targetsfiles

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

<AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
Run Code Online (Sandbox Code Playgroud)

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

我该如何解决这个问题?

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

Leo*_*SFT 6

AppendTargetFrameworkToOutputPath 在 .targets 文件中失败

该属性AppendTargetFrameworkToOutputPath可以阻止MSBuild追加TargetFrameworkOutputPath,但是因为TargetFramework我们创建项目时已经生成了该文件夹,所以在添加到项目后我们需要手动删除TargetFramework文件夹<Import Project="PathToCommonTargets" />,否则该文件夹将一直存在,然后我们可以构建项目无需.TargetFrameworkOutputPath

如果TargetFramework删除后仍然生成该文件夹,则应将其内容加倍,.targets并且导入语句正确。为了确保它们,我在.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>
Run Code Online (Sandbox Code Playgroud)

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

更新:

您能帮我了解如何删除 TargetFramework 吗?

要实现此目的,请卸载您的项目。然后在项目的最后,在 end-tag 之前</project>,放置以下脚本:

<Target Name="RemoveDirectories" AfterTargets="Build">  
    <RemoveDir  
        Directories="$(ProjectDir)$(OutDir)" /> 
</Target> 
Run Code Online (Sandbox Code Playgroud)

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

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

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

 <RemoveDir  
    Directories="$(ProjectDir)$(OutDir)" />  
Run Code Online (Sandbox Code Playgroud)

希望这可以帮助。