我有一个 .net core 3.1 解决方案,其中包含多个 Web 和类库项目。所有包都使用文件<PackageReference>
中的格式.csproj
。
我正在使用 Azure DevOps Pipelines 构建解决方案,我想通过缓存 Nuget 包而不是在每次运行时从 nuget.org 恢复它们来减少构建时间。
根据文档和博客文章的一些指导,我已经:
将此
nuget.config
文件添加到我的解决方案中,以便始终从 nuget.org 恢复包:<?xml version="1.0" encoding="utf-8"?> <configuration> <packageSources> <clear /> <add key="nuget.org" value="https://api.nuget.org/v3/index.json" protocolVersion="3" /> </packageSources> </configuration>
在我的解决方案中添加了一个
Directory.Build.props
文件,以便对于每个项目,packages.lock.json
在构建时都会生成一个。<Project> <PropertyGroup> <RestorePackagesWithLockFile>true</RestorePackagesWithLockFile> <DisableImplicitNuGetFallbackFolder>true</DisableImplicitNuGetFallbackFolder> </PropertyGroup> </Project>
将生成的
packages.lock.json
文件添加到 git。将Cache@2任务集成到我的
azure-pipeline.yml
文件中,如下所示:trigger: - master - users/* pool: vmImage: 'windows-latest' variables: buildConfiguration: 'Debug' NUGET_PACKAGES: $(Pipeline.Workspace)/.nuget/packages steps: - task: Cache@2 displayName: Cache nuget packages inputs: key: 'nuget 5 | "$(Agent.OS)" | **/packages.lock.json,!**/bin/**' restoreKeys: | nuget 5 | "$(Agent.OS)" path: $(NUGET_PACKAGES) cacheHitVar: CACHE_RESTORED5 - task: DotNetCoreCLI@2 displayName: 'Restoring nuget packages ($(buildConfiguration))' condition: ne(variables.CACHE_RESTORED5, 'true') inputs: command: 'restore' projects: '**/*.csproj' includeNuGetOrg: true arguments: '--configuration $(buildConfiguration)' - task: DotNetCoreCLI@2 displayName: 'Build solution ($(buildConfiguration))' inputs: command: 'build' arguments: '--configuration $(buildConfiguration) --no-restore'
我已经成功地运行了管道,所以在第一次运行时它会从 nuget.org 恢复包并将它们保存到缓存中,在随后的运行中它会从缓存中读取它们。
我的问题是,我的构建每隔一段时间就会在“构建解决方案”阶段中断,并为我的每个解决方案项目显示这种错误消息:
##[错误]C:\Program Files\dotnet\sdk\3.1.402\Sdks\Microsoft.NET.Sdk\targets\Microsoft.PackageDependencyResolution.targets(241,5):错误 NETSDK1004:资产文件 'D:\a \1\s\MyProject\obj\project.assets.json' 未找到。运行 NuGet 包还原以生成此文件。
当这种情况发生时,我不得不增加我的缓存键和环境变量来强制刷新缓存,然后下面的构建工作。
我的问题是 -为什么会发生这种情况,我该如何解决它,以便我的构建不再如此不稳定?