【问题标题】:How to set NuGet restore in TFS to take the highest version available?如何在 TFS 中设置 NuGet 还原以获取可用的最高版本?
【发布时间】:2017-10-15 18:43:29
【问题描述】:

假设我的解决方案有 2 个包依赖项:

3rdParty.CompanyA.ProductA 版本 4.0.1 和 3rdParty.CompanyB.ProductB 版本 2.0.1

两个包都引用了其他包依赖“C”。 第一个依赖项设置为“高于 1.2 - (>1.2)”,另一个设置为“高于 1.8 - (>1.8)”。

当我在本地编译时,解决方案一切正常,bin 目录中的“C”版本是最新的“1.8”,正如预期的那样...... 但是当我在 TFS 中编译这个解决方案并引用相同的 .Nuget\NuGet.config 文件时,我得到的是 old 1.2v "C" bin 目录中的版本,因此我的产品坏了。 是否有特殊的配置来通知 TFS 恢复采用将匹配所有依赖项的版本?

更新

我想我知道我的问题来自哪里,但我完全理解它。 在 TFS 中,我正在为 8 个项目编译和恢复包。 编译结束后,我使用“测试程序集”步骤运行 UnitTest。 我发现在默认设置下,我的 unittest 会因为它引用旧的 DLL 而被破坏。但是当我打开 “并行运行”时,它按预期工作。

【问题讨论】:

  • 当您删除本地 packages 文件夹并让程序包恢复再次运行时会发生什么?
  • 1.2 和 1.8 文件夹都在包文件夹中创建。但只有较新的 1.8 会按预期复制到 bin 中
  • 如果你先禁用你的测试相关任务会有什么结果?只需离开构建任务。你能得到正确的版本吗?我的意思是尝试缩小与测试任务机制相关的范围。

标签: tfs package nuget nuget-package nuget-package-restore


【解决方案1】:

不确定是否完全明白你的意思。在我看来,这两个包应该在某个项目中。如果没有,将有两个 bin 文件夹,一个用于 1.2,一个用于 1.8。

这是 Nuget Restore 中的表亲依赖概念:

当不同的包版本以相同的距离被引用时 在应用程序的图表中,NuGet 使用最低版本 满足所有版本要求(与最低 适用版本和浮动版本规则)。在下图中, 例如,包 B 的 2.0 版本将满足另一个 >=1.0 约束,因此将被使用:

来源:How NuGet resolves package dependencies

它还使用 NuGet.exe int TFS NuGet 还原任务。不应该有任何额外的设置或参数。建议您在 TFS 中启用调试模型,并通过更详细的日志进行故障排除。否则,只需使用简单的解决方法将第一个依赖项更改为“高于 1.8 - (>1.8)”


更新

建议您只打开 VS 测试任务的“并行运行”,测试将利用机器的可用内核并行运行。有关如何并行运行测试,请参阅Parallel Test Execution 在这种情况下是一个不错的选择。

【讨论】:

  • 我想我知道我的问题来自哪里,但我完全理解它。在 TFS 中,我正在为 8 个项目编译和恢复包。编译结束后,我使用“测试程序集”步骤运行 UnitTest。我发现在默认设置下,我的 unittest 会因为它引用旧的 DLL 而被破坏。但是当我打开“并行运行”时,它按预期工作。
  • @AviramFireberger 在 TFS 构建的包文件夹中还必须同时创建 1.2 和 1.8 文件夹。不知道为什么在这种情况下正常的测试步骤会复制旧的 1.2v。建议您只需打开 VS 测试任务的“并行运行”,测试将利用机器的可用内核并行运行。有关如何并行运行测试,请参阅Parallel Test Execution 一个很好的选择,无论是解决问题还是减少测试步骤的时间。
  • 是的,这就是我所做的,正如我在问题中提到的那样。但我想知道它为什么会这样,为什么它会按预期并行工作,如果没有设置,它将采用旧版本?
猜你喜欢
  • 2017-10-22
  • 1970-01-01
  • 1970-01-01
  • 2015-12-02
  • 2017-12-04
  • 2023-03-04
  • 2014-06-17
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多