Файл ресурсов project.assets.json не найден при запуске сборки в Azure Devops

У меня есть конвейер сборки, настроенный для решения Service Fabric в Azure DevOps, например:

Файл ресурсов project.assets.json не найден при запуске сборки в Azure Devops

Все было хорошо до тех пор, пока несколько дней назад сборка не начала давать сбой на конкретном агенте сборки (частном) со следующей ошибкой (для нескольких проектов):

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' file. Please restore the 'Microsoft.VisualStudio.Azure.Fabric.MSBuild' Nuget package

Есть идеи, что может вызвать эту проблему?

У вас есть соответствующий .tfignore / .gitignore (в зависимости от того, какой вы используете для управления версиями), который исключает папки bin, obj и packages? Можете ли вы подтвердить, что эти папки не находятся в системе контроля версий?

Daniel Mann 29.11.2018 18:04

В корневой папке находится файл .gitignore. Я считаю, что он используется по умолчанию для Visual Studio с некоторыми изменениями minro. Да, есть правила для bin, obj и **/packages/* (nuget)

Rui Jarimba 29.11.2018 18:09

Кто-то переопределил .gitignore и случайно передал их в систему контроля версий?

Daniel Mann 29.11.2018 18:31

@DanielMann вы имеете в виду пакеты nuget? Нет, пакеты не находятся под контролем источника.

Rui Jarimba 29.11.2018 18:48

CI использует чистую копию исходников? Вы пытались проверить чистую копию на своем локальном компьютере и восстановить + построить решение?

Oleg Karasik 30.11.2018 07:26

@OlegKarasik да чистю исходники - в выпадающем списке All build directories выбран Clean options. Эта сборка дает сбой только при использовании определенных агентов, и она была запущена всего несколько дней назад.

Rui Jarimba 30.11.2018 08:40

Поскольку это частный агент сборки, есть ли у вас к нему удаленный доступ? Можете ли вы проверить, что все каталоги действительно удалены (или удалите их вручную)? Подобная ошибка случилась с моим локальным ящиком несколько раз, и всегда была связана с неудаленными вещами.

Oleg Karasik 30.11.2018 08:59

@OlegKarasik да, у меня есть удаленный доступ к виртуальной машине частного агента. Я могу попробовать, даже если я не уверен, какие папки удалить? Кроме того, я не совсем уверен, что это будет иметь значение, потому что агент, похоже, создает новую папку для каждой сборки (например, F:\Agent01\w\499\s)

Rui Jarimba 30.11.2018 09:29

вы можете попробовать добавить этап сборки для выполнения msbuild /t:restore в дополнение к восстановлению nuget. msbuild /t:restore не будет работать с проектами packages.config. Я думаю, что nuget.exe подойдет для «классических» проектов csproj, использующих PackageReference, но я действительно не уверен в проектах SDK. Хотя я думал, что создание проектов SDK автоматически восстанавливает их, я удивлен, что это не работает автоматически.

zivkan 30.11.2018 16:10

Не случайно ли в вашем репозитории несколько решений, и MyProject.Sam.Tiles.Domain не входит ни в одно из них, а в другом проекте решения есть ссылка на MyProject.Sam.Tiles.Domain?

zivkan 30.11.2018 16:12

@Ziv Я могу подтвердить, что в этом репозитории есть 2 решения. Я не уверен насчет ссылок, мне нужно спросить об этом у группы разработчиков, которая отвечает за этот репозиторий.

Rui Jarimba 30.11.2018 16:25

@Ziv, запускающий обе задачи восстановления (стандартное восстановление и восстановление сети), поможет, но я пытаюсь понять, почему эта проблема началась всего несколько дней назад и почему сборка не прерывается при использовании некоторых агентов?

Rui Jarimba 30.11.2018 16:28

Вы можете попробовать добавить nuget.exe -version и dotnet --info в журналы сборки, чтобы проверить, установлены ли разные версии или разные SDK на разных агентах. Вы также можете попробовать поискать / открыть проблему на NuGet / Главная, где кто-то умнее меня может дать лучшее понимание.

zivkan 30.11.2018 16:36

@Ziv Я могу подтвердить, что в обоих решениях есть ссылки на разные проекты.

Rui Jarimba 30.11.2018 16:37

Я знаю, что nuget нужно восстановить каждый проект в графе зависимостей. Я считаю, что создание решения в Visual Studio не будет создавать или восстанавливать проекты, не входящие в решение, даже если проект в решении имеет ссылку на проект, но я не знаю, имеет ли msbuild такое же ограничение. Я подозреваю, что да, потому что Visual Studio активно использует MSBuild. Если это тот случай, с которым вы столкнулись, это известная проблема / по своей природе. Однако он не отвечает на вопрос, почему изменилось поведение.

zivkan 30.11.2018 16:41
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
15
15
14 820
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Некоторые проекты используют формат PackageReference, но проект .sfproj использует файл packages.config.

Я до сих пор не понимаю, почему сборка начала давать сбой, но мне удалось найти обходной путь. Учитывая, что PackageReference еще не поддерживается в проектах Service Fabric, я решил использовать следующие задачи восстановления оба:

Build tasks

Восстановление NuGet должно быть достаточным, поскольку оно работает как для PackageReference, так и для packages.config. В противном случае может быть проблема. Был бы признателен, если бы вы могли подать проблему с некоторым воспроизведением на github.com/NuGet/Home/issues

Anand Gaurav 20.02.2019 19:33

Моя проблема оказалась решением, в которое не вошли все необходимые проекты.

У меня есть главный файл решения, который включает все моих проектов, и несколько файлов меньшего размера только с некоторыми проектами. Основное решение отлично построено в Azure DevOps, но частичное решение не удалось.

Я понял, что отсутствующий файл project.assets.json принадлежит проекту, который необходимо включить в это неудачное решение.

Комментарий Тревора от 20 февраля дал мне ключ к разгадке. Скорее всего, у вас нет полного набора проектов, на которые ссылается решение. (ProjectReferences может перейти к другим проектам, которых нет в решении).

Вот почему этот безумный обходной путь (запуск задач восстановления dotnet.exe и nuget.exe) сработал:

dotnet restore по умолчанию просматривает ссылки на проекты, чтобы убедиться, что они также восстанавливаются. Переключатель --no-dependencies может выключить это.

Восстановление nuget.exe имеет противоположное значение по умолчанию, потому что мы не хотели ломать старых пользователей. -recursive может это включить.

Правильное решение - сделать так, чтобы ваше решение содержало все проекты.

-Роб Релье Группа клиентов NuGet, технический менеджер

Другие вопросы по теме