链接Visual Studio中的其他文件

时间:2017-06-07 22:08:25

标签: visual-studio csproj

我想在Visual Studio 2017上的C#项目中包含stylecop.json。我已经想出了如何通过在任何文本编辑器中修改.csproj来实现这一点:

<AdditionalFiles Include="stylecop.json">
      <Link>stylecop.json</Link>
</AdditionalFiles>

我想知道是否有办法在不进行任何文本编辑的情况下执行此操作。我理解我可以像任何其他文件一样添加它,但是会在项目文件夹中复制文件,而不是在外部链接它。

1 个答案:

答案 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将缓存该文件,直到解决方案关闭。