首页 > 解决方案 > 我已经从 MSBUILD 中排除了 node_modules,但它仍然遍历目录并且需要永远

问题描述

在某些时候,我的项目构建开始需要很长时间。它不是一个大项目,它与项目根目录直接相关node_modules,并且被排除在项目之外!

<PropertyGroup>
  <DefaultInstallExcludes>packages\**</DefaultInstallExcludes>
  <DefaultInstallExcludes>$(DefaultInstallExcludes);**\node_modules\**;node_modules\**</DefaultInstallExcludes> 
</PropertyGroup>

<ItemGroup>     
  <InstallInclude Include="**\*.ascx" Exclude="$(DefaultInstallExcludes)" />
  <InstallInclude Include="**\*.asmx" Exclude="$(DefaultInstallExcludes)" />
  <InstallInclude Include="**\*.css" Exclude="$(DefaultInstallExcludes)" />
  <InstallInclude Include="**\*.html" Exclude="$(DefaultInstallExcludes)" />
  <InstallInclude Include="**\*.aspx" Exclude="$(DefaultInstallExcludes)" />
  <InstallInclude Include="**\*.js" Exclude="$(DefaultInstallExcludes)" />
  <InstallInclude Include="**\images\**" Exclude="$(DefaultInstallExcludes)" />      
</ItemGroup>

似乎它正确地排除了所有文件,但它仍在扫描整个目录。如何让它node_modules在构建过程中完全忽略该文件夹?工具版本为 3.5。这过去需要 <30 秒,并且在某个时候开始需要约 10 分钟。VS 社区 2019。

标签: asp.netvisual-studiomsbuildmsbuild-task

解决方案


我认为问题在于InstallInclude您的自定义项目而不是系统项目。并且大多数文件node_modules是系统项目,如NoneContent。这些显示在解决方案资源管理器上,并由 msbuild 扫描。

本文档下列出了系统构建操作。

您所做的是使新InstallInclude项目不包含来自node_modules和的文件packages。但是系统项目包含node_modules文件夹,所以它会一直扫描文件夹。

建议

您应该从系统项目中排除该文件夹。

对于 new-sdk 项目,DefaultItemExcludes确实有效,但不适用于网络框架项目。

如果您的项目目标为Net Framework,则应使用任何系统项 remove 来删除这些文件。

用这个:

<ItemGroup>
      <Content Remove="node_modules\**" />
      <Compile Remove="node_modules\**" />
      <EmbeddedResource Remove="node_modules\**" />
      <None Remove="node_modules\**" />
      <Compile Remove=node_modules\**" />
      <TypeScriptCompile Remove="node_modules\**" />
    
    
      .... any system item
    
    </ItemGroup>



    <PropertyGroup>
      <DefaultInstallExcludes>packages\**</DefaultInstallExcludes>
      <DefaultInstallExcludes>$(DefaultInstallExcludes);**\node_modules\**;node_modules\**</DefaultInstallExcludes> 
    </PropertyGroup>
    
    <ItemGroup>     
      <InstallInclude Include="**\*.ascx" Exclude="$(DefaultInstallExcludes)" />
      <InstallInclude Include="**\*.asmx" Exclude="$(DefaultInstallExcludes)" />
      <InstallInclude Include="**\*.css" Exclude="$(DefaultInstallExcludes)" />
      <InstallInclude Include="**\*.html" Exclude="$(DefaultInstallExcludes)" />
      <InstallInclude Include="**\*.aspx" Exclude="$(DefaultInstallExcludes)" />
      <InstallInclude Include="**\*.js" Exclude="$(DefaultInstallExcludes)" />
      <InstallInclude Include="**\images\**" Exclude="$(DefaultInstallExcludes)" />      
    </ItemGroup>
    

从 tsconfig 文件中排除:

修改tsconfig.json

{
  "compilerOptions": {
   ....
  },
  "include": [
   ...
  ],
  "exclude": [
    "node_modules"
  ],

.....
}

修改tsconfig.spec.json文件:

{
  "extends": "./tsconfig.json",
  "compilerOptions": {
    "outDir": "./out-tsc/spec",
    "types": [
      "jasmine"
    ]
  },
  "files": [
   ....
  ],
  "include": [
    ....
  ],
  "exclude": [
    "node_modules/**/*"
  ]
  
}

推荐阅读