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

Posted

技术标签:

【中文标题】NuGet:pack 命令不包括 nuget 依赖项【英文标题】:NuGet: pack command is NOT including nuget dependencies 【发布时间】:2012-03-14 00:39:55 【问题描述】:

我有以下设置:

nuget.exe 版本:1.6.21205.9031 项目 A.csproj 打包到 A.1.0.0.0.nupkg,并发布到本地 IIS 上托管的 LOCAL 包存储库(我的 VS Nuget 扩展我能够将 A 包添加到新项目) B.csproj 项目依赖于我使用 VS Nuget 扩展添加的 A 包

现在,当我跑步时

nuget spec

B.nuspec 已创建。

然后我跑

nuget pack B.csproj -verbose

但是在创建的 B 包中,它们对 A 包没有依赖性。 nuget pack 命令告诉我它已找到 packages.config 文件(其中包含对 A 包的依赖项),但随后显示“依赖项:无”。

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

非常感谢!

【问题讨论】:

我也很想知道这个问题的答案。文档指出 nuget pack B.csproj 步骤应该包含依赖项,但它不适合我。 这里仍然存在同样的问题,列出的解决方案都不起作用。 看起来我遇到了同样的问题,就我而言,实际上包含了三分之一的依赖项 【参考方案1】:

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

【讨论】:

+1 我在 Nuget.Config 中将 packages 文件夹自定义为 nuget-packages。重命名它为我解决了这个问题。 如果 NuGet 无法将依赖项添加到其依赖项列表中,人们可能会认为它会失败,或者至少会发出警告,因为这会导致生成具有不完整依赖项列表的错误包。我希望有一个选项可以在此类问题上失败,而不是“成功完成”并让包的用户找出为什么事情不适合他们。 链接因站点移动而中断,新位置上的问题 3097 似乎与此无关。非常感谢您能在新位置找到相同的问题并更新链接。 您仍然可以在 Codeplex 上找到问题,只需单击屏幕顶部的问题并搜索““Nuget pack”忽略 packages.config 中的依赖项” 将问题转发至 github.com/NuGet/Home/issues/8643【参考方案2】:

我想我可能已经想通了……

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

我不太确定为什么在打开包还原时依赖项没有包含在包中,但是哦,好吧:)。

【讨论】:

【参考方案3】:

'Nuget.exe spec A.csproj' 将创建一个没有任何依赖关系的非常薄的 NuSpec 文件。对于我们的流程,使用 powershell 脚本将项目引用和其他依赖项从项目的 packages.config 添加到 B.nuspec 中的 <dependency> 节点。

'Nuget.exe pack A.nuspec' 将是正确的。

【讨论】:

请注意,OP 将 nuget pack 与 .csproj 文件一起使用。这旨在将 .csproj 中记录的依赖项考虑在内,包括使用 nuget 添加的依赖项以及对同一解决方案中具有 .nuspec 文件的其他项目的任何引用。【参考方案4】:

here 提出了类似的问题,答案解释为:

这些导致问题的原因是因为 NuGet 会查找解决方案级别的包文件夹来决定要拉入哪些包依赖项(不太确定如何做出此决定)。如果该包文件夹的路径不正确(就像 NuGet 使用错误的解决方案文件一样),则它无法正确解析依赖项。另外如果packages文件夹为空,也无法正确解析依赖。

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

【讨论】:

【参考方案5】:

我缺少依赖项,因为我在 packages 文件夹中没有我正在使用的所有包的 *.nupkg 文件。

这很难追踪,因为nuget pack 的输出看起来像是在工作:

Found packages.config. Using packages listed as dependencies

我一直在使用GitHub's Visual Studio .gitignore,只注释掉了关于“包还原”的一行(因为我想提交我的包),但我应该注释掉两行。它应该是这样的:

# NuGet Packages
# *.nupkg
# The packages folder can be ignored because of Package Restore
# **/packages/*

感谢Rick Mohr's answer链接到CodePlex work item 3097,飞凌解释了packages文件夹的使用方式:

因为packages.config 只包含一个包列表,并且不包含 包含这些包之间的依赖关系,nuget需要 访问这些包文件以获取依赖项信息。这就是为什么它 需要知道包文件夹。

飞凌所指的依赖信息在*.nupkg文件中。一旦我更改了 .gitignore 并提交了所有缺少的 *.nupkg 文件,我的 TeamCity 构建服务器就能够成功地创建具有正确依赖项的 NuGet 包。

【讨论】:

对于 nuget 假设项目的唯一依赖项是其他 nuget 包是一个很大的失败。当然,项目通常依赖于同一解决方案中的其他项目。

以上是关于NuGet:pack 命令不包括 nuget 依赖项的主要内容,如果未能解决你的问题,请参考以下文章

如何为 msbuild 安装 nuget.build.tasks.pack.targets

text NuGet Pack

text NuGet Pack

如何为msbuild安装nuget.build.tasks.pack.targets

使用visual studio pack在nuget包中包含构建目录

dotnet pack 不适用于 Azure Function(Pack Azure Functions for Nuget)