La tâche TransformXml n'a pas pu être chargée à partir de Microsoft.Web.Publishing.Tasks.dll

95

Quelqu'un a-t-il vu cette erreur et sait comment y remédier?

La tâche «TransformXml» n'a pas pu être chargée à partir de l'assembly C: \ Program Files (x86) \ MSBuild \ Microsoft \ VisualStudio \ v11.0 \ Web \ Microsoft.Web.Publishing.Tasks.dll.

Impossible de charger le fichier ou l'assembly 'file: /// C: \ Program Files (x86) \ MSBuild \ Microsoft \ VisualStudio \ v11.0 \ Web \ Microsoft.Web.Publishing.Tasks.dll' ou l'une de ses dépendances. Le système ne peut pas trouver le fichier spécifié.

Confirmez que la déclaration est correcte, que l'assembly et toutes ses dépendances sont disponibles et que la tâche contient une classe publique qui implémente Microsoft.Build.Framework.ITask.

J'ai lu ailleurs que le problème vient du fait que SQL Server n'est pas installé. Mais j'ai SQL Express 2012 x64 installé avec SP1. J'utilise également VS 2013 Professional.

J'ai exécuté exactement la même solution dans VS 2012 express sans aucun problème.

tout codé
la source
1
Cela devrait être un paquet nuget. Je n'aime pas ces références cachées à l'intérieur de mon projet.
Jaider
Vous devez marquer la réponse de Benjamin Scheibe comme étant la bonne. Cela semble être la meilleure solution
BHuelse

Réponses:

163

Les réponses fournies par Dai Bok et emalamisura fonctionnent correctement tant que vous utilisez Visual Studio 2012. Pour VS 2013, cela échoue également. Pour que cela fonctionne avec toutes les versions de Visual Studio, vous devez:

  • Ouvrez le fichier de projet (.csproj) du projet dont le chargement échoue
  • Rechercher <Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.targets" />
  • Changez-le en <Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.targets" />
  • Recharger le projet

Cela définira la version correcte de Visual Studio de manière dynamique et correcte.

Ben Sch
la source
2
J'aime votre solution Benjamin, mais le problème que j'avais était que le dossier v11 était manquant, probablement parce que certaines personnes utilisent vs2010 et n'ont pas encore mis à niveau vers vs2012
Dai Bok
7
Cela m'a permis de démarrer sur le bon chemin, mais la modification que j'ai apportée concernait le nœud <UsingTask TaskName = "TransformXml" ...>. Mon AssemblyFile utilisait la mauvaise version. Juste besoin de changer la version ici. Une autre option serait d'utiliser une macro de version au lieu de définir explicitement la version.
Scott
5
$(VisualStudioVersion)renvoie une version antérieure :(
Jaider
1
Cela peut être un paramètre: stackoverflow.com/questions/20002532/…
Jaider
2
Fonctionne parfaitement lors de la mise à niveau de VS2015 à VS2017. Maintenant, je peux ouvrir la solution dans les deux IDE.
Yury Schkatula
29

Pour faire fonctionner le mien, je viens de copier mon v10.0dossier et de le renommer v11.0, et les choses semblent bien fonctionner à partir de là. C'est la solution miracle pour le moment.

Comme ce n'est probablement pas la meilleure solution, et bien que cela fonctionne, j'allais essayer d'installer le SDK Microsoft Windows pour Windows 7 et .NET Framework 4 Windows SDK pour Windows 7 et .NET Framework 4, mais cela prend trop de temps pour Télécharger.

Dai Bok
la source
1
Je n'ai pas vu le dossier «Web» dans la v10.0. Je l'ai donc copié du dossier v12.0 vers le dossier v11.0.
Sundeep
9

Je lutte contre ce problème sur notre serveur de build depuis plusieurs jours, alors j'ai pensé que je documenterais la résolution à laquelle je suis arrivé. Tout d'abord, mon serveur de build a les extensions de publication Web installées . Je peux utiliser la tâche TransformXml au contenu de mon cœur dans un projet d'application Web.

Pour l'utiliser en dehors d'un projet d'application Web, j'ai essayé d'ajouter l'élément UsingTask à mon projet et de le pointer au bon endroit à l'aide des propriétés de construction ms (comme l'a démontré Benjamin). Cependant, ils n'étaient pas là sur mon serveur de build (ceux qui ont un accès facile au système de fichiers de leur serveur de build peuvent probablement ignorer cela et simplement installer le package approprié dans Visual Studio). Je suis même allé jusqu'à des versions de Visual Studio à code dur, mais cela m'a toujours laissé tomber cette erreur.

J'ai finalement abandonné, j'ai retiré les DLL de mon PC local:

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

Je les ai téléchargés sur le contrôle de code source et ajouté ce dossier à l'espace de travail de ma construction (Modifier la définition de construction -> Paramètres de la source -> Dossier de contrôle de la source). À partir de là, je n'ai même pas besoin de référencer le dossier - voici à quoi ressemble mon UsingTask:

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

Maintenant, je peux utiliser la tâche TransformXml à ma guise à partir de n'importe quel projet.

bvoyelr
la source
9
Le package MSBuild.Microsoft.VisualStudio.Web.targets a les cibles nécessaires pour générer sans VS installé. Par exemple: <UsingTask TaskName = "TransformXml" AssemblyFile = "packages \ MSBuild.Microsoft.VisualStudio.Web.targets.11.0.2.1 \ tools \ VSToolsPath \ Web \ Microsoft.Web.Publishing.Tasks.dll" />. Voir ce blog pour plus de détails
moonpatrol
1
Hey @moonpatrol, vous devriez en faire une réponse, parce que je préfère cette façon - installer le paquet puis le renvoyer - solution absolument universelle :-) Je viens de l'essayer et fonctionne parfaitement. Merci quand même! si vous en faites une réponse, envoyez-moi un ping et je voterai.
Tengiz
9

Pour résoudre le problème,

  1. Trouvez le programme d'installation de Visual studio sur votre ordinateur
  2. Cliquez ou appuyez sur pour démarrer le programme d'installation, puis sélectionnez Modifier.
  3. À partir de l'écran des composants individuels, sélectionnez Asp.net et les outils de développement Web, puis sélectionnez Modifier / Installer.

Cela a résolu le problème car il crée les DLL dans le chemin mentionné.

Vinodhini Ramasamy
la source
2
J'utilise VS2017 et cette étape ne crée pas ces fichiers. Je pense que vous avez peut-être sélectionné quelque chose d'autre (ou en combinaison avec ASP.net et des outils de développement Web) qui l'a ajouté. Je ne sais pas quoi cependant :(
Kris
Je n'ai sélectionné que cela. Essayez de sélectionner les composants Web et installez. Bonne chance cependant.
Vinodhini Ramasamy
J'ai juste essayé l'ensemble du flux de travail Web et je n'ai toujours pas ces fichiers. J'ai l'impression que cette solution est si proche. Je souhaite qu'il puisse être épinglé car je dispose d'un espace limité sur mon disque dur pour installer des composants
Robert Snyder
4
Pour VS2017, je l'ai fait Tools → Get Tools and Features... → Individual Components: Windows 10 SDK (10.0.14393.0) and ASP.NET and web development tools . Cela semble avoir fait l'affaire.
John Jones
5

Comme il n'y a que v12.0, v14.0 et v15.0 dans mon dossier VisualStudio, je modifie mon fichier projet et change le chemin de référence de v10.0 à v14.0. Ensuite, le projet se construit avec succès.

Avant:

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

Après:

<UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v14.0\Web\Microsoft.Web.Publishing.Tasks.dll" />
Lame
la source
5

Pour VS2019

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

J'ai remplacé MSBuildToolsVersionpar VisualStudioVersion.

vik_78
la source
Par ce document " docs.microsoft.com/visualstudio/msbuild/… " changez MSBuildToolsVersion avec VisualStudioVersion puis je change cette propriété fonctionnant bien comme ceci " $ (MSBuildExtensionsPath32) \ Microsoft \ VisualStudio \ v $ (VisualStudioVersion) "
Kim Ki a gagné
2

La bonne réponse à cela est de décharger le projet en question, puis de modifier le fichier csproj, de rechercher une entrée dans laquelle ils font référence au chemin 10.0 et de le modifier pour qu'il pointe vers 11.0 à la place.

emalamisura
la source
+ 1 pour ça. J'ai causé ce problème lorsque j'ai copié mes dossiers d'espace de travail d'une machine de développement à une autre. La deuxième machine de développement avait la v11 installée, pas la v10. Ainsi, le dossier v10 était vide.
maplemale
1

Vous avez besoin de deux choses pour que cela fonctionne:

1) Installez Visual Studio Build Tools (vous n'avez pas besoin de l'ensemble de Visual Studio, uniquement des VS Build Tools) avec l'option "Outils de build de développement Web" sélectionnée sur votre serveur de build https://www.visualstudio.com/pl/thank -vous-téléchargement-visual-studio /? sku = BuildTools & rel = 15

2) Assurez-vous que le chemin d'accès à Microsoft.Web.Publishing.Tasks.dll est correct

  <UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath32)\Microsoft\VisualStudio\v$(MSBuildToolsVersion)\Web\Microsoft.Web.Publishing.Tasks.dll" />
cezarypiatek
la source
1

Pour moi, cela a commencé à fonctionner simplement en ajoutant une référence au package NuGet MSBuild.Microsoft.VisualStudio.Web.targets v14.0.0.3

Même pas besoin d'ajouter l'élément UsingTask au fichier projet comme il l'a mentionné par l'auteur du package

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

Installez simplement le package NuGet. Le package définit automatiquement la propriété $ (VSToolsPath) pour utiliser le fichier cibles dans le dossier tools.

Et puis j'ai pu utiliser TransformXml et d'autres tâches, définies dans le package, par exemple pour transformer 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>
Facture
la source
0

Juste au cas où quelqu'un utilise un csproj de style SDK, vous pouvez y parvenir sans avoir à installer Visual Studio sur le serveur de génération.

  1. Vous devez d'abord installer le package nuget SlowCheetah dans votre projet. Une fois que vous l'avez installé, vous verrez ce qui suit dans votre projet de style SDK.

    <PackageReference Include="Microsoft.VisualStudio.SlowCheetah" Version="3.2.20">
            <PrivateAssets>all</PrivateAssets>
            <IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
    </PackageReference>
    
  2. Assurez-vous ensuite d'ajouter l' attribut GeneratePathProperty = "true" (voir ci-dessous). Ceci est très important pour la partie suivante car cela vous aidera à saisir le chemin de l'endroit où le paquet nuget est restauré sur votre machine. George Dangl l'explique dans son article ici .

    <PackageReference Include="Microsoft.VisualStudio.SlowCheetah" Version="3.2.20" GeneratePathProperty="true">
            <PrivateAssets>all</PrivateAssets>
            <IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
    </PackageReference>
    
  3. Importez les cibles SlowCheetah dans votre projet:

    <Import Project="$(PkgMicrosoft_VisualStudio_SlowCheetah)\build\Microsoft.VisualStudio.SlowCheetah.targets" />
    
  4. Vous pouvez maintenant utiliser une commande cible (dans ce cas après la publication) pour appliquer certaines transformations personnalisées. Si vous en avez besoin, vous pouvez toujours coder en dur les noms de fichiers ci-dessous au lieu d'utiliser les variables de l'exemple ci-dessous.

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

Si vous n'avez jamais utilisé SlowCheetah auparavant, je vous recommande de le vérifier. Ils ont une extension Visual Studio qui vous permettra de prévisualiser plus facilement les fichiers de transformation.

Eric Chhun
la source