Nie można załadować zadania TransformXml z Microsoft.Web.Publishing.Tasks.dll

95

Czy ktoś widział ten błąd i wie jak to naprawić?

Nie można załadować zadania „TransformXml” z zestawu C: \ Program Files (x86) \ MSBuild \ Microsoft \ VisualStudio \ v11.0 \ Web \ Microsoft.Web.Publishing.Tasks.dll.

Nie można załadować pliku lub zestawu „file: /// C: \ Program Files (x86) \ MSBuild \ Microsoft \ VisualStudio \ v11.0 \ Web \ Microsoft.Web.Publishing.Tasks.dll” lub jednej z jego zależności. System nie może odnaleźć określonego pliku.

Upewnij się, że deklaracja jest poprawna, że ​​zestaw i wszystkie jego zależności są dostępne oraz że zadanie zawiera publiczną klasę, która implementuje Microsoft.Build.Framework.ITask.

Gdzie indziej czytałem, że problem występuje, gdy nie masz zainstalowanego programu SQL Server. Ale mam SQL Express 2012 x64 zainstalowany z dodatkiem SP1. Używam również VS 2013 Professional.

Uruchomiłem dokładnie to samo rozwiązanie w VS 2012 express bez żadnych problemów.

Allencoded
źródło
1
Powinien to być pakiet nuget. Nie podoba mi się te ukryte odniesienia w moim projekcie.
Jaider
Powinieneś oznaczyć odpowiedź Benjamina Scheibe jako poprawną. Wydaje się, że to najlepsze rozwiązanie
BHuelse

Odpowiedzi:

163

Odpowiedzi udzielone przez Dai Boka i emalamisurę działają dobrze, o ile używasz programu Visual Studio 2012. W przypadku VS 2013 również się to nie udaje. Aby to działało ze wszystkimi wersjami programu Visual Studio, należy:

  • Otwórz plik projektu (.csproj) projektu, którego nie można załadować
  • Szukaj <Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.targets" />
  • Zmień to na <Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.targets" />
  • Załaduj ponownie projekt

Spowoduje to dynamiczne i prawidłowe ustawienie poprawnej wersji programu Visual Studio.

Ben Sch
źródło
2
Podoba mi się twoje rozwiązanie Benjamin, ale problem, który miałem, polegał na tym, że brakowało folderu v11, prawdopodobnie dlatego, że mamy kilka osób używających vs2010 i jeszcze nie zaktualizowaliśmy do vs2012
Dai Bok
7
To sprawiło, że zacząłem od właściwej ścieżki, ale zmiana, którą wprowadziłem, dotyczyła węzła <UsingTask TaskName = "TransformXml" ...>. Mój plik AssemblyFile używał złej wersji. Wystarczy zmienić wersję tutaj. Inną opcją byłoby użycie makra wersji zamiast jawnego ustawiania wersji.
Scott
5
$(VisualStudioVersion)zwraca wcześniejszą wersję :(
Jaider
1
Może to być parametr: stackoverflow.com/questions/20002532/…
Jaider
2
Doskonale działa podczas aktualizacji z VS2015 do VS2017. Teraz mogę otworzyć rozwiązanie w obu IDE.
Yury Schkatula
29

Aby zabrać mój do pracy, po prostu skopiowałem mój v10.0folder i zmieniłem jego nazwę nav11.0 i od tego czasu wszystko wydaje się działać dobrze. Na razie to szybkie rozwiązanie.

Ponieważ prawdopodobnie nie jest to najlepsze rozwiązanie i chociaż działa, zamierzałem spróbować zainstalować zestaw Microsoft Windows SDK dla Windows 7 i .NET Framework 4 Windows SDK dla Windows 7 i .NET Framework 4, ale trwa to zbyt długo. Ściągnij.

Dai Bok
źródło
1
Nie widziałem folderu „Web” w wersji 10.0. Więc skopiowałem go z folderu v12.0 do folderu v11.0.
Niedziela,
9

Walczyłem z tym problemem na naszym serwerze kompilacji od kilku dni, więc pomyślałem, że udokumentuję rozwiązanie, do którego doszedłem. Po pierwsze, mój serwer kompilacji ma zainstalowane rozszerzenia do publikowania w Internecie . Mogę użyć zadania TransformXml do treści mojego serca w projekcie aplikacji internetowej.

Aby użyć go poza projektem aplikacji internetowej, próbowałem dodać element UsingTask do mojego projektu i wskazać go we właściwym miejscu za pomocą właściwości ms build (jak pokazał Benjamin). Jednak nie było ich na moim serwerze kompilacji (ci, którzy mają łatwy dostęp do systemu plików swojego serwera kompilacji, prawdopodobnie mogą to pominąć i po prostu zainstalować odpowiedni pakiet w programie Visual Studio). Posunąłem się nawet do sztywnych wersji Visual Studio, ale zawsze zrzucało to na mnie ten błąd.

W końcu się poddałem, ściągnąłem biblioteki DLL z mojego lokalnego komputera:

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

Przesłałem je do kontroli źródła i dodałem ten folder do obszaru roboczego mojej kompilacji (Edytuj definicję kompilacji -> Ustawienia źródła -> Folder kontroli źródła). Stamtąd nie muszę nawet odwoływać się do folderu - oto jak wygląda moje UsingTask:

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

Teraz mogę użyć zadania TransformXml do syta z dowolnego projektu.

bvoyelr
źródło
9
MSBuild.Microsoft.VisualStudio.Web.targets pakiet posiada niezbędne cele budować bez zainstalowane VS. Na przykład: <UsingTask TaskName = "TransformXml" AssemblyFile = "packages \ MSBuild.Microsoft.VisualStudio.Web.targets.11.0.2.1 \ tools \ VSToolsPath \ Web \ Microsoft.Web.Publishing.Tasks.dll" />. Zobacz ten blog, aby uzyskać więcej informacji
moonpatrol
1
Hej @moonpatrol, powinieneś odpowiedzieć, bo wolę ten sposób - instalowanie pakietu, a następnie polecanie go - absolutnie uniwersalne rozwiązanie :-) Właśnie go wypróbowałem i działa idealnie. Mimo wszystko dziekuję! jeśli dasz odpowiedź, po prostu daj mi znać, a zagłosuję.
Tengiz
9

Aby rozwiązać problem,

  1. Znajdź Instalatora programu Visual Studio na swoim komputerze
  2. Kliknij lub dotknij, aby uruchomić instalator, a następnie wybierz opcję Modyfikuj.
  3. Na ekranie Poszczególne składniki wybierz Asp.net i narzędzia do tworzenia aplikacji internetowych, a następnie wybierz opcję Modyfikuj / Zainstaluj.

To rozwiązało problem, ponieważ tworzy pliki DLL we wspomnianej ścieżce.

Vinodhini Ramasamy
źródło
2
Używam VS2017 i wykonanie tego kroku nie powoduje utworzenia tych plików. Myślę, że może coś innego, co wybrałeś (lub w połączeniu z ASP.net i narzędziami do tworzenia stron internetowych), które to dodało. Ale nie wiem co :(
Kris
Wybrałem tylko to. Spróbuj wybrać komponenty związane z siecią i zainstaluj. Jednak powodzenia.
Vinodhini Ramasamy
Właśnie wypróbowałem cały przepływ pracy w sieci i nadal nie mam tych plików. Czuję, że to rozwiązanie jest tak blisko. Chciałbym, żeby to było szpilką, ponieważ mam ograniczoną przestrzeń na moim dysku twardym do instalacji komponentów
Robert Snyder
4
W przypadku VS2017 tak Tools → Get Tools and Features... → Individual Components: Windows 10 SDK (10.0.14393.0) and ASP.NET and web development tools . Wydaje się, że to załatwiło sprawę.
John Jones,
6

Dla VS2019

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

Wymieniłem MSBuildToolsVersionz VisualStudioVersion.

vik_78
źródło
W tym dokumencie „ docs.microsoft.com/visualstudio/msbuild/… ” zmień MSBuildToolsVersion z VisualStudioVersion, a następnie zmienię tę właściwość działającą tak, jak to „ $ (MSBuildExtensionsPath32) \ Microsoft \ VisualStudio \ v $ (VisualStudioVersion)
Kim Ki Won
5

Ponieważ w moim folderze VisualStudio znajdują się tylko wersje 12.0, 14.0 i 15.0, edytuję plik projektu i zmieniam ścieżkę odniesienia z wersji 10.0 na 14.0. Następnie projekt buduje się pomyślnie.

Przed:

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

Po:

<UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v14.0\Web\Microsoft.Web.Publishing.Tasks.dll" />
Nóż
źródło
2

Prawidłową odpowiedzią na to jest zwolnienie projektu, o którym mowa, a następnie edytowanie pliku csproj, poszukanie wpisu, w którym odwołują się do ścieżki 10.0, i zmiana go tak, aby wskazywał na 11.0.

emalamisura
źródło
+1 za to. Zrobiłem ten problem, gdy skopiowałem foldery mojego obszaru roboczego z jednego komputera deweloperskiego na inny. Druga maszyna deweloperska miała zainstalowaną wersję 11, a nie wersję 10. W związku z tym folder v10 był pusty.
maplemale
1

Potrzebujesz dwóch rzeczy, aby to zadziałało:

1) Zainstaluj narzędzia Visual Studio Build Tools (nie potrzebujesz całego programu Visual Studio, tylko VS Build Tools) z wybraną opcją „Web Development Tools” na serwerze kompilacji https://www.visualstudio.com/pl/thank -you-download-visual-studio /? sku = BuildTools & rel = 15

2) Upewnij się, że ścieżka do Microsoft.Web.Publishing.Tasks.dll jest poprawna

  <UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(MSBuildToolsVersion)\Web\Microsoft.Web.Publishing.Tasks.dll" />
cezarypiatek
źródło
1

U mnie zaczęło działać po prostu dodając odwołanie do pakietu NuGet MSBuild.Microsoft.VisualStudio.Web.targets v14.0.0.3

Nie ma nawet potrzeby dodawania elementu UsingTask do pliku projektu, o czym wspomniał autor pakietu

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

Wystarczy zainstalować pakiet NuGet. Pakiet automatycznie ustawia właściwość $ (VSToolsPath) tak, aby używała pliku docelowego w folderze narzędzi.

A potem mogłem użyć TransformXml i innych zadań, zdefiniowanych w pakiecie, na przykład do transformacji 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>
Rachunek
źródło
0

Na wszelki wypadek, gdy ktoś używa csproj w stylu zestawu SDK, możesz to osiągnąć bez konieczności instalowania programu Visual Studio na serwerze kompilacji.

  1. Najpierw należy zainstalować pakiet SlowCheetah nuget w swoim projekcie. Po zainstalowaniu w projekcie w stylu zestawu SDK zobaczysz następujące informacje.

    <PackageReference Include="Microsoft.VisualStudio.SlowCheetah" Version="3.2.20">
            <PrivateAssets>all</PrivateAssets>
            <IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
    </PackageReference>
    
  2. Następnie upewnij się, że dodajesz atrybut GeneratePathProperty = "true" (patrz poniżej). Jest to bardzo ważne w następnej części, ponieważ pomoże ci znaleźć ścieżkę, w której pakiet nuget jest przywracany na twoim komputerze. George Dangl wyjaśnia to w swoim artykule tutaj .

    <PackageReference Include="Microsoft.VisualStudio.SlowCheetah" Version="3.2.20" GeneratePathProperty="true">
            <PrivateAssets>all</PrivateAssets>
            <IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
    </PackageReference>
    
  3. Zaimportuj cele SlowCheetah do swojego projektu:

    <Import Project="$(PkgMicrosoft_VisualStudio_SlowCheetah)\build\Microsoft.VisualStudio.SlowCheetah.targets" />
    
  4. Możesz teraz użyć polecenia docelowego (w tym przypadku po opublikowaniu), aby zastosować niektóre przekształcenia niestandardowe. Jeśli zajdzie taka potrzeba, zawsze możesz zakodować na stałe nazwy plików poniżej, zamiast używać zmiennych z poniższego przykładu.

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

Jeśli wcześniej nie korzystałeś ze SlowCheetah , polecam to sprawdzić. Mają rozszerzenie programu Visual Studio, które ułatwi wyświetlanie podglądu plików transformacji.

Eric Chhun
źródło