NuGet:pack命令不包含nuget依赖项

23

我有以下设置:

  • nuget.exe版本: 1.6.21205.9031
  • A.csproj项目打包成A.1.0.0.0.nupkg并发布到我本地IIS托管的本地包存储库(我的VS Nuget扩展程序可以将A包添加到新项目中)
  • B.csproj项目依赖于我使用VS Nuget Extension添加的A包

现在,当我运行下面的命令时:

nuget spec

已创建B.nuspec文件。

然后我运行

nuget pack B.csproj -verbose

但在创建的B包中,没有依赖于A包。NuGet打包命令告诉我已经找到了packages.config文件(其中包含对A包的依赖),但是它说“依赖项:无”。

我错过了什么?问题可能是A包只能在我的本地包存储库中找到吗?如何让nuget.exe意识到这个本地存储库?

非常感谢!


我也很想知道这个问题的答案。文档说明nuget pack B.csproj步骤应该包括依赖项,但对我来说并没有。 - Kevin Tighe
4
仍存在同样的问题,列出的解决方案都无效。 - cbp
看起来我遇到了同样的问题,只是在我的情况下,三个依赖项中有一个实际上被包含了。 - Jacek Gorgoń
5个回答

15

nuget pack需要能够找到packages文件夹以解决依赖关系(请参见http://nuget.codeplex.com/workitem/3097),该文件夹可以在与.csproj相同的文件夹中找到(只要上一级存在.sln文件),或者在NuGet.Config中指定的文件夹中找到。


+1 我在 Nuget.Config 中自定义了 packages 文件夹为 nuget-packages。将其改名回去后,问题得到了解决。 - Wim Coenen
11
如果NuGet无法将一个依赖项添加到其依赖项列表中,那么人们可能会认为它会失败或者至少发出警告,因为这会导致生成具有不完整依赖项列表的错误包。我希望有一种选项可以在出现此类问题时失败,而不是“完成成功”,让软件包的用户自己去找出为什么事情不起作用。 - Guillaume LaHaye
链接已失效,因为该网站已经迁移,而新位置上的问题3097似乎与此无关。如果您能在新位置找到相同的问题并更新链接,我将非常感激。 - Richardissimo
您仍然可以在 Codeplex 上找到此问题,只需单击屏幕顶部的“Issues”并搜索“Nuget pack” ignores dependencies from packages.config。已在 https://github.com/NuGet/Home/issues/8643 再次发布该问题。 - David

3

我觉得我可能已经搞清楚了……

我们的库解决方案启用了Nuget包还原。我关闭了NuGet包还原,并且在创建NuGet包时包含了项目依赖关系。

不太确定为什么在启用包还原时依赖项没有被包含在包中,但没关系 :)


1
因为我没有在使用的所有包的“packages”文件夹中拥有“*.nupkg”文件,所以我的依赖关系缺失。
这很难追踪,因为“nuget pack”的输出看起来像是正常工作的。
Found packages.config. Using packages listed as dependencies

我曾使用GitHub的Visual Studio .gitignore,只注释了有关“Package Restore”的一行(因为我想提交我的包),但我应该注释掉两行。应该像这样:
# NuGet Packages
# *.nupkg
# The packages folder can be ignored because of Package Restore
# **/packages/*

感谢Rick Mohr的回答,提供了CodePlex工作项3097的链接,其中feiling解释了packages文件夹的用途:

由于packages.config仅包含软件包列表,而不包含这些软件包之间的依赖关系,因此nuget需要访问这些软件包文件以获取依赖关系信息。这就是为什么它需要知道软件包文件夹的原因。

feiling所指的依赖关系信息包含在*.nupkg文件中。一旦我更改了.gitignore并提交了所有缺失的*.nupkg文件,我的TeamCity构建服务器就能够成功创建带有正确依赖关系的NuGet软件包。


Nuget 假设项目的唯一依赖关系是其他 Nuget 包,这是一个很大的失败。当然,项目通常会依赖于同一解决方案中的其他项目。 - LarryBud

1

类似的问题在这里被问到过,答案解释道:

之所以会出现问题是因为NuGet查找解决方案级别的包文件夹来决定要拉取哪些包依赖项(不确定如何做出此决定)。如果该包文件夹的路径不正确(如果NuGet使用错误的解决方案文件,则会出现此情况),则无法正确解析依赖项。此外,如果包文件夹为空,它也无法正确解析依赖项。

我遇到了同样的问题,将解决方案文件添加到项目文件夹中(之前没有解决方案)帮助我解决了这个问题。


1
'Nuget.exe spec A.csproj' 会创建一个非常简单的 NuSpec 文件,其中不包含任何依赖项。为了符合我们的流程,请使用 PowerShell 脚本将项目的 packages.config 中的项目引用和其他依赖项添加到 B.nuspec 中的 <dependency> 节点中。
然后使用 'Nuget.exe pack A.nuspec' 就可以了。

1
请注意,OP正在使用带有.csproj文件的nuget pack。这是为了考虑到在.csproj中记录的依赖项,包括使用nuget添加的依赖项以及对具有.nuspec文件的同一解决方案中其他项目的引用。 - Wim Coenen

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