我正在尝试使用 Cache@2 任务来缓存我的 nuget 包。按照文档,我设置了以下任务:
variables:
nugetPackages: $(Pipeline.Workspace)/.nuget/packages
stages:
- stage: CI
displayName: 'Continuous Integration'
jobs:
- job: 'CI'
pool:
vmImage: ubuntu-latest
steps:
- task: NuGetToolInstaller@1
displayName: 'NuGet tool installer'
- task: Cache@2
inputs:
key: 'nuget | "$(Agent.OS)" | **/packages.lock.json,!**/bin/**,!**/obj/**'
restoreKeys: |
nuget | "$(Agent.OS)"
nuget
path: $(nugetPackages)
displayName: Cache NuGet packages
- task: DotNetCoreCLI@2
displayName: 'Restore Packages'
inputs:
command: 'restore'
feedsToUse: 'select'
vstsFeed: '<DevOpsArtifactFeedId>'
projects: 'Solution.sln'
但是在作业后任务中,它失败了:
tar: /home/vsts/work/1/.nuget/packages: Cannot open: No such file or directory
看起来 nugetPackages 路径可能不正确,但我不确定它应该是什么。尽管查看 nuget 恢复任务,我可以看到诸如以下的日志条目:
Installed System.Text.Json 7.0.0 from https://api.nuget.org/v3/index.json to /home/vsts/.nuget/packages/system.text.json/7.0.0
没有
/work/1/
路径。我尝试使用 $(Agent.HomeDirectory)
而不是 $(Pipeline.Workspace)
,但这也不起作用。
如果我将
nugetPackages
变量硬编码为 '/home/vsts/.nuget/packages'
那么它就可以工作 - 但这感觉很脏,我宁愿使用适当的 DevOps 变量,以防路径名发生变化
我同意@Zdeněk Jelínek 的评论,将变量名称
nugetPackages
更改为 $(NUGET_PACKAGES)
。您还需要将恢复任务从 DotNetCoreCLI@2
更改为 NuGetCommand@2
。
根据管道缓存文档,
如果您使用
直接在项目文件中管理 NuGet 依赖项并拥有PackageReferences
文件,则可以通过将packages.lock.json
环境变量设置为 $(UserProfile) 下的路径并缓存此目录来启用缓存。NUGET_PACKAGES
所以,
NUGET_PACKAGES
是一个环境变量。
当我在管道中测试与您相同的 yaml 时,我可以在作业后任务中重现相同的错误。
然后我改用官方文档示例,Post-job任务就可以了。
但是,当我仅将 yaml 中的变量名称
nugetPackages
更改为 $(NUGET_PACKAGES)
时,管道仍然无法工作。区别在于恢复任务。所以,我将恢复任务更改为 NuGetCommand@2
恢复 。这次成功了。
更改后的yaml:
variables:
NUGET_PACKAGES: $(Pipeline.Workspace)/.nuget/packages
stages:
- stage: CI
displayName: 'Continuous Integration'
jobs:
- job: 'CI'
pool:
vmImage: ubuntu-latest
steps:
- task: NuGetToolInstaller@1
displayName: 'NuGet tool installer'
- task: Cache@2
inputs:
key: 'nuget | "$(Agent.OS)" | **/packages.lock.json,!**/bin/**,!**/obj/**'
restoreKeys: |
nuget | "$(Agent.OS)"
nuget
path: $(NUGET_PACKAGES)
displayName: Cache NuGet packages
- task: NuGetCommand@2
displayName: 'NuGet restore'
inputs:
command: 'restore'
restoreSolution: '**/*.sln'
feedsToUse: 'select'
vstsFeed: 'feedID'