如何在.NET Core/Standard项目中排除文件/文件夹?

77
在 .NET Core 和 .NET Standard 项目中,如果您将文件和文件夹放在项目目录中,它们会被 Visual Studio 自动识别为项目的一部分。如果我有那些并不是项目本身(在代码或内容方面)的文件/文件夹,除了彻底删除它们,是否有一种方法可以像针对完整 .NET Framework 的项目一样将它们从项目中排除?

你可以为每个文件设置 CopyToOutputFolder 属性为 Never - VMAtm
5个回答

120

在csproj文件中还有几件事情可以做,以确保文件不被捡起:

1)确保没有寻找“项目项”的任何全局模式会捡起这些文件:

<PropertyGroup>
  <DefaultItemExcludes>$(DefaultItemExcludes);your_nonproj.file;a\**\*.pattern</DefaultItemExcludes>
</PropertyGroup>

2) 明确删除项目:

<ItemGroup>
  <None Remove="hidden.file" />
  <Content Remove="wwwroot\lib\**\*" />
</ItemGroup>

请注意,在大型目录(文件数量较多)中,使用DefaultItemExcludes和folder\**模式会更快,因为msbuild将完全跳过遍历该目录。 使用remove仍然会让msbuild花费很长时间来发现文件。


以下作为默认值并在每个包含的文件中使用包含信息是否有任何问题?会对性能产生影响吗? <DefaultItemExcludes>**;$(DefaultItemExcludes)</DefaultItemExcludes> - Emil
9
在大目录(文件数量很多)中,使用带有the\folder\**模式的DefaultItemExcludes会更快,因为msbuild将完全跳过遍历该目录。如果使用删除操作,msbuild仍然需要花费相当长的时间来发现文件。 - Martin Ullrich
1
我不得不使用 <Compile Remove="otherproject\**\*" /> 来使它能够在一个项目位于另一个子文件夹中时进行构建。 - Segfault

36

只为完整起见,如果您正在使用 ItemGroup 来排除文件夹,则:

<ItemGroup>
  <Content Remove="excluded_folder\**" />
  <Compile Remove="excluded_folder\**" />
  <EmbeddedResource Remove="excluded_folder\**" />
  <None Remove="excluded_folder\**" />
</ItemGroup>

因为我的angular项目有一个名为node_modules的文件夹,其中路径非常长,而VS一直在抛出异常。使用<Content Remove="node_modules\**\*" />也没有起作用。


1
正如 @MartinUllrich 所述,最好使用 <DefaultItemExcludes>(特别是对于 node_modules),因为它将防止编译器甚至查找那些目录,这将显著减少构建时间(在 node_modules 的情况下)。 - Sensei_Shoh
我发布的配置文件做了同样的事情。<Compile Remove="excluded_folder\**" /> 防止编译器甚至查看那些目录 - Xpleria
1
其实,我认为你对此事的看法是错误的,它们并不相同。正如 @MartinUllrich 所述,“对于这个过程使用 remove 仍然会让 msbuild 花费相当长的时间来发现文件”。像你在这里所使用的 Remove 可能会防止 VS 向你抛出错误,但它仍然会影响到你的构建时间。另外,你遗漏了 Content,所以如果在排除的文件夹中有 “content” 文件,它们仍然会被包含。在我看来, <DefaultItemExcludes> 又赢了一局,因为你只需要指定一次要排除的 glob,而不是像你所展示的那样为每种项目类型都指定一次。 - Sensei_Shoh
1
另外,我想明确一点,我并不是说你永远不应该使用 Remove。显然,它们都很有用。我只是想说,在排除那些从未出现在构建中的文件/文件夹(例如 node_modules)时,Remove 不是正确的工具,最好使用 DefaultItemExcludes - Sensei_Shoh
2
@Sensei_Shoh 我喜欢这个答案的原因是我似乎无法让我的dotnet5数据库<Project Sdk="MSBuild.Sdk.SqlProj/1.16.2">完全遵守<DefaultItemExcludes>,所以我必须用这种方式来解决。 - CrazyPyro

16

在Visual Studio中打开项目,右键单击解决方案资源管理器中的文件和文件夹。选择从项目中排除

对于 .NET Framework 目标项目来说,这正是所要做的。


14
那么对于我们这些使用 Visual Studio Code,以 .NET Core/.NET Standard 为目标的人来说呢? - henry700
3
编辑项目文件,在<PropertyGroup>部分添加以下设置:<DefaultItemExcludes>[文件夹路径]/**;$(DefaultItemExcludes)</DefaultItemExcludes>。 - MesfinMoges
尝试使用包含17k+用户上传子目录的文件夹进行操作,它永远无法完成。 - Jaroslav Daníček

7
如果你想要在编译过程中排除文件,但仍然希望在解决方案资源管理器中保留它们,那么
<ItemGroup>
    <Compile Remove="Templates\**" />
    <Content Include="Templates\**" />
</ItemGroup>

模板是文件夹名称(在这种情况下),其中的所有内容将被编译器忽略,但包含在VS中。

-2
我发现唯一可行的选择是不幸地从项目中排除。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接