【问题标题】:Include Files using Wildcard into a folder in Visual Studio使用通配符将文件包含到 Visual Studio 中的文件夹中
【发布时间】:2009-09-01 20:04:32
【问题描述】:

我正在使用

<ItemGroup>
  <EmbeddedResource Include="..\..\resources\hbm\*.hbm.xml" />
</ItemGroup>

将一堆 xml 文件包含到我的 C# 项目中。工作正常。

但是,我不希望它们在我的项目的“根级别”中,我宁愿在我的项目的子文件夹中看到它们。

例如,此文件包含在 Visual Studio 中的 Mapping 文件夹中:

<ItemGroup>
  <EmbeddedResource Include="Mapping\User.hbm.xml" />
</ItemGroup>

这就是我想要的 *.hbm.xml 文件。

我不知道该怎么做,仍然保留我的通配符 *.hbm.xml 部分,并将实际文件保存在不同的目录中。

我查看了 MSDN 关于 MSBUILD 和项目的文档,但没有运气。

【问题讨论】:

    标签: visual-studio msbuild


    【解决方案1】:

    自发布原始答案以来,这可能在 MSBuild 中发生了变化,但可以同时使用通配符和链接。例如,我在 C# 项目中使用以下块将数据文件导入测试库。

    <ItemGroup>
      <None Include="..\SOMENAME.Tests\data\**\*.*">
        <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
        <Link>data\%(RecursiveDir)%(Filename)%(Extension)</Link>
      </None>
    </ItemGroup>
    

    到目前为止,我看到的唯一缺点是 MSBuild 会在文件系统上重新创建文件夹名称(即 $(ProjectPath)\data\somesubfolder),这有点烦人,但不是一个大问题。

    作为测试,我还尝试了 OP 的嵌入资源请求,使用以下 sn-p,这似乎工作正常 - dotPeek 显示除了存在于解决方案中之外,资源还存在于编译的程序集中探险家。

    <ItemGroup>
      <EmbeddedResource  Include="..\SOMENAME.Tests\data\**\*.*">
          <Link>resources\%(RecursiveDir)%(Filename)%(Extension)</Link>
      </EmbeddedResource>
    </ItemGroup>
    

    (这是使用 Visual Studio 2013 并且自 VS2019 起仍然有效)

    2021 年 8 月更新:上述语法适用于旧式 csproj 文件,但如果您使用新的 SDK 格式,语法会有些不同,尽管更简单。

    OP原来的通配符嵌入问题可以通过以下方式完成

    <ItemGroup>
      <EmbeddedResource Include="data\**\*.*" />
    </ItemGroup>
    

    并为更改或丢失的文件提供通配符文件副本。

    <ItemGroup>
      <None Update="data\**\*.*">
        <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      </None>
    </ItemGroup>
    

    【讨论】:

    • 我可以确认,这适用于 Visual Studio 2015 Update 3。
    • 仍然适用于 Visual Studio 2019 (16.9.1) 中的 .Net 5 项目。
    【解决方案2】:

    我认为你不能同时使用链接和通配符。

    您可以使用此表示法将 User.hbm.xml 文件链接到 Visual Studio 的 Mapping 文件夹中:

    <ItemGroup>
      <EmbeddedResource Include="..\..\resources\hbm\User.hbm.xml">
        <Link>Mapping\User.hbm.xml</Link>
      </EmbeddedResource>
    </ItemGroup>
    

    但你不能这样做

    <ItemGroup>
      <EmbeddedResource Include="..\..\resources\hbm\**\*.hbm.xml">
        <Link>%(RecursiveDir)\%(Filename)%(Extension)</Link>
      </EmbeddedResource>
    </ItemGroup>
    

    【讨论】:

    • 我决定只写一个脚本来更新我的 CSPROJ 文件。我在我的 msbuild 脚本中将其添加为 Exec 任务。工作正常,但有点恶心。
    • 愿意分享脚本吗? :-)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-03-23
    • 2016-06-22
    • 1970-01-01
    • 2010-10-19
    • 2015-10-21
    • 2015-03-08
    • 1970-01-01
    相关资源
    最近更新 更多