新的 .csproj 格式 - 如何将整个目录指定为子目录的 "linked file"?

New .csproj format - How to specify entire directory as "linked file" to a subdirectory?

使用新 .csproj 格式(以及旧格式),可以将文件添加为 linked 到项目文件夹之外:

 <EmbeddedResource Include="..\..\..\Demo\Sample.cs" Link="Resources\Sample.cs" />

也可以使用 glob 模式来包含多个文件:

<EmbeddedResource Include="..\..\..\Demo\*.cs" />

但是如何将两者结合起来呢?

我试过的

  1. <EmbeddedResource Include="..\..\..\Demo\*.cs" Link="Resources\*.cs" />
  2. <EmbeddedResource Include="..\..\..\Demo\*.cs" Link="Resources\*" />
  3. <EmbeddedResource Include="..\..\..\Demo\*.cs" Link="Resources\" />

前两个仅创建一个 linked 文件(名称分别为 *.cs*)。第三个简单地出错了。

有没有办法将 globbing 与 linked 文件结合到目标项目中的特定位置?如果没有,我怎么能 link 目录中的所有文件而不知道有多少或它们的名字是什么?

虽然以前在使用 glob 扩展 (Link="Resources\%(RecursiveDir)%(Filename)%(Extension)") 时使用 %(RecursiveDir) 元数据是可能的,但 2.0.0 版的 .NET Core SDK 允许使用新的 LinkBase元数据:

<EmbeddedResource Include="..\..\..\Demo\**\*.cs" LinkBase="Resources" />

请注意,除了最近发布的VS 2017 15.3之外,您还需要安装2.0.0(并确保没有global.json选择较低版本)。

它与 this pull request 一起引入,这可能是目前最好的文档。

我在这个 site 中得到了提示(将外部目录中的所有 svg-files 链接到 solution-subfolder)。只有 %(Parent.Filename) 对我不起作用(有一个 CS1508),所以我用 %(Filename)%(Extension).

替换了
<ItemGroup>
    <Parent Include="C:\Path\To\My\SVG\Dir\*.svg" />
    <EmbeddedResource Include="@(Parent)">
        <Link>Resources\%(Filename)%(Extension)</Link>
    </EmbeddedResource>
</ItemGroup>