如何在打包csproj时从NuGet包中排除程序集?

15
我想使用 "dotnet pack" 命令生成一个 NuGet 包,但我不想包含程序集文件。我的项目中没有代码,但调用 "dotnet pack" 命令会生成一个空程序集的包。
如何在使用 csproj 和 dotnet.exe 的情况下实现这一目标?
1个回答

23
您有两个选择:
  1. 使用 nuspec 文件代替 csproj。NuGet 对于打包 csproj 的支持不如直接使用 nuspec 灵活。请参见 https://learn.microsoft.com/zh-cn/nuget/quickstart/create-and-publish-a-package#create-the-nuspec-package-manifest-file
  2. 在您的 csproj 文件中,设置属性 <IncludeBuildOutput>false</IncludeBuildOutput> (添加到 PropertyGroup 部分)。这将指示“Pack”目标不将程序集添加到包中。请参见https://learn.microsoft.com/zh-cn/nuget/schema/msbuild-targets获取更多详细信息。

4
如果您想排除某些文件,那么使用IncludeBuildOutput的用法是什么样子的? - Bleh
3
请注意,您可以将第二种方法与 <Project Sdk="Microsoft.Build.NoTargets/1.0.26"/> 结合使用,以避免首先构建空程序集。 - binki
不幸的是,IncludeBuildOutput 似乎只被评估一次,而不是每个目标框架都评估一次。有什么办法可以排除特定 TFM 的构建输出吗?我想在我的包中使用这个 TFM,但是带有一个空的 lib 文件夹。 - Thomas Levesque
@ThomasLevesque 如果您想要排除特定框架的构建而不是其他框架,您可以使用<IncludeBuildOutput Condition=" '$(TargetFramework)' != 'net46' ">true</IncludeBuildOutput>或类似的内容。 - TheXenocide
@ThomasLevesque 刚才说的算了,哈哈,重新读了一遍你的评论后,发现你提到它只在首次评估时计算一次,而不是每个 TFM 都要计算。可惜,要有一个好的答案就好了。 - TheXenocide

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