You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Visual Studio项目打包NuGet包时如何忽略指定文件夹?

当然可行!你之前踩的坑我也遇到过,大概率是没搞清楚<file><contentFile>的正确用法,或者没找对从根源控制打包内容的方式。给你几个靠谱的解决方案:

方案1:直接修改项目文件(最推荐)

NuGet打包默认会包含项目里标记为Compile的文件,所以我们可以直接在.csproj里精准控制哪些文件参与打包:

  • 彻底排除Folder B的所有.cs文件:
    在项目文件中添加这段XML:
    <ItemGroup>
      <Compile Remove="FolderB\**\*.cs" />
    </ItemGroup>
    
  • 或者反过来,明确指定只包含Folder A和C的文件(适合文件结构复杂的情况):
    <ItemGroup>
      <!-- 先移除所有.cs文件 -->
      <Compile Remove="**\*.cs" />
      <!-- 再添加需要的文件夹下的文件 -->
      <Compile Include="FolderA\**\*.cs" />
      <Compile Include="FolderC\**\*.cs" />
    </ItemGroup>
    

这样打包出来的NuGet包,只会包含你指定文件编译后的程序集,完全不会带上Folder B的内容。

方案2:正确配置nuspec文件

你之前用<file>没达到预期,是因为它默认是用来添加非编译的额外文件(比如文档、配置),如果要让A/C的.cs作为源码包被引用项目编译,得这么写:

<files>
  <!-- 分别指定要包含的文件夹,直接排除FolderB -->
  <file src="FolderA\**\*.cs" target="content\FolderA" />
  <file src="FolderC\**\*.cs" target="content\FolderC" />
  <!-- 或者用exclude参数批量排除 -->
  <file src="**\*.cs" exclude="FolderB\**\*.cs" target="content" />
</files>

至于<contentFile>,它主要是给.NET Core/.NET 5+项目用的,需要先在项目文件里把文件标记为Content类型,再在nuspec里配置,一般用来做嵌入资源或复制到输出目录,不太适合你现在的场景。

方案3:打包命令行直接指定排除项

如果不想修改任何配置文件,可以在打包时用命令行参数直接排除Folder B:

dotnet pack --exclude-files "FolderB/**/*.cs"

如果你用Visual Studio打包,也可以在项目属性的「NuGet包」选项卡中,找到「排除文件」的设置项,添加FolderB\**\*.cs即可。

小提示:打包完成后,建议用NuGet Package Explorer打开包文件,检查一下内容是否符合预期,避免踩坑。

内容的提问来源于stack exchange,提问作者Icaroto

火山引擎 最新活动