将第三方DLL包含在从VS csproj生成的NuGet包中

9
我正在尝试从一个包含对第三方DLL(Kendo.mvc.dll)的引用的VS 2017项目中创建NuGet包。无论我尝试什么,都不能让nuget pack自动将该DLL包含在我的NuGet包的lib文件夹中。
我最初使用命令行从命令nuget spec [project's name and path].csproj创建了.nuspec文件。然后我调整了该文件的设置,结果得到了这个.nuspec文件:
<?xml version="1.0"?>
<package >
  <metadata>
    <id>$id$</id>
    <version>$version$</version>
    <title>$title$</title>
    <authors>our names</authors>
    <owners>$author$</owners>
    <requireLicenseAcceptance>false</requireLicenseAcceptance>
    <description>the description</description>
    <releaseNotes>First release</releaseNotes>
    <copyright>Copyright 2018</copyright>
    <tags>entity-framework-6 mvc5</tags>
  </metadata>
</package>

然后我使用了nuget pack创建包,结果如下:

包内容显示未包含第三方DLL

根据文档(MS Docs - 创建 NuGet 包)所述,我期望nuget pack会自动包含项目中引用的非NuGet来源的 DLL 在内,但这并没有发生?
我已经尝试了以下操作,但都没有起作用:
  • 在项目的根目录下添加一个lib文件夹,并将 DLL 放入其中(并尝试更改构建操作和复制到输出目录设置)。这会在 NuGet 包的 Content 文件夹下创建一个 lib 文件夹,而不是将 DLL 添加到与程序集的 DLL 相同的lib文件夹中。我这样做是因为Microsoft文档中提到了约定的文件结构。
  • 从C:\Program Files文件夹引用 DLL,并将 DLL 的 Copy Local 属性设置为 true
这个问题讨论了添加第三方 DLL 的单独元素,我猜想这是指在生成包之前在.nuspec文件中明确添加文件,例如:
  <files>
    <file src="bin\Debug\Kendo.Mvc.???" target="lib\net461" />
  </files>

那确实可行,但如果从 csproj 文件生成 .nuspec 文件时需要它,那么这个应该自动添加进去吧?
2个回答

11
如果您想通过Visual Studio或dotnet来完成此操作,则可以编辑您的csproj文件,添加一个ItemGroup并按如下格式包含dlls:这将使其他dll与您当前项目的dll一起打包在nuget包中。
<ItemGroup>
    <Content Include="<path to other dll>">
        <Pack>true</Pack>
        <PackagePath>lib\$(TargetFramework)</PackagePath>
    </Content>
</ItemGroup>

这应该是被接受的答案。 对我来说运行得完美。 - On The Net Again
1
$(TargetFramework) 在 VS2022 中无法正常工作。它只是将我的外部 DLL 放在 lib 文件夹之外。我必须明确地放置 <PackagePath>lib\net6.0</PackagePath>。如果我的项目是多目标的,我需要有另一个类似的 <Content>...</Content> 块,并指定其他目标框架。 - Tri

3
但如果从.csproj文件生成.nuspec文件时需要它,难道这不应该自动添加吗?
是的,非NuGet来源的DLL在从.csproj文件生成.nuspec文件时默认情况下不会自动添加。
当我们从.csproj文件生成.nuspec文件时,.nuspec文件仅包含基本信息,例如标题、描述等。您可以从程序集信息、属性->应用程序->程序集信息中获取此信息:

enter image description here

但它默认不包括第三方 DLL。

因此,为了包含第三方 DLL,我们需要在 .nuspec 文件中手动显式添加文件,就像您所做的那样。

有关更多详细信息,请参阅 从 dlls 创建 nuget 包

顺便说一句,如果第三方 DLL 是项目中引用的 nuget 源 DLL,则可以使用参数 -IncludeReferencedProjects 在从 csproj 文件生成 .nuspec 文件时自动添加它。

文档:pack 命令 (NuGet CLI)

希望这能帮到您。


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