在 Visual Studio 中链接其他文件

Sha*_*fiz 1 csproj visual-studio

我正在尝试将 stylecop.json 包含在 Visual Studio 2017 上的 C# 项目中。我已经弄清楚如何通过在任何文本编辑器中修改 .csproj 来实现此目的:

<AdditionalFiles Include="stylecop.json">
    <Link>stylecop.json</Link>
</AdditionalFiles>
Run Code Online (Sandbox Code Playgroud)

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

Mar*_*ich 7

您可以在解决方案目录中的某个位置添加一个Directory.Build.targets包含以下内容的文件(将应用于该目录或该目录下的所有项目):

    <Project>
      <ItemGroup>
        <AdditionalFiles Update="@(AdditionalFiles)">
          <Link Condition="'%(Link)' == ''">%(Identity)</Link>
       </AdditionalFiles>
      </ItemGroup>
    </Project>
Run Code Online (Sandbox Code Playgroud)

请注意,%(Identity)对于“项目锥”之外的项目,此处使用并不是最佳选择 - 例如,当您有<AdditionalFiles Include="..\..\foo.bar" />. 为此,您可以使用类似于基于 SDK 的项目在 VS 2017 15.3 / .net core 2.0 工具中执行的机制:

    <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>
Run Code Online (Sandbox Code Playgroud)

这甚至会保留与eg匹配的项目的目录层次结构,..\shared\**\*.json并且可以使用LinkBase元数据设置目标文件夹:

    <AdditionalFiles Include="..\shared\**\*">
      <LinkBase>SharedFiles</LinkBase>
    </AdditionalFiles>
Run Code Online (Sandbox Code Playgroud)

请注意,对 进行更改后,您可能需要关闭并重新打开解决方案Directory.Build.targets。在即将发布的 VS 2017 15.3 更新中,VS 将自动监控更改。在以前的版本中,该文件将被VS缓存,直到解决方案关闭。