繁体   English   中英

csproj 包括基于列表(批处理)的(递归)文件夹

[英]csproj include (recursive) folders based on a list (batching)

我想将一些文件递归地添加到位于我的解决方案根目录中的文件夹中的单个项目。

现在,我找到了一个可行的解决方案来通过手动指定每个文件夹来添加这些文件:

  <ItemGroup>
    <Content Include="..\Folder1\**\*">
        <Link>Folder1\%(RecursiveDir)\%(Filename)%(Extension)</Link>
    </Content>
    <Content Include="..\Folder2\**\*">
        <Link>Folder2\%(RecursiveDir)\%(Filename)%(Extension)</Link>
    </Content>
    <Content Include="..\Folder3\**\*">
        <Link>Folder3\%(RecursiveDir)\%(Filename)%(Extension)</Link>
    </Content>
  </ItemGroup>

由于这些可能是一些文件夹,并且它们可能因我的解决方案而异,因此我希望有一个简单的列表来定义文件夹名称。

是这样的:

  <PropertyGroup>
    <DefinedResourceFolders>Folder1;Folder2;Folder3</DefinedResourceFolders>
  </PropertyGroup>

这也允许我在调用 msbuild扩展将要构建 output 的文件时直接将其作为属性输入。
我试图查看MSBuild 批处理文档和其他几个在线资源,但我无法弄明白。 我发现的大多数批处理示例都使用目标,而不是包含到解决方案项中。

这可能吗? 那么我将如何为内容定义<ItemGroup>呢?


PS:当添加新文件等时,我不关心.csproj文件的通配符问题。这将是一个只包含那些显示文件的“资源”项目,或者我正在使用我的外部.props文件无论如何都要导入到每个.csproj文件中。

假设您想要递归地包含文件夹root/Folder1root/Folder2root/Folder3中的所有文件。

这就是构建(VS 和 CLI)如何做你想做的。 但是,VS 不会将文件显示为项目的一部分。

<Project Sdk="Microsoft.NET.Sdk" InitialTargets="__AddBatchedContent;$(InitialTargets)">
  <!-- the usual properties -->

  <!-- You could of course define the folder array directly in an Item,
       but this is what you wanted :-) -->
  <PropertyGroup>
    <Lookups>Folder1;Folder2;Folder3</Lookups>
  </PropertyGroup>
  <ItemGroup>
    <LookupDir Include="$(Lookups)" />
  </ItemGroup>

  <Target Name="__AddBatchedContent">
    <ItemGroup>
      <!-- save the original source folder of the globbed file name in custom
           metadata "Folder" so we can use it later as its output base folder -->
      <__BatchedFiles Include="..\%(LookupDir.Identity)\**\*" Folder="%(LookupDir.Identity)" />
      <Content Include="@(__BatchedFiles)" Link="%(Folder)\%(RecursiveDir)\%(Filename)%(Extension)" CopyToOutputDirectory="Always" />
    </ItemGroup>
  </Target>

</Project>

请注意,如果您想将其放在 a.targets 文件中以在多个项目中使用此技术,则应将..\替换为$(MSBuildThisFileDirectory)..\以便路径相对于(已知)位置.targets 文件而不是导入项目的(未知)位置。

感谢@Ilya Kozhevnikov 提供此答案的基础

您不是唯一希望这更简单的人:-): https://github.com/do.net/msbuild/issues/3274

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM