使用多个DLL创建nuget包

Rat*_*eek 44 nuget

假设我有一个具有这种结构的项目:

MyLibrary\
  MyLibrary.sln
  MyLibrary.Core\
    MyLibrary.Core.csproj
  MyLibrary.Extensions\
    MyLibrary.Extensions.csproj
  MyLibrary.Tests\
    MyLibrary.Tests.csproj
Run Code Online (Sandbox Code Playgroud)

我想创建一个包含MyLibrary.Core.dll和MyLibrary.Extensions.dll的NuGet包.我似乎无法弄清楚如何让NuGet这样做.我已经尝试手动构建spec文件,我尝试使用"nuget spec MyLibrary.Core.csproj"构建一个.我已经尝试将所有DLL添加到lib /文件夹中,我理解这是基于约定的机制,用于将DLL添加到包中.在每种情况下,我都可以将MyLibary.Core.dll放入包中,但MyLibrary.Extensions.dll最终不会与它一起打包.

TLDR:创建具有多个项目/程序集的NuGet包的最佳实践是什么?是否有专门针对此的教程?我发现的教程都集中在简单的单项目演示上.

lad*_*dge 40

您将在单个项目(或nuspec文件)上运行NuGet,但它通过该file元素支持指向其他项目的指针.此元素使用项目引用的名称,因此您可以避免a)找到其他项目文件的位置,以及b)将文件作为构建后步骤复制到特定位置.

假设你有一个MyLibrary.Core.csproj的nuspec文件,它引用了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>
Run Code Online (Sandbox Code Playgroud)

通过此设置,您的所有引用都应该在NuGet包中的适当位置.你仍然在那里有硬编码的'Release',但是我敢打赌最不可能不分发他们的调试版本的NuGet包.

  • 您不必对"Release"进行硬编码,可以将其替换为"$ configuration $".您可以这样做的原因是因为构建nupkg时MSBuild参数可用.除非您当然不使用MSBuild来制作包.. (15认同)

BNL*_*BNL 21

您是否生成了一个空白的nuspec文件:

nuget spec
Run Code Online (Sandbox Code Playgroud)

如果您使用该文件,然后将您的dll放在名为lib的文件夹下,它将打包它们.

尝试从项目或DLL生成nuspec文件时遇到了一些麻烦.此外,如果手动引用nuspec文件中的任何文件,则不使用约定.这可能是dll或项目生成的nuspec的问题.

此外,如果您尝试从在不同文件夹中执行的构建脚本运行此命令,则可以通过-BasePath命令行告诉nuget.\ lib文件夹的位置:

build\nuget.exe pack nuget\Company.Project.nuspec -BasePath nuget\
Run Code Online (Sandbox Code Playgroud)


Dan*_*eny 6

您尝试过 NuGet 包资源管理器吗?可能是最简单的方法:

https://github.com/NuGetPackageExplorer/NuGetPackageExplorer