您可以在解决方案目录的某处添加Directory.Build.targets 文件(将应用于该目录下的所有项目),内容如下:
<Project>
<ItemGroup>
<AdditionalFiles Update="@(AdditionalFiles)">
<Link Condition="'%(Link)' == ''">%(Identity)</Link>
</AdditionalFiles>
</ItemGroup>
</Project>
请注意,此处使用 %(Identity) 对于“项目锥”之外的项目不是最佳选择 - 例如。当你有<AdditionalFiles Include="..\..\foo.bar" />。为此,您可以使用类似于 VS 2017 15.3 / .net core 2.0 工具中的 SDK-based projects will do 的机制:
<Project>
<ItemGroup>
<AdditionalFiles Update="@(AdditionalFiles)">
<LinkBase Condition="'%(LinkBase)' != ''">$([MSBuild]::EnsureTrailingSlash(%(LinkBase)))</LinkBase>
<Link Condition="'%(Link)' == '' And !$([MSBuild]::ValueOrDefault('%(FullPath)', '').StartsWith($([MSBuild]::EnsureTrailingSlash($(MSBuildProjectDirectory)))))">%(LinkBase)%(RecursiveDir)%(Filename)%(Extension)</Link>
</AdditionalFiles>
</ItemGroup>
</Project>
这甚至会保留与例如匹配项的目录层次结构。 ..\shared\**\*.json 和目标文件夹可以使用 LinkBase 元数据设置:
<AdditionalFiles Include="..\shared\**\*">
<LinkBase>SharedFiles</LinkBase>
</AdditionalFiles>
请注意,对Directory.Build.targets 进行更改后,您可能需要关闭并重新打开解决方案。在即将到来的 VS 2017 15.3 更新中,VS 将自动监控更改。在以前的版本中,文件会被 VS 缓存,直到解决方案关闭。