【发布时间】:2021-11-09 21:12:48
【问题描述】:
我们使用 Azure Devops 进行构建。我们为我们的解决方案提供了各种 nuget 包。目前,当我们指定的版本不存在时,nuget restore 只会拉取下一个现有版本,但我们希望构建失败并且不会拉取下一个现有版本。
例如,我们指定 v1.0,如果它不存在,我们希望整个构建失败而不是拉取 v1.1。有没有办法做到这一点?谢谢。
【问题讨论】:
标签: azure-devops nuget
我们使用 Azure Devops 进行构建。我们为我们的解决方案提供了各种 nuget 包。目前,当我们指定的版本不存在时,nuget restore 只会拉取下一个现有版本,但我们希望构建失败并且不会拉取下一个现有版本。
例如,我们指定 v1.0,如果它不存在,我们希望整个构建失败而不是拉取 v1.1。有没有办法做到这一点?谢谢。
【问题讨论】:
标签: azure-devops nuget
您应该将您引用的软件包版本包含在您的 csproj 文件中的方括号中,如下所示:
<PackageReference Include="ExamplePackage" Version="[1.0]" />
有关更多详细信息和其他选项,请参阅the docs。
【讨论】:
正如另一个答案所说,您可以使用 NuGet 的语法进行精确的版本匹配,而不是“大于或等于”。 This is documented。这仅适用于项目中直接包含的包。它不适用于传递依赖。
根据您的用例,另一种选择是注意 NuGet 在请求的版本不存在时会向您发出警告,而是使用更高的版本。然后,告诉 NuGet 将此警告视为错误:
<WarningsAsErrors>$(WarningsAsErrors);NU1603</WarningsAsErrors>
这样做的一个好处是您可以将它放在您的 repo 根目录中的 Directory.Build.props 中,并且解决方案中的所有项目都将获得此行为。
这也适用于传递依赖。但是由于这个原因,如果有一个包你无法控制谁最终声明了一个不存在的依赖项,那么最好的选择可能是将缺少的依赖项声明为直接包引用,并将版本更改为存在的版本( NuGet 的“最近获胜”规则)。或者,也许添加一个特定于包的 NoWarn 可能会起作用:
<PackageReference Include="Newtonsoft.Json" Version="13.0.0" NoWarn="NU1603" />
【讨论】: