也许自原回答发布以来,MSBuild已经发生了变化,但是现在可以同时使用通配符和链接。例如,在C#项目中,我使用以下代码块将数据文件导入测试库。
<ItemGroup>
<None Include="..\SOMENAME.Tests\data\**\*.*">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
<Link>data\%(RecursiveDir)%(Filename)%(Extension)</Link>
</None>
</ItemGroup>
到目前为止,我所看到的唯一不利之处是MSBuild会重新创建文件系统上的文件夹名称(即$(ProjectPath)\data\somesubfolder
),这有点烦人但并不是一个很大的问题。
作为一个测试,我还尝试了OP的请求,使用以下代码片段嵌入资源,同样地,这似乎也能正常工作——dotPeek显示编译后程序集中存在资源,同时在解决方案资源管理器中也存在。
<ItemGroup>
<EmbeddedResource Include="..\SOMENAME.Tests\data\**\*.*">
<Link>resources\%(RecursiveDir)%(Filename)%(Extension)</Link>
</EmbeddedResource>
</ItemGroup>
(这是使用 Visual Studio 2013,截至 VS2019 仍然有效)
2021年6月8日更新:上述语法适用于旧式 csproj 文件,但如果您正在使用新的 SDK 格式,则语法略有不同,尽管更简单。
使用以下内容可以实现 OP 的原始问题中的通配符嵌入
<ItemGroup>
<EmbeddedResource Include="data\**\*.*" />
</ItemGroup>
同时对于被更改或丢失的文件进行通配符文件复制。
<ItemGroup>
<None Update="data\**\*.*">
<CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
</None>
</ItemGroup>