MSBuild 15.0 (Visual Studio 2017) ошибка MSB4067 для проектов SSDT (SSRS и SSAS): "Элемент <State> под элементом <Project> не распознан"

MSBuild 14.0 (версия, входящая в состав Visual Studio 2015) предупреждает журналы (MSB4078) при создании решения, содержащего проекты SSDT (проекты rptproj или dwproj). Например:

warning MSB4078: файл проекта "Reports.rptproj" не поддерживается MSBuild и не может быть создан.

Это хорошо, MSBuild не поддерживает проекты SSDT, и мы должны вернуться к их созданию с помощью Visual Studio (т.е. devenv.com). См., Например, этот ответ.

При использовании MSBuild 15.0 (версия, входящая в состав Visual Studio 2017), однако, создание одного и того же файла решения дает следующую ошибку:

Reports.rptproj(3,3): ошибка MSB4067: Элемент <State> под элементом <Project> непризнан.

Хотя я мог удалить проекты SSDT из конфигурации сборки, это не идеально, поскольку я хочу, чтобы они были созданы при построении решения из Visual Studio.

Есть ли способ понизить ошибку MSB4067 до предупреждения или пропустить определенные проекты при построении решения?

Ответ 1

Обновление (октябрь 2017 г.)

В последней версии проектов Microsoft Reporting Services для Visual Studio (1.18) добавлена поддержка MSBuild для проектов SSRS. После установки проекты SSRS могут быть обновлены до формата, поддерживаемого MSBuild, что предотвращает возникновение этой проблемы.


Оригинальный ответ

Это ошибка в MSBuild 15, помеченная для исправления в "фундаментальном обновлении 2".

Обходной путь, предложенный одним из сопровождающих MSBuild в потоке выпуска GitHub:

Поместите файл с этим содержимым рядом с вашим файлом .sln со специальным именем after.{yoursolutionname}.sln.targets:

<Project InitialTargets="WorkAroundMSBuild2064">
 <Target Name="WorkAroundMSBuild2064">
  <!-- Work around https://github.com/Microsoft/msbuild/issues/2064 by
   removing *.rptproj from the generated solution metaproject. -->
  <ItemGroup>
   <ProjectReference Remove="%(ProjectReference.Identity)"
                 Condition="'@(ProjectReference->'%(Extension)')' == '.rptproj'" />
  </ItemGroup>
 </Target>
</Project>

Это похоже на работу при условии, что нет зависимости проекта от других .csproj проектов к .rptproj проектов.

Ответ 2

Пропуск проектов можно выполнить с помощью /ignoreprojectextensions:.rptproj, но я все еще получаю предупреждение (на VS2015), поэтому, вероятно, вы все равно получите ошибку.

Можно указать список тех, которые вы хотите создать с помощью

msbuild /t:myCsProj /t:mySqlProj /t:myOtherProjThatIsntaRptProj

Независимо от того, является ли это жизнеспособным, конечно, зависит от того, сколько "других" проектов у вас есть в вашем решении.

В качестве альтернативы существуют некоторые способы привязки MSBuild к работе с другими типами проектов (например, https://speaksql.wordpress.com/2013/06/07/a-journey-to-db-deployment-automaton-ssis-build-using-msbuild/).

Я видел этот подход "в дикой природе" пару раз, но только для SSIS. Я слышал, что это может быть сделано для работы в SSRS/SSAS тоже.