Задача "TransformXml" не найдена (ошибка MSB4036) в сборке TeamCity
Здравствуйте, у меня есть сервер с TeamCity.
Мой проект - веб-приложение Sitecore. Я использую TDS (HedgehogDevelopment). У меня есть настройки сборки в TeamCity с MS build, и это похоже на работу, когда проект TDS отключен в менеджере конфигурации сборки.
Но после этого он enebled, я получаю чистую ошибку.
C:\Program Files (X86)\MSBuild\HedgehogDevelopment\SitecoreProject\v9.0\HedgehogDevelopment.SitecoreProject.targets(310, 5): ошибка MSB4036: задача "TransformXml" не найдена. Проверить следующее: 1.) Имя задачи в файле проекта такое же, как имя класса задачи. 2.) Класс задачи является "общедоступным" и реализует интерфейс Microsoft.Build.Framework.ITask. 3.) Задача правильно указывается в файле проекта или в *.tasks файлы, расположенные в каталоге "C:\Windows\Microsoft.NET\Framework64\v3.5". проект Ошибка NetKey.TDSMaster\MyProject.TDSMaster.scproj. проект Не удалось выполнить сайт \MyProject.sln
Помощь в описании ошибки не относится ко мне.
У меня нет VS 2012 на машине для сборки. Я установил оболочку Microsoft Visual Studio 2012
для поддержки моего веб-проекта.
Как его решить?
Благодарю.
Ответы
Ответ 1
TransformXML
входит в состав инструментов веб-публикации ASP.NET. Как правило, они обычно поставляются с установкой Visual Studio на вашем сервере сборки и требуют больше, чем просто версии оболочки Visual Studio. Установка Visual Studio Express Web Edition также может сделать трюк.
Вы можете попробовать установить пакет Web-Deploy
, чтобы узнать, достаточно ли этого, но обычно я просто устанавливаю полную версию Visual Studio на строительный агент. Это законно в соответствии с лицензией на подписку MSDN.
После некоторых экспериментов я могу сказать, что вам необходимо установить хотя бы Visual Studio Web Developer Tools на сервере сборки, чтобы эти задачи были установлены официальным способом. Я подозреваю, что установка Visual Studio Express Web Edition будет достаточной.
![enter image description here]()
Ответ 2
Попробуйте следующее:
<UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.Tasks.dll" />
Ответ 3
Краткий ответ - явно импортировать
Что я должен был сделать:
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v12.0\Web\Microsoft.Web.Publishing.targets" Condition="!Exists('$(VSToolsPath)\Web\Microsoft.Web.Publishing.targets')" />
Длинный ответ
Когда вы делаете File → New Web Project в VS2013, вы получаете следующее внутри вашего файла *.csproj:
<PropertyGroup>
<VisualStudioVersion Condition="'$(VisualStudioVersion)' == ''">10.0</VisualStudioVersion>
<VSToolsPath Condition="'$(VSToolsPath)' == ''">$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(VisualStudioVersion)</VSToolsPath>
</PropertyGroup>
<Import Project="$(MSBuildBinPath)\Microsoft.CSharp.targets" />
<Import Project="$(VSToolsPath)\WebApplications\Microsoft.WebApplication.targets" Condition="'$(VSToolsPath)' != ''" />
$(VisualStudioVersion)
всегда оценивается как 11.0
для меня на машинах сборки и на нескольких машинах разработки. Даже на машинах с VS2013, который 12.0
.
Включение в то, что я обнаружил, что в Microsoft.WebApplication.targets
сверху, у него есть строка для импорта файла, который нам действительно нужен Microsoft.Web.Publishing.targets
, только если он существует так на строке 377:
<!--Import publishing target-->
<Import Project="..\Web\Microsoft.Web.Publishing.targets" Condition="Exists('..\Web\Microsoft.Web.Publishing.targets')" />
Итак, для меня это неявный импорт Microsoft.Web.Publishing.targets
.
Проблема в том, что если этот файл не существует, он ничего не делает, и вы не знаете об этом, пока не получите ошибку при попытке использовать задачу TransformXml
.
Установка VS2013 не установила Microsoft.Web.Publishing.targets
в каталог 11.0
. Он установил его в каталог 12.0
. Я предполагаю, что если бы я установил VS2012, он бы это сделал.
В любом случае я смог решить его с помощью явно импорта Microsoft.Web.Publishing.targets
из каталога 12.0
, если он не существует и не был неявно импортируется Microsoft.WebApplication.targets
следующим образом:
<Import Project="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v12.0\Web\Microsoft.Web.Publishing.targets" Condition="!Exists('$(VSToolsPath)\Web\Microsoft.Web.Publishing.targets')" />
Ответ 4
В Visual Studio 2017 по умолчанию большинство (или все?) компонентов не установлены, но вы можете добавить то, что требуется (то есть Asp.Net и веб-разработка), как описано в https://docs.microsoft.com/en-us/visualstudio/install/modify-visual-studio.
На моей машине установщик находится в папке "C:\Program Files (x86)\Microsoft Visual Studio\Installer\vs_installer.exe"
Ответ 5
У меня была такая же проблема после переопределения инструментов TypeScript с 2.4.10 до 2.3.3 в VS2015.
Решение
Я удаляю это из файла Microsoft.TypeScript.targets
<FormatLocalizedString Condition="'$(TypeScriptVersionCheckResult)' == 'NoneSpecified'"
Culture="$(PreferredUILang)"
Name="TypeScriptNoVersionWarning"
Arguments="$(LastKnownTypeScriptVersion)">
<Output TaskParameter="String" PropertyName="TypeScriptNoVersionWarning" />
</FormatLocalizedString>
<FormatLocalizedString Condition="'$(TypeScriptVersionCheckResult)' == 'Downgrade' OR '$(TypeScriptVersionCheckResult)' == 'Upgrade'"
Culture="$(PreferredUILang)"
Name="TypeScriptVersionMismatchWarning"
Arguments="$(TypeScriptToolsVersion);$(LastKnownTypeScriptVersion)">
<Output TaskParameter="String" PropertyName="TypeScriptVersionMismatchWarning" />
</FormatLocalizedString>
Ответ 6
Если у вас есть много версий Visual Studio, попробуйте это
VS2015
<UsingTask TaskName="TransformXml"
Condition=" Exists('$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v14.0\Web\Microsoft.Web.Publishing.Tasks.dll') "
AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v14.0\Web\Microsoft.Web.Publishing.Tasks.dll"/>
VS 2017
<UsingTask TaskName="TransformXml"
Condition=" Exists('$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v15.0\Web\Microsoft.Web.Publishing.Tasks.dll') "
AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v15.0\Web\Microsoft.Web.Publishing.Tasks.dll"/>
VS 2019
<UsingTask TaskName="TransformXml"
Condition=" Exists('$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v16.0\Web\Microsoft.Web.Publishing.Tasks.dll') "
AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v16.0\Web\Microsoft.Web.Publishing.Tasks.dll"/>
<Target Name="TransformConfig">
<MakeDir Directories="$(TargetDir)" Condition=" Exists('$(TargetPath)') == False " />
<TransformXml Source="app.config"
Transform="app.$(Configuration).config"
Destination="$(TargetPath).config" />
</Target>