Azure DevOps中Cache@2任务缓存NuGet包失败求助
解决Azure DevOps Cache@2缓存NuGet包路径错误问题
你的问题核心是缓存路径与NuGet实际包存储路径不匹配:
问题原因
- 你配置的
$(Pipeline.Workspace)/.nuget/packages是作业工作区路径,但在Ubuntu代理上,NuGet默认会将包安装到用户主目录下的.nuget/packages(即/home/vsts/.nuget/packages),而非作业工作区。 $(Agent.HomeDirectory)指向的是代理安装目录(如/home/vsts/agent),并非用户主目录,所以用它也无法定位到正确的包路径。
- 你配置的
优雅的解决方案
不要硬编码路径,改用Azure DevOps预定义变量或NuGet官方环境变量来定位包目录:方案一:使用跨平台的
$(HOME)变量$(HOME)在Linux/macOS代理上指向用户主目录,Windows代理上指向C:\Users\VssAdministrator,对应NuGet包目录为$(HOME)/.nuget/packages(Linux/macOS)或$(HOME)\.nuget\packages(Windows),跨平台通用:variables: nugetPackages: $(HOME)/.nuget/packages方案二:使用NuGet官方环境变量
$(NUGET_PACKAGES)
这个变量由NuGet自动设置,直接指向当前环境下的包存储目录,无需区分操作系统,是最可靠的方式:variables: nugetPackages: $(NUGET_PACKAGES)修正后的完整YAML示例
variables: nugetPackages: $(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'额外说明
如果需要强制NuGet将包安装到作业工作区(比如$(Pipeline.Workspace)/.nuget/packages),可以在DotNetCoreCLI@2的restore步骤中添加arguments: '--packages $(nugetPackages)',这样缓存路径和安装路径就能匹配,但这种方式会改变NuGet默认的包存储位置,一般不推荐。
内容的提问来源于stack exchange,提问作者David Masters
相关产品推荐
相关产品推荐

