全局禁止 NuGet 还原作为 Azure DevOps 中其他 dotnet 命令的副作用

Globally disallow NuGet restore as side effect of other dotnet commands in Azure DevOps

TLDR:如何在我的 yml 管道中强制执行 no dotnet 命令以恢复 NuGet 包,除非明确告知这样做?要确保仅显式 NuGet 还原(和相应的 Cache@2 任务)才能进行还原?


我正在基于 this blogpost by Microsoft 在我的 Azure DevOps 构建管道中启用 NuGet 包锁定和缓存。相关的 NuGet 步骤变为:

- task: NuGetToolInstaller@1
  displayName: 'NuGet Tool Installation'

- task: NuGetAuthenticate@0
  displayName: 'NuGet feed(s) Authentication'

- task: Cache@2
  displayName: 'NuGet Cache'
  inputs:
    key: 'nuget | "$(Agent.OS)" | **/packages.lock.json'
    path: '$(NUGET_PACKAGES)'
    cacheHitVar: 'CACHE_RESTORED'

- task: NuGetCommand@2
  displayName: 'NuGet Restore'
  condition: ne(variables.CACHE_RESTORED, true)
  inputs:
    command: 'restore'
    feedsToUse: 'config'
    nugetConfigPath: 'nuget.config'

一切正常,我通过在所有 .csproj 文件中将 RestorePackagesWithLockFile 设置为 true 生成了 package.lock.json,并将它们提交给版本控制。

现在的问题是我有几十个这样的task

- task: DotNetCoreCLI@2
  displayName: 'Build API'
  inputs:
    command: 'build'
    projects: 'Northwind.Foo/Northwind.Foo.csproj'
    arguments: '-c Release'

- task: DotNetCoreCLI@2
  displayName: 'Test Foo'
  inputs:
    command: 'test'
    projects: 'Northwind.Foo.Tests/Northwind.Foo.Tests.csproj'
    testRunTitle: 'Foo-Tests'

- task: DotNetCoreCLI@2
  displayName: 'Test Bar dependency'
  inputs:
    command: 'test'
    projects: 'Northwind.Bar.Tests/Northwind.Bar.Tests.csproj'
    testRunTitle: 'Bar-Tests'

# etc. etc.

所有这些 dotnet builddotnet test 命令也会在需要时 restore 打包。哎呀,它们甚至可能会产生副作用 update package.lock.json 左右,因为 Azure DevOps 在某些构建中告诉我:

Resolved to: <redacted>
##[warning]The given cache key has changed in its resolved value between restore and save steps;
original key: <redacted>
modifiedkey: <redacted>

我从 the dotnet build documentation 知道我可以使用 --no-restore 标志,但是 (a) 我必须重复所有 10ish dotnet 任务乘以 10 个 yml 文件,并且(b) 也必须记住在以后的所有情况下都这样做。将 --locked-mode 添加到 all 命令的类似故事,我想?

是否有更全局的方法,至少每个 yml 文件一次,以防止任何 dotnet 命令通过副作用恢复,而是尊重早期恢复命令中的现有包?

答案已经在链接的博客中 post。您可以设置两个 不同 csproj 属性:

  • RestorePackagesWithLockFile: "如果设置了这个属性,NuGet restore会在项目根目录下生成一个锁文件——packages.lock.json文件。"
  • RestoreLockedMode:“如果设置了锁定模式,恢复将获得锁定文件中列出的确切包,否则失败。”

因此您应该使用第一个选项为您的项目生成 锁定文件。使用 CI/CD 中的第二个以确保它使用锁定模式。无需用 locked-mode.

强制