使用多个DLL创建NuGet包

55

假设我有一个如下结构的项目:

MyLibrary\
  MyLibrary.sln
  MyLibrary.Core\
    MyLibrary.Core.csproj
  MyLibrary.Extensions\
    MyLibrary.Extensions.csproj
  MyLibrary.Tests\
    MyLibrary.Tests.csproj
我想创建一个NuGet软件包,其中包含MyLibrary.Core.dll和MyLibrary.Extensions.dll。但我无法搞清楚如何让NuGet这样做。我尝试手动构建规范文件,也尝试使用"nuget spec MyLibrary.Core.csproj"来构建规范文件。我尝试将所有DLL添加到lib/文件夹中,我理解这是将DLL添加到软件包的基于约定的机制。但在每种情况下,我只能让MyLibary.Core.dll进入软件包,而MyLibrary.Extensions.dll没有被打包。TLDR:创建具有多个项目/程序集的NuGet软件包的最佳实践是什么?是否有可用于此的教程?我找到的教程都着重于简单的单项目演示。
8个回答

49
你可以在单个项目(或nuspec文件)中运行NuGet,但是它支持通过file元素指向其他项目。该元素使用你的项目的引用名称,因此你避免了a)查找其他项目文件的位置和b)将文件作为后构建步骤复制到特定位置的问题。
假设你有一个nuspec文件用于MyLibrary.Core.csproj,并且它引用了MyLibrary.ExtensionsMyLibrary.Tests,这些引用在构建后以bin目录结构的形式存在:
<package xmlns="http://schemas.microsoft.com/packaging/2010/07/nuspec.xsd">
  <metadata>
    ...
  </metadata>
  <files>
    <file src="bin\Release\MyLibrary.Extensions.dll" target="lib\net40" />
    <file src="bin\Release\MyLibrary.Tests.dll" target="lib\net40" />
  </files>
</package>

通过这个设置,所有的引用应该都能以合适的方式放置在 NuGet 包中。你仍然在其中有硬编码的“Release”,但我打赌大多数人可能不会分发其调试版本的 NuGet 包。


17
您不必硬编码"Release",可以用"$configuration$"代替它。这样做的原因是,在构建nupkg时,MSBuild参数是可用的。当然,如果您不使用MSBuild来制作包,那就另当别论了。 - niaher

23

你是否使用以下命令生成了一个空白的nuspec文件:

nuget spec
如果您使用该文件,然后将您的dll文件放在其下名为lib的文件夹中,它会将它们打包起来。
我尝试从项目或dll生成nuspec文件时遇到了一些麻烦。此外,如果您在nuspec文件中手动引用任何文件,则不使用惯例。这可能是由于从dll或项目生成的nuspec文件的问题。
另外,如果您尝试从执行在不同文件夹中的构建脚本运行此操作,您可以通过-BasePath命令告诉nuget您的.\lib文件夹的位置:
build\nuget.exe pack nuget\Company.Project.nuspec -BasePath nuget\

谢谢。我认为BasePath开关将允许我得到我想要的东西。 - RationalGeek

5

1
+1 - 在尝试了更多“手动”方法之后,这个工具终于让我制作出了一个完整可用的软件包,所以我也推荐它。 - Dib

2

2
我最近发布了一个解决方案,可以在构建解决方案时自动创建NuGet包,每个包可以包含多个程序集,引用外部NuGet和同一构建期间创建的NuGet,甚至可以包括用于调试的源代码。
对于您的情况,您只需要向解决方案添加新的类库项目,引用要打包的项目,然后添加一个后置构建事件。
您可以在这里找到一篇文章,其中包含详细的步骤指南:(链接),还可以在这里找到源代码:(链接)

@Stefan 修复了链接。 - Danny Varod

1

我有一些关于如何在Windows和Visual Studio中完成的教程:

创建本地文件夹并将其命名为packages,例如:c:/packages//lib - 创建另一个文件夹并将其命名为lib,在该文件夹中粘贴dll文件非常重要。

打开NuGet包资源管理器 - https://npe.codeplex.com/downloads/get/clickOnce/NuGetPackageExplorer.application

界面非常直观,只需添加dll文件并将其导出到/lib(对于教程https://blog.zwezdin.com/2014/building-nuget-packages-with-gui-tool/ 它是俄语的,但可以查看图片流程,大约只需3次点击)

它将创建nuspec文件

打开GIT BASH - https://git-for-windows.github.io/ 并导航到:cd c: => cd packages(路径)

*在Windows系统中,你可能需要提供Windows的开发者选项来使用Linux相关内容(https://www.howtogeek.com/249966/how-to-install-and-use-the-linux-bash-shell-on-windows-10/)。

在GIT BASH中输入以下命令:nuget add -source [选项]

其中:[选项]表示nuspec文件的全名(包括.nuspec),以及位于文件夹(c:/packages//lib)中的lib文件夹的路径。

操作成功后,再在GIT BASH中输入另一个命令:

nuget pack .nuspec

这个文件夹中会生成.nupkg文件。

如何在本地安装Nuget Package .nupkg文件? - 这是一个教程,介绍了如何将其添加到Visual Studio中。


0

我在将额外的dll引用添加到Nuget包时遇到了问题,在样本项目上测试该包时,似乎没有添加额外的dll,无论我如何创建Nuget包。

然后我发现,当您卸载并重新安装具有相同版本号的本地Nuget包时,更改不会生效,额外的dll不会被添加。

因此,每次卸载包时,关闭Visual Studio并清除Nuget缓存,

如何使用命令行清除NuGet软件包缓存?

然后再次打开Visual Studio并重新安装本地包以使更改生效。

或者每次增加包版本号,以便Visual Studio识别您的更改。

例如:

  • Package-1.0.0
  • Package-1.0.1
  • Package-1.0.2
  • .....

有几种方法可以从示例项目创建Nuget包,例如:

  1. 右键单击Visual Studio项目,选择“打包”选项

enter image description here

然后安装NuGet包浏览器:

https://www.microsoft.com/es-ec/p/nuget-package-explorer/9wzdncrdmdm3?activetab=pivot:overviewtab

enter image description here

并手动将您的额外引用(dll文件)添加到特定目标中。

  1. 使用在文档中指定的.nuspec文件创建nuget包:

https://learn.microsoft.com/en-us/nuget/guides/create-packages-for-xamarin

   <files>
        <file src="Plugin.LoggingLibrary\bin\Release\Plugin.LoggingLibrary.dll" target="lib\netstandard1.4\Plugin.LoggingLibrary.dll" />
        <file src="Plugin.LoggingLibrary\bin\Release\Plugin.LoggingLibrary.xml" target="lib\netstandard1.4\Plugin.LoggingLibrary.xml" />
        <file src="Plugin.LoggingLibrary.iOS\bin\Release\iOsDependence.dll" target="lib\Xamarin.iOS10\iOsDependence.dll" />
        <file src="Plugin.LoggingLibrary.Android\bin\Release\AndroidDependence.dll" target="lib\MonoAndroid10\AndroidDependence.dll" />
   </files>

在您的文件部分中添加您的 .dll 文件。
并且不要忘记,每次从本地源卸载和重新安装 nuget 包时。
或者您可以每次增加包的版本:

enter image description here

  • 关闭Visual Studio,清除NuGet缓存并重新构建项目。

以便使更改生效。


0

我曾经遇到过同样的问题,于是我决定创建一个Nuget,可以从选择的项目中创建其他Nuget。

该软件包已部署在Nuget.org网站上。在项目中引用它后,您需要将nuspeck文件添加到应生成项目的项目中。

具有所需nuspeck文件的项目

您需要执行Create-Nuspec命令来调用包管理器。然后,PowerShell模块将获取所有构建结果的库,还会添加所需的依赖项,并在输出目录中创建Nuget。

关于此软件包的描述位于此处


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