全局禁止 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 build
和 dotnet 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
.
强制
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 build
和 dotnet 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
.