MSBuild терпит неудачу для решения с зависимостями проекта

Сборка для моего решения, которая содержит несколько проектов, внезапно оказывается сломанной, и причина проблемы не ясна. Все проекты в решении нацелены на одну и ту же платформу (4.5.1), однако некоторые зависимости проектов могут быть нацелены на более раннюю версию платформы. На прошлой неделе мы смогли успешно создавать решения, которые подпадают под этот сценарий. Начиная с прошлого четверга сборки, похоже, будут повреждены без каких-либо изменений на сервере сборки или в решении.

Чтобы проиллюстрировать и устранить некоторые сложности с нашей производственной настройкой, я создал пример решения, которое имитирует поведение.

Структура проекта:

  • CBI Solution
    • Веб-сайт CBI
    • Библиотека внедрения CBI
    • Библиотека CBI Core, определяющая интерфейсы

Версия Target Framework для веб-сайта и библиотек классов - 4.5.1.

Шаги репликации

Решение 1

Github-репо: https://github.com/NikitaGolovko/Solution1.git

Сборка с использованием MSBuild 14. Моя команда:

msbuild.exe "%SOLUTION1PATH%\CBILite.sln" /p:platform="Any CPU" /p:configuration="Release" /v:d

Выход

C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_compiler.exe -v /localhost_61806 -p cbi\ -u -f PrecompiledWeb\lo
  calhost_61806\
  Microsoft (R) ASP.NET Compilation Tool version 4.7.2046.0
  Utility to precompile an ASP.NET application
  Copyright (C) Microsoft Corporation. All rights reserved.


Done executing task "AspNetCompiler".
Task "Message" skipped, due to false condition; (!((false) or ('$(AspNetConfiguration)' == 'Debug') or ('$(AspNetConfig
uration)' == 'Release'))) was evaluated as (!((false) or ('Release' == 'Debug') or ('Release' == 'Release'))).
Done building target "Build" in project "cbi.metaproj".
Done Building Project "D:\Work\DotNet\Nikita\Solution1\cbi.metaproj" (default targets).

Done executing task "MSBuild".
Done building target "Build" in project "CBILite.sln".
Done Building Project "D:\Work\DotNet\Nikita\Solution1\CBILite.sln" (default targets).


Build succeeded.
    0 Warning(s)
    0 Error(s)

Time Elapsed 00:00:03.10

Полный вывод находится здесь: https://github.com/NikitaGolovko/Solution1/blob/master/MSBuild_Output.txt

Решение 2

Github Repo: https://github.com/NikitaGolovko/Solution2.git

Решение практически идентично Solution1, с единственным исключением, которое является зависимостью для Unity в библиотеке реализации CBI. Чтобы упростить процесс и устранить этап восстановления nuget, я включил в решение пакеты nuget.

Сборка с использованием MSBuild 14. Моя команда:

msbuild.exe "%SOLUTION2PATH%\CBILite.sln" /p:platform="Any CPU" /p:configuration="Release" /v:d

Выход

  C:\Windows\Microsoft.NET\Framework\v4.0.30319\aspnet_compiler.exe -v /localhost_61806 -p cbi\ -u -f PrecompiledWeb\lo
  calhost_61806\
  Microsoft (R) ASP.NET Compilation Tool version 4.7.2046.0
  Utility to precompile an ASP.NET application
  Copyright (C) Microsoft Corporation. All rights reserved.

D:\Work\DotNet\Nikita\Solution2\cbi\Index.aspx.vb(5): error BC30002: Type 'CBILite.Calculator' is not defined. [D:\Work
\DotNet\Nikita\Solution2\cbi.metaproj]
  The command exited with code 1.

Done executing task "AspNetCompiler" -- FAILED.
Done building target "Build" in project "cbi.metaproj" -- FAILED.
Done Building Project "D:\Work\DotNet\Nikita\Solution2\cbi.metaproj" (default targets) -- FAILED.

Done executing task "MSBuild" -- FAILED.
Done building target "Build" in project "CBILite.sln" -- FAILED.
Done Building Project "D:\Work\DotNet\Nikita\Solution2\CBILite.sln" (default targets) -- FAILED.


Build FAILED.

Полный вывод находится здесь: https://github.com/NikitaGolovko/Solution2/blob/master/MSBuild_Output.txt

наблюдения

Папка Bin

Просматривая папку bin на веб-сайте, я замечаю, что CBILite.dll отсутствует после сборки для Solution2, но присутствует в Solution1.

Target Framework Version

Передача Target Framework Version в аргументах MSBuild, по-видимому, не влияет на сборку. Я пытался пройти 4.5, 4.5.1 безрезультатно. ОДНАКО прохождение 3.5 приводит к успешной сборке. Это очень странно.

Metaproj

При сравнении файлов Metaproj, сгенерированных для обоих решений, единственное заметное и, казалось бы, важное отличие - это отсутствие элемента Target Framework Version. Solution1 (без зависимостей), содержит элемент v.4.0. Solution2 (с зависимостью) нет. Я не включил в репозиторий файлы metaproj, но могу поделиться ими при необходимости.

Visual Studio

Сборка решения в Visual Studio работает просто отлично.

Дополнительные мысли

Эта проблема проявилась довольно внезапно и, похоже, затрагивает большинство наших решений со смешанными проектами (веб-сайт C#/VB +). Веб-проекты продолжают нормально функционировать.

Я пытался использовать MSBuild 15, но это привело к тому же поведению.

Есть несколько обходных путей

  1. Сохраните файл metaproj вместе с решением и измените его вручную, добавив элемент v4.5.1.
  2. Добавление дополнительного шага сборки для ручного копирования CBILib.dll в проект веб-сайта (через командный файл или другими способами).
  3. Добавление файла обновления для веб-сайта, указывающего на папку CBILib/bin/Release

Хотя все эти решения могут работать, они, безусловно, взломаны и будут представлять проблемы в будущем.

Я надеюсь, что у кого-то есть лучшее предложение о том, как справиться с этим.

0 ответов

Убедитесь, что вы установили следующие пакеты NuGet:

  • Microsoft.NET.Test.Sdk

  • MSTest.TestAdapter

  • MSTest.TestFramework

  • Microsoft.NETCore.App (если вы используете.NET Core)

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