我想在Visual Studio 2017上的C#项目中包含stylecop.json。我已经想出了如何通过在任何文本编辑器中修改.csproj来实现这一点:
<AdditionalFiles Include="stylecop.json">
<Link>stylecop.json</Link>
</AdditionalFiles>
我想知道是否有办法在不进行任何文本编辑的情况下执行此操作。我理解我可以像任何其他文件一样添加它,但是会在项目文件夹中复制文件,而不是在外部链接它。
答案 0 :(得分:3)
您可以在解决方案目录的某处添加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将缓存该文件,直到解决方案关闭。