Не удалось загрузить задачу TransformXml из Microsoft.Web.Publishing.Tasks.dll

95

Кто-нибудь видел эту ошибку и знает, как ее исправить?

Не удалось загрузить задачу «TransformXml» из сборки C: \ Program Files (x86) \ MSBuild \ Microsoft \ VisualStudio \ v11.0 \ Web \ Microsoft.Web.Publishing.Tasks.dll.

Не удалось загрузить файл или сборку «file: /// C: \ Program Files (x86) \ MSBuild \ Microsoft \ VisualStudio \ v11.0 \ Web \ Microsoft.Web.Publishing.Tasks.dll» или одну из его зависимостей. Система не может найти указанный файл.

Убедитесь, что объявление верное, что сборка и все ее зависимости доступны, а задача содержит открытый класс, реализующий Microsoft.Build.Framework.ITask.

В другом месте я читал, что проблема в том, что у вас не установлен SQL Server. Но у меня установлен SQL Express 2012 x64 с пакетом обновления 1 (SP1). Я также использую VS 2013 Professional.

Я без проблем запускал то же самое решение в VS 2012 Express.

Алленкодированный
источник
1
Это должен быть пакет nuget. Мне не нравятся эти скрытые ссылки внутри моего проекта.
Jaider
Вы должны отметить ответ Бенджамина Шайбе как правильный. Кажется, это лучшее решение
BHuelse

Ответы:

163

Ответы Дай Бока и emalamisura работают нормально, пока вы используете Visual Studio 2012. Для VS 2013 это тоже не работает. Чтобы это работало со всеми версиями Visual Studio, вам необходимо:

  • Откройте файл проекта (.csproj) проекта, который не загружается.
  • Ищи <Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.targets" />
  • Измените это на <Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.targets" />
  • Перезагрузить проект

Это установит правильную версию Visual Studio динамически и правильно.

Бен Ш
источник
2
Мне нравится ваше решение, Бенджамин, но проблема, с которой я столкнулся, заключалась в том, что папка v11 отсутствовала, возможно потому, что у нас есть люди, использующие vs2010, и еще не обновились до vs2012
Дай Бок
7
Это привело меня к правильному пути, но я внес изменения в узел <UsingTask TaskName = "TransformXml" ...>. В моем AssemblyFile использовалась неправильная версия. Просто нужно было здесь поменять версию. Другой вариант - использовать макрос версии вместо явной установки версии.
Скотт,
5
$(VisualStudioVersion)возвращает более раннюю версию :(
Jaider
1
Это может быть параметр: stackoverflow.com/questions/20002532/…
Jaider
2
Отлично работает при обновлении с VS2015 до VS2017. Теперь я могу открыть решение в обеих IDE.
Юрий Щкатула
29

Чтобы мой заработал, я просто скопировал свою v10.0папку и переименовал ее вv11.0 , и с тех пор все, кажется, работает хорошо. На данный момент это быстрое решение.

Поскольку это, вероятно, не лучшее решение, и хотя оно работает, я собирался попробовать установить Microsoft Windows SDK для Windows 7 и .NET Framework 4 Windows SDK для Windows 7 и .NET Framework 4, но это займет слишком много времени, чтобы скачать.

Дай Бок
источник
1
Я не видел папку «Интернет» в версии 10.0. Поэтому я скопировал его из папки v12.0 в папку v11.0.
Sundeep
9

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

Чтобы использовать его вне проекта веб-приложения, я попытался добавить элемент UsingTask в свой проект и указать его в нужном месте, используя свойства сборки ms (как продемонстрировал Бенджамин). Однако их не было на моем сервере сборки (те, у кого есть легкий доступ к файловой системе своего сервера сборки, вероятно, могут пропустить это и просто установить соответствующий пакет в Visual Studio). Я даже зашел так далеко, что написал версии для визуальной студии с жестким кодом, но это всегда вызывало эту ошибку.

Я наконец сдался, вытащил библиотеки DLL со своего локального ПК:

C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v12.0\Web\Microsoft.Web.Publishing.Tasks.dll
C:\Program Files (x86)\MSBuild\Microsoft\VisualStudio\v12.0\Web\Microsoft.Web.XmlTransform.dll

Я загрузил их в систему управления версиями и добавил эту папку в рабочую область моей сборки («Изменить определение сборки» -> «Настройки источника» -> «Папка управления исходным кодом»). Оттуда мне даже не нужно ссылаться на папку - вот как выглядит мой UsingTask:

  <UsingTask TaskName="TransformXml" AssemblyFile="Microsoft.Web.Publishing.Tasks.dll" />

Теперь я могу сколько угодно использовать задачу TransformXml из любого проекта.

Bvoyelr
источник
9
Пакет MSBuild.Microsoft.VisualStudio.Web.targets содержит необходимые целевые объекты для сборки без установленной VS. Например: <UsingTask TaskName = "TransformXml" AssemblyFile = "packages \ MSBuild.Microsoft.VisualStudio.Web.targets.11.0.2.1 \ tools \ VSToolsPath \ Web \ Microsoft.Web.Publishing.Tasks.dll" />. См. Этот блог для более подробной информации
moonpatrol
1
Привет, @moonpatrol, ты должен дать ему ответ, потому что я предпочитаю этот способ - установить пакет и затем сослаться на него - абсолютно универсальное решение :-) Я только что попробовал, и работает отлично. В любом случае, спасибо! если вы ответите, просто пингуйте меня, и я проголосую.
Тенгиз
9

Чтобы исправить проблему,

  1. Найдите установщик Visual Studio на своем компьютере
  2. Щелкните или коснитесь, чтобы запустить установщик, а затем выберите «Изменить».
  3. На экране «Отдельные компоненты» выберите Asp.net и инструменты веб-разработки, а затем выберите «Изменить / установить».

Это решило проблему, поскольку создает библиотеки DLL по указанному пути.

Винодхини Рамасами
источник
2
Я использую VS2017, и выполнение этого шага не создает эти файлы. Я думаю, что, возможно, вы выбрали что-то еще (или в сочетании с ASP.net и инструментами веб-разработки), которое это добавило. Не уверен, что :(
Крис
Я выбрал только это. Попробуйте выбрать веб-компоненты и установить их. Но удачи.
Винодхини Рамасами
Я просто перепробовал весь веб-рабочий процесс, но до сих пор у меня нет этих файлов. Я чувствую, что это решение так близко. Хотелось бы, чтобы его можно было указать, так как у меня ограниченное пространство на моем жестком диске для установки компонентов
Роберт Снайдер
4
Для VS2017 я это сделал Tools → Get Tools and Features... → Individual Components: Windows 10 SDK (10.0.14393.0) and ASP.NET and web development tools . Похоже, это сработало.
Джон Джонс
6

Для VS2019

<UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(MSBuildToolsVersion

Я заменил MSBuildToolsVersionна VisualStudioVersion.

vik_78
источник
В этом документе « docs.microsoft.com/visualstudio/msbuild/… » измените MSBuildToolsVersion на VisualStudioVersion, затем я изменю это свойство, которое хорошо работает, например: « $ (MSBuildExtensionsPath32) \ Microsoft \ VisualStudio \ v $ (VisualStudioVersion) »
Ким Ки Вон
5

Поскольку в моей папке VisualStudio есть только v12.0, v14.0 и v15.0, я редактирую файл проекта и меняю путь ссылки с v10.0 на v14.0. Тогда проект успешно строится.

Перед:

<UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.Tasks.dll" />

После:

<UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v14.0\Web\Microsoft.Web.Publishing.Tasks.dll" />
Лезвие
источник
2

Правильный ответ на это - выгрузить проект, о котором идет речь, а затем отредактировать файл csproj, найти запись, в которой они ссылаются на путь 10.0, и изменить его, чтобы вместо этого указывать на 11.0.

Emalamisura
источник
+1 за это. Я вызвал эту проблему, когда скопировал папки рабочего пространства с одной машины разработчика на другую. На второй машине разработчика была установлена ​​версия 11, а не 10. Таким образом, папка v10 оказалась пустой.
maplemale 08
1

Чтобы это работало, вам нужны две вещи:

1) Установите Visual Studio Build Tools (вам не нужна вся Visual Studio, только VS Build Tools) с выбранной опцией «Инструменты сборки для веб-разработки» на вашем сервере сборки. https://www.visualstudio.com/pl/thank -you-download-visual-studio /? sku = BuildTools & rel = 15

2) Убедитесь, что путь к Microsoft.Web.Publishing.Tasks.dll правильный.

  <UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(MSBuildToolsVersion)\Web\Microsoft.Web.Publishing.Tasks.dll" />
цезарипятек
источник
1

Для меня он начал работать, просто добавив ссылку на пакет NuGet MSBuild.Microsoft.VisualStudio.Web.targets v14.0.0.3

Даже нет необходимости добавлять элемент UsingTask в файл проекта, как это было указано автором пакета.

https://github.com/pdonald/nuget-webtargets

Просто установите пакет NuGet. Пакет автоматически устанавливает свойство $ (VSToolsPath) для использования целевого файла в папке инструментов.

А затем я смог использовать TransformXml и другие задачи, определенные в пакете, например, для преобразования app.config

  <Target Name="app_config_AfterCompile" AfterTargets="AfterCompile" Condition="Exists('app.$(Configuration).config')">
    <!--Generate transformed app config in the intermediate directory-->
    <TransformXml Source="app.config" Destination="$(IntermediateOutputPath)$(TargetFileName).config" Transform="app.$(Configuration).config" />
    <!--Force build process to use the transformed configuration file from now on.-->
    <ItemGroup>
      <AppConfigWithTargetPath Remove="App.config" />
      <AppConfigWithTargetPath Include="$(IntermediateOutputPath)$(TargetFileName).config">
        <TargetPath>$(TargetFileName).config</TargetPath>
      </AppConfigWithTargetPath>
    </ItemGroup>
  </Target>
Билл
источник
0

На всякий случай, если кто-то использует csproj в стиле SDK, вы можете добиться этого, не устанавливая Visual Studio на сервере сборки.

  1. Сначала вы должны установить пакет nuget SlowCheetah в свой проект. После его установки вы увидите следующее в своем проекте в стиле SDK.

    <PackageReference Include="Microsoft.VisualStudio.SlowCheetah" Version="3.2.20">
            <PrivateAssets>all</PrivateAssets>
            <IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
    </PackageReference>
    
  2. Затем убедитесь, что вы добавили атрибут GeneratePathProperty = "true" (см. Ниже). Это очень важно для следующей части, потому что это поможет вам определить путь восстановления пакета nuget на вашем компьютере. Джордж Дангл объясняет это в своей статье здесь .

    <PackageReference Include="Microsoft.VisualStudio.SlowCheetah" Version="3.2.20" GeneratePathProperty="true">
            <PrivateAssets>all</PrivateAssets>
            <IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
    </PackageReference>
    
  3. Импортируйте цели SlowCheetah в свой проект:

    <Import Project="$(PkgMicrosoft_VisualStudio_SlowCheetah)\build\Microsoft.VisualStudio.SlowCheetah.targets" />
    
  4. Теперь вы можете использовать целевую команду (в данном случае после публикации) для применения некоторых пользовательских преобразований. Если вам нужно, вы всегда можете жестко запрограммировать имена файлов ниже вместо использования переменных в приведенном ниже примере.

    <Target Name="AfterPublishs" AfterTargets="Publish">
         <TransformTask Source="Web.config" Transform="Web.$(Configuration).MyCustomTransformFile.config" Destination="$(PublishDir)\Web.config" />
    </Target>
    

Если вы раньше не использовали SlowCheetah , рекомендую попробовать . У них есть расширение Visual Studio, которое упростит предварительный просмотр файлов преобразования.

Эрик Чхун
источник