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
如何为msbuild安装nuget.build.tasks.pack.targets
使用visual studio pack在nuget包中包含构建目录
dotnet pack 不适用于 Azure Function(Pack Azure Functions for Nuget)