【问题标题】:nuget restore fails on build but works manuallynuget restore 在构建时失败,但手动工作
【发布时间】:2014-04-25 22:41:08
【问题描述】:

VS 2013 无法恢复包 - 包内容未实现 - 尽管 VS/nuget 似乎认为它确实成功地恢复了包。

如果我手动卸载并重新安装该软件包的相同版本,它可以正常工作。

一个简单的复制可以是downloaded as a zip。这个repro有一个

  • 单一解决方案

  • 单个项目与一个

  • 单个文件,“packages.config”,指定一个

  • 单个包“breeze.edmbuilder -version 1.0.4”,包含单个文件edmbuilder.cs

  • 单个文件夹“App_Start”只包含任何内容

  • .csproj 说它应该有“edmbuilder.cs”,这是可以的,因为

  • 当包恢复时,它会有“edmbuilder.cs”。

当我构建时,VS 报告说“edmbuilder.cs”丢失了……而且确实丢失了。

但是,软件包已下载;我知道这一点,因为构建会生成一个包含“Breeze.EdmBuilder.1.0.4”的“packages”文件夹,其中我看到“edmbuilder.cs”存在并且位于正确的位置。

当我发出命令install-package breeze.edmbuilder -version 1.0.4 时,nuget 会报告

'Breeze.EdmBuilder 1.0.4' 已安装。 NugetRestoreFail 已经引用了“Breeze.EdmBuilder 1.0.4”。

这个包 AFAIK 没有任何问题。因为当我uninstall-package breeze.edmbuilder 然后用install-package breeze.edmbuilder -version 1.0.4 重新安装时,安装工作正常,丢失的 edmbuilder.cs 出现在它所属的“App_Start”文件夹中。

失败是可重复的就地

  • 关闭解决方案
  • 从“App_Start”中删除 edmbuilder.cs
  • 删除“包”文件夹
  • 可选择删除 .suo 和 bin 和 obj 目录
  • 重新打开解决方案并重新构建

您将获得相同的失败行为......以及手动卸载和重新安装的相同功能。

FWIW,从 .csproj 中删除对 edmbuilder.cs 的引用无效。

无论我做什么,我都必须手动卸载并重新安装包。

WTF!

ps:我正在使用 VS 2013 Update 2 RC。我怀疑“RC”是否重要,因为这个问题引起了客户的注意。你永远不知道。

p.p.s:这与构建失败无关,我不在乎这个解决方案永远不会运行。你在这里看到的是一个可以工作的真实应用程序的精简版本。唯一的问题是“为什么没有恢复文件?”

【问题讨论】:

    标签: nuget nuget-package-restore


    【解决方案1】:

    包恢复与安装包相同。您所看到的是设计使然。它只是下载 packages 文件夹中所有丢失的包。不再。不少。

    添加了包还原,因此您无需将包文件夹提交到源代码管理。

    预计您将安装一个包,然后提交对您的项目文件以及可能已添加的任何文件(如 edmbuilder.cs)所做的更改,基本上是项目文件夹中的任何内容.您将排除 packages 文件夹。

    现在,当您从源代码管理中获取源代码时,除了包文件之外的所有内容都会出现。 Package Restore 将下载这些文件,现在您的工作副本已完成。

    NuGet's Restore Package insists on specific package versions

    【讨论】:

    • 等一下。我阅读了您的链接,似乎说还原将具有与安装相同的副作用(“例如更新您的 .config 文件、添加代码等”)。它继续说“当另一个开发人员或构建服务器检查代码时,他将获得与您所拥有的完全相同的副作用代码,减去包文件。包还原只是将这些文件拉下来来自 NuGet 存储库,现在我们拥有处理该项目所需的一切。”这很令人困惑。你是说恢复不会有安装副作用?
    • 其实我写的是安装一个包是什么引入了副作用。正是这个减去提交的实际包。包还原只需添加包,使您的工作副本再次完整。是的,我同意这是 VS 项目系统的副产品。然而,NuGet 包不仅仅是要引用的程序集。它们还可能包括安装脚本,这些脚本可能无法在 VS 环境之外运行,例如构建服务器。如果您只是认为包还原可以让您免于签入包,那就更有意义了。
    • 这里有一篇博文指出这是一个常见的误解:jeffhandley.com/archive/2013/12/09/… 添加到项目中的内容文件必须与项目一起签入。假装它们不是来自 NuGet。它们现在是您项目中的可编辑源文件。二进制文件是创建包还原的原因——没有人愿意将第 3 方二进制文件检查到源代码控制中。
    【解决方案2】:

    这是愚蠢还是什么?

    感谢@Kiliman 解释说我可怕的经历是“设计的”。

    那么,您如何真正获得您认为正在恢复的内容?您是否一次安装每个软件包。这太疯狂了。

    我打算观察到没有与npm install 等效的 nuget 可以获取您需要的所有包......当我发现实际上有一个几乎等效的包时。这并不明显,我想知道有多少人知道它的存在。

    这是一个两步过程:

    1. 首先恢复丢失的包...然后

    2. 发出命令:Update-Package -Reinstall

    这会重新安装解决方案中每个项目中的所有包。

    如果您只想为特定项目重新安装,请尝试:

    Update-Package -ProjectName 'YourProjectName' -Reinstall
    

    在这两个过程中,-Reinstall 开关都力求安装在您的 package.config 中说明的包的确切版本...而不是更新的“更新”包,这些包可能适用于您的项目,也可能不适用于您的项目(但请参阅例外的文档)。

    在题为“Reinstalling Packages and its Pitfalls”的官方 nuget 文档中了解 update-package -reinstall

    不要错过警告性言论。显然,这种技术只是您对其他包管理器的期望的近似值。

    祝大家好运。

    【讨论】:

    • 我理解你的沮丧,但我不确定我是否看到了问题。如果您一开始没有安装它们,您将如何指定这些软件包?这为您提供了成功恢复所需的一切。我认为其他包系统更简单,因为底层平台的构建系统更简单。我知道有一个改进 VS 项目系统的推动力。希望他们考虑到这种情况。
    • 谢谢@Killman。感谢您的帮助和善意,同时为自己的任性感到遗憾。仅仅因为 nuget 一直是我身边的一根刺,没有理由把它放在你身上。我应该补充一点,其他包管理器也有他们自己的挫败感。显然这个问题很难。今后我会努力变得更加亲切和理解。
    猜你喜欢
    • 2018-03-08
    • 1970-01-01
    • 1970-01-01
    • 2018-02-17
    • 2018-07-22
    • 1970-01-01
    • 1970-01-01
    • 2019-10-21
    • 1970-01-01
    相关资源
    最近更新 更多