在Azure Devops上构建时,找不到项目.assets.json文件。

21
我已经在Azure DevOps上为一个Service Fabric解决方案配置了构建流水线,如下所示:

Build tasks

一切都很好,直到几天前,在特定的构建代理(私有)上出现构建失败的情况,以下是错误信息(对于一些项目):

C:\Program Files\dotnet\sdk\2.1.200\Sdks\Microsoft.NET.Sdk\build\Microsoft.PackageDependencyResolution.targets(327,5): Error : Assets file 'F:\Agent03\w\84\s\src\MyProject.Sam.Tiles.Domain\obj\project.assets.json' not found. Run a NuGet package restore to generate this file.

失败的任务是“Build solution $(PathToSolution)”任务。
奇怪的是,“在某些代理上运行会导致构建失败,但在其他代理上构建正常”。
一些细节:
  • Use NuGet 4.x任务最近开始使用NuGet v4.9.1,我认为是这个原因。我尝试使用v4.8.1,但没有成功;
  • 大多数项目使用PackageReference格式,但.sfproj项目使用packages.config文件;
  • 我尝试使用dotnet restore任务,但在尝试为.sfproj项目恢复包时出现错误:

    Error : Unable to find the

    “....\packages\Microsoft.VisualStudio.Azure.Fabric.MSBuild.1.6.7\build\Microsoft.VisualStudio.Azure.Fabric.Application.props” 文件。请恢复 “Microsoft.VisualStudio.Azure.Fabric.MSBuild” NuGet 包。

您有任何想法,是什么导致了这个问题?


根目录中有一个.gitignore文件。我相信它是Visual Studio的默认文件,经过了一些小的更改。是的,它包含了针对binobj**/packages/*(nuget)的规则。 - Rui Jarimba
有人覆盖了.gitignore并意外地将它们提交到源代码控制吗? - Daniel Mann
@DanielMann 你是指NuGet包吗?不,包不在源代码控制之下。 - Rui Jarimba
CI使用源代码的干净副本吗?您是否尝试在本地计算机上检出干净的副本并还原+构建解决方案? - Oleg Karasik
2
我知道NuGet需要恢复依赖图中的每个项目。我相信在Visual Studio中构建解决方案不会构建或还原不在解决方案中的项目,即使解决方案中的项目对其具有项目引用,但我不知道MSBuild是否具有相同的限制。我怀疑是的,因为Visual Studio在幕后大量使用MSBuild。如果您遇到了这种情况,那么这是一个已知问题/设计问题。虽然这并没有回答为什么行为发生了变化。 - zivkan
显示剩余10条评论
3个回答

23

一些项目使用PackageReference格式,但.sfproj项目使用packages.config文件。

我仍然不明白为什么构建会开始失败,但我能找到一个解决方法。鉴于PackageReference在Service Fabric项目中尚未得到支持,我的解决方法是同时使用两个还原任务,如下:

Build tasks


1
NuGet恢复应该足够,因为它适用于PackageReferencepackages.config。如果不行,可能会有问题。如果您能在https://github.com/NuGet/Home/issues上提交一个带有重现步骤的问题,我们将不胜感激。 - Anand Gaurav

9

2月20日Trevor的评论给了我启示。你可能没有完整的项目集,这些项目集被解决方案引用(ProjectReferences可能是其他未包含在解决方案中的项目)。

以下是这个疯狂的解决方法(运行dotnet.exe和nuget.exe restore任务)成功的原因:

默认情况下,dotnet restore将沿着项目引用进行遍历,以确保它们也被还原。 --no-dependencies开关可以关闭该功能。

nuget.exe restore则有相反的默认设置,因为我们不想破坏旧用户。 -recursive可以打开此功能。

正确的解决方法是将所有项目包含在解决方案中。

-Rob Relyea NuGet客户端团队,工程经理


8

我的问题原来是一个解决方案,其中并未包括所有必要的项目。

我有一个主解决方案文件,其中包括所有我的项目,还有一些仅包含部分项目的较小解决方案文件。主解决方案在Azure DevOps中构建成功,但是部分解决方案失败了。

我意识到缺失的project.assets.json文件属于一个需要包含在这个失败解决方案中的项目。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接