A tarefa TransformXml não pôde ser carregada de Microsoft.Web.Publishing.Tasks.dll

95

Alguém viu esse erro e sabe como consertar?

A tarefa "TransformXml" não pôde ser carregada do assembly C: \ Arquivos de programas (x86) \ MSBuild \ Microsoft \ VisualStudio \ v11.0 \ Web \ Microsoft.Web.Publishing.Tasks.dll.

Não foi possível carregar o arquivo ou assembly 'file: /// C: \ Program Files (x86) \ MSBuild \ Microsoft \ VisualStudio \ v11.0 \ Web \ Microsoft.Web.Publishing.Tasks.dll' ou uma de suas dependências. O sistema não pode encontrar o arquivo especificado.

Confirme se a declaração está correta, se o assembly e todas as suas dependências estão disponíveis e se a tarefa contém uma classe pública que implementa Microsoft.Build.Framework.ITask.

Eu li em outro lugar que o problema é quando você não tem o SQL Server instalado. Mas eu tenho o SQL Express 2012 x64 instalado com SP1. Também estou executando o VS 2013 Professional.

Eu executei essa mesma solução exata no VS 2012 express sem problemas.

allencoded
fonte
1
Este deve ser um pacote nuget. Não gosto dessas referências ocultas dentro do meu projeto.
Jaider
Você deve marcar a resposta de Benjamin Scheibe como a correta. Parece ser a melhor solução
BHuelse

Respostas:

163

As respostas fornecidas por Dai Bok e emalamisura funcionam bem, desde que você use o Visual Studio 2012. Para o VS 2013, isso também falha. Para fazer isso funcionar com todas as versões do Visual Studio, você deve:

  • Abra o arquivo de projeto (.csproj) da falha de carregamento do projeto
  • Procurar por <Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v10.0\Web\Microsoft.Web.Publishing.targets" />
  • Mude para <Import Project="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v$(VisualStudioVersion)\Web\Microsoft.Web.Publishing.targets" />
  • Recarregue o projeto

Isso definirá a versão correta do Visual Studio de forma dinâmica e adequada.

Ben Sch
fonte
2
Gostei da sua solução Benjamin, mas o problema que estava tendo era que a pasta v11 estava faltando, possivelmente porque algumas pessoas usam o vs2010 e ainda não atualizamos para o vs2012
Dai Bok
7
Isso me fez começar no caminho certo, mas a alteração que fiz foi no nó <UsingTask TaskName = "TransformXml" ...>. Meu AssemblyFile estava usando a versão errada. Só precisava mudar a versão aqui. Outra opção seria usar uma macro de versão em vez de definir explicitamente a versão.
Scott
5
$(VisualStudioVersion)está retornando uma versão anterior :(
Jaider
1
Pode ser um parâmetro: stackoverflow.com/questions/20002532/…
Jaider
2
Funciona perfeitamente durante a atualização do VS2015 para o VS2017. Agora posso abrir a solução nos dois IDEs.
Yury Schkatula
29

Para fazer o meu funcionar, apenas copiei minha v10.0pasta e a renomeei para v11.0, e as coisas parecem funcionar bem a partir de então. Essa é a solução rápida por enquanto.

Como essa provavelmente não é a melhor solução e, embora funcione, eu ia tentar instalar o Microsoft Windows SDK para Windows 7 e o .NET Framework 4 Windows SDK para Windows 7 e .NET Framework 4, mas está demorando muito para baixar.

Dai Bok
fonte
1
Não vi a pasta 'Web' na v10.0. Então, copiei da pasta v12.0 para a pasta v11.0.
Sundeep
9

Venho combatendo esse problema em nosso servidor de compilação há vários dias, então resolvi documentar a resolução que encontrei. Primeiro, meu servidor de construção tem as extensões de publicação na web instaladas . Posso usar a tarefa TransformXml para o conteúdo do meu coração dentro de um projeto de aplicativo da web.

Para usá-lo fora de um projeto de aplicativo da web, tentei adicionar o elemento UsingTask ao meu projeto e apontá-lo para o lugar certo usando as propriedades de construção do ms (como Benjamin demonstrou). No entanto, eles não estavam lá no meu servidor de compilação (aqueles com fácil acesso ao sistema de arquivos de seu servidor de compilação provavelmente podem ignorar isso e apenas instalar o pacote relevante no Visual Studio). Eu até fui mais longe a ponto de codificar as versões do Visual Studio, mas sempre deixava esse erro cair sobre mim.

Finalmente desisti, puxei as DLLs do meu 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

Eu os carreguei no controle de origem e adicionei essa pasta ao espaço de trabalho da minha construção (Editar definição de compilação -> Configurações de origem -> Pasta de controle de origem). A partir daí, eu nem preciso fazer referência à pasta - aqui está a aparência de meu UsingTask:

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

Agora posso usar a tarefa TransformXml da forma que desejar em qualquer projeto.

bvoyelr
fonte
9
O pacote MSBuild.Microsoft.VisualStudio.Web.targets tem os destinos necessários para compilar sem o VS instalado. Por exemplo: <UsingTask TaskName = "TransformXml" AssemblyFile = "packages \ MSBuild.Microsoft.VisualStudio.Web.targets.11.0.2.1 \ tools \ VSToolsPath \ Web \ Microsoft.Web.Publishing.Tasks.dll" />. Veja este blog para mais detalhes
moonpatrol
1
Ei @moonpatrol, você deve responder, porque eu prefiro assim - instalando o pacote e depois referenciando-o - solução absolutamente universal :-) Acabei de experimentar e funciona perfeitamente. Obrigado mesmo assim! se você responder, apenas envie um ping e eu votarei.
Tengiz
9

Para corrigir o problema,

  1. Encontre o instalador do Visual Studio em seu computador
  2. Clique ou toque em para iniciar o instalador e selecione Modificar.
  3. Na tela Componentes individuais, selecione Asp.net e ferramentas de desenvolvimento web e, em seguida, selecione Modificar / Instalar.

Isso resolveu o problema, pois cria as dll no caminho mencionado.

Vinodhini Ramasamy
fonte
2
Estou usando o VS2017 e executar esta etapa não cria esses arquivos. Acho que talvez outra coisa que você selecionou (ou em combinação com ASP.net e ferramentas de desenvolvimento web) que o adicionou. Embora não tenha certeza :(
Kris
Eu selecionei apenas isso. Tente selecionar os componentes relacionados à Web e instalar. Boa sorte embora.
Vinodhini Ramasamy
Acabei de experimentar todo o fluxo de trabalho da web e ainda não tenho esses arquivos. Eu sinto que essa solução está muito próxima. Gostaria que pudesse ser apontado, pois tenho espaço limitado no meu HD para instalar componentes
Robert Snyder
4
Para VS2017, eu fiz Tools → Get Tools and Features... → Individual Components: Windows 10 SDK (10.0.14393.0) and ASP.NET and web development tools . Isso parece ter funcionado.
John Jones
5

Como há apenas v12.0, v14.0 e v15.0 na minha pasta VisualStudio, edito meu arquivo de projeto e altero o caminho de referência de v10.0 para v14.0. Então, o projeto é construído com sucesso.

Antes:

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

Depois de:

<UsingTask TaskName="TransformXml" AssemblyFile="$(MSBuildExtensionsPath)\Microsoft\VisualStudio\v14.0\Web\Microsoft.Web.Publishing.Tasks.dll" />
Lâmina
fonte
5

Para VS2019

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

Eu substituí MSBuildToolsVersioncom VisualStudioVersion.

vik_78
fonte
Por este documento " docs.microsoft.com/visualstudio/msbuild/… " altere MSBuildToolsVersion com VisualStudioVersion, então eu altero essa propriedade funcionando bem como este " $ (MSBuildExtensionsPath32) \ Microsoft \ VisualStudio \ v $ (VisualStudioVersion) "
Kim Ki Won
2

A resposta correta para isso é descarregar o projeto em questão e, em seguida, editar o arquivo csproj, procurar uma entrada onde eles estão fazendo referência ao caminho 10.0 e alterá-lo para apontar para 11.0.

emalamisura
fonte
+ 1 para isso. Eu causei esse problema quando copiei minhas pastas de espaço de trabalho de uma máquina de desenvolvimento para outra. A segunda máquina de desenvolvimento tinha a v11 instalada, não a v10. Portanto, a pasta v10 estava vazia.
maplemale,
1

Você precisa de duas coisas para fazer isso funcionar:

1) Instale o Visual Studio Build Tools (você não precisa de todo o Visual Studio, apenas do VS Build Tools) com a opção "Web development build tools" selecionada em seu servidor de compilação https://www.visualstudio.com/pl/thank -you-downloading-visual-studio /? sku = BuildTools & rel = 15

2) Certifique-se de que o caminho para Microsoft.Web.Publishing.Tasks.dll esteja correto

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

Para mim, começou a funcionar apenas adicionando referência ao pacote NuGet MSBuild.Microsoft.VisualStudio.Web.targets v14.0.0.3

Mesmo sem a necessidade de adicionar o elemento UsingTask ao arquivo do projeto, conforme mencionado pelo autor do pacote

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

Basta instalar o pacote NuGet. O pacote define automaticamente a propriedade $ (VSToolsPath) para usar o arquivo de destino na pasta de ferramentas.

E então eu fui capaz de usar TransformXml e outras tarefas, definidas no pacote, por exemplo para transformar 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>
Conta
fonte
0

Caso alguém esteja usando um csproj no estilo SDK, você pode conseguir isso sem precisar instalar o Visual Studio no servidor de compilação.

  1. Primeiro você deve instalar o pacote nuget SlowCheetah em seu projeto. Depois de instalá-lo, você verá o seguinte em seu projeto de estilo SDK.

    <PackageReference Include="Microsoft.VisualStudio.SlowCheetah" Version="3.2.20">
            <PrivateAssets>all</PrivateAssets>
            <IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
    </PackageReference>
    
  2. Em seguida, certifique-se de adicionar o atributo GeneratePathProperty = "true" (veja abaixo). Isso é muito importante para a próxima parte porque o ajudará a identificar o caminho de onde o pacote nuget é restaurado em sua máquina. George Dangl explica isso em seu artigo aqui .

    <PackageReference Include="Microsoft.VisualStudio.SlowCheetah" Version="3.2.20" GeneratePathProperty="true">
            <PrivateAssets>all</PrivateAssets>
            <IncludeAssets>runtime; build; native; contentfiles; analyzers</IncludeAssets>
    </PackageReference>
    
  3. Importe os destinos SlowCheetah para o seu projeto:

    <Import Project="$(PkgMicrosoft_VisualStudio_SlowCheetah)\build\Microsoft.VisualStudio.SlowCheetah.targets" />
    
  4. Agora você pode usar um comando de destino (neste caso, após publicar) para aplicar algumas transformações personalizadas. Se necessário, você sempre pode codificar os nomes de arquivo abaixo em vez de usar as variáveis ​​no exemplo abaixo.

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

Se você nunca usou o SlowCheetah antes, recomendo dar uma olhada. Eles têm uma extensão do Visual Studio que tornará mais fácil para você visualizar os arquivos de transformação.

Eric Chhun
fonte