我正在尝试集中许多项目的一些构建配置,为此,MSBuild解决方案是使用.targets
files。
我要应用于所有项目的一种配置是防止netcoreapp2.1
附加到所有输出目录。要实现这一目标,只需包含以下一行配置:
<AppendTargetFrameworkToOutputPath>false</AppendTargetFrameworkToOutputPath>
但是,当我将此行放入Common.targets
文件中,并使用.csproj
将该文件包含在我的<Import Project="PathToCommonTargets" />
文件中时,它没有任何作用,我仍然得到{{ 1}}放在我的输出文件夹的末尾。
我该如何解决?
原因更新:
我们是一家与其他十多家公司成为技术合作伙伴的公司。也就是说,我们有一个用于基础结构的中央源控件(例如映射到netcoreapp2.1
),而对于每个公司,都有一个单独的源控件(例如映射到C:\Infra
和C:\CompanyA
等) 。),最多可能包含100个解决方案,每个解决方案可能包含10个以上的项目。因此,我们最优先的要求是通过使所有内容(从Angular,Java,Swift和.NET)干燥来尽可能地降低成本。基于持续改进的精神,我们不希望将我们的输出放入C:\CompanyB
中超过2000个项目文件中(并且不断增加),以减少开发人员花在进入输出文件夹中的时间,并且不希望将其重构为更高的水平。 .NET版本更容易且更便宜。要从\bin\Debug\netcoreapp2.1
升级到netcoreapp2.0
,我们会遇到噩梦,因为自动化中存在输出路径。这就是为什么我们尝试使用netcoreapp2.1
。但是我真的很沮丧,为什么事情应该如此具有挑战性。对我而言,MSBuild应该首先加载所有内容,然后开始构建。这样,布尔属性将在构建流水线中随处可见,并且不需要配置那么多的复杂性。毕竟,如果布尔属性需要花费超过AppendTargetFrameworkToOutputPath
来配置,那么它有什么用?
答案 0 :(得分:2)
.targets文件中的AppendTargetFrameworkworkToOutputPath失败
属性AppendTargetFrameworkToOutputPath
可以阻止MSBuild将TargetFramework
附加到OutputPath
,但是由于在创建项目时已经生成了TargetFramework
文件夹,因此我们需要将<Import Project="PathToCommonTargets" />
添加到项目后,手动删除TargetFramework文件夹,否则该文件夹将始终存在,那么我们可以在不将TargetFramework
到OutputPath
的情况下构建项目。>
如果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)" />
希望这会有所帮助。