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

时间:2018-09-24 16:59:25

标签: visual-studio nuget nuget-spec

我正在尝试从VS 2017项目创建一个NuGet程序包,该程序包包含对第三方DLL(Kendo.mvc.dll)的引用。无论我做什么,我都无法nuget pack自动将该DLL包含在我的NuGet包的lib文件夹中。

我最初是使用命令.nuspec在命令行中创建nuget spec [project's name and path].csproj文件的。然后,我调整了该文件的设置,从而生成了这个.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创建了程序包,结果是这样:

Package contents showing no 3rd party DLL was included

根据我在文档(MS Docs - Creating NuGet packages中所读到的内容),我期望nuget pack会自动在包中的项目中包含任何非Nuget来源的DLL,但这不是真的吗?

我尝试了以下方法,看看是否有任何不同,但无济于事:

  • 在项目的根目录中添加一个lib文件夹,并将DLL放在其中(并尝试了一些更改“生成操作”和“复制到输出目录”设置的操作)。这样就在NuGet包的Content文件夹下创建了一个lib文件夹,而不是将DLL添加到包含程序集DLL的同一lib文件夹中。我这样做是因为the MS docs谈论的是基于约定的文件结构。
  • 从C:\ Program Files中的文件夹引用DLL,然后在“属性”中将DLL的“复制本地”属性设置为true

This question讨论了为第三方DLL添加一个单独的元素,我猜这是指在生成包之前在.nuspec文件中显式添加文件,例如

  <files>
    <file src="bin\Debug\Kendo.Mvc.???" target="lib\net461" />
  </files>

这行得通,但是如果从.nuspec文件生成csproj文件时是否需要自动添加它,

2 个答案:

答案 0 :(得分:1)

  

但是从csproj文件生成.nuspec文件时,是否需要自动添加?

是的,从.nuspec文件生成.csproj文件时,默认情况下不会自动添加非Nuget来源的DLL。

当我们从.nuspec文件生成.csproj文件时,.nuspec仅包含基本信息,例如标题,说明等。您可以从“程序集信息”,“属性”->“应用程序”->“程序集信息”中获取此信息:

enter image description here

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

因此,为了包括第三方DLL,我们需要像{s1}那样手动将文件明确添加到.nuspec文件中。

检查Create nuget package from dlls了解更多详细信息。

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

文档:pack command (NuGet CLI)

希望这会有所帮助。

答案 1 :(得分:1)

如果要通过Visual Studio或dotnet进行操作,则可以编辑csproj文件,添加一个ItemGroup以包含dll,如下所示:这会将其他dll与当前项目dll一起打包在nuget包中。

self->traceme = 1;