allowDefinition = erro 'MachineToApplication' ao publicar a partir do VS2010 (mas apenas após uma compilação anterior)

103

Posso executar meu aplicativo Asp.Net MVC 2 sem problemas no meu computador local. Basta executar / depurar.

Mas se eu já construí, não posso publicá-lo! Tenho que limpar a solução e publicá-la novamente. Eu sei que isso não é crítico para o sistema, mas é realmente irritante. "One Click Publish" não é "Clean solution and One Click Publish"

O erro exato é o seguinte:

Erro 11 É um erro usar uma seção registrada como allowDefinition = 'MachineToApplication' além do nível do aplicativo. Esse erro pode ser causado por um diretório virtual não estar configurado como um aplicativo no IIS.

Eu suspeito que seja algo a ver com o Web.Config na pasta Views, mas então por que só depois de construir uma vez anteriormente. E só para notar, o aplicativo funciona bem depois de publicado.

Dan
fonte
1
Se houver um web.config extra em um diretório filho, tente removê-lo.
user1154664

Respostas:

76

Eu tive o mesmo problema com meus aplicativos MVC. era frustrante porque eu ainda queria que minhas visualizações fossem verificadas, então não queria desligar MvcBuildViews

felizmente, encontrei um post que me deu a resposta. mantenha os MvcBuildViews como verdadeiros , então você pode adicionar a seguinte linha abaixo no seu arquivo de projeto:

<BaseIntermediateOutputPath>[SomeKnownLocationIHaveAccessTo]</BaseIntermediateOutputPath>

E faça com que essa pasta não esteja na pasta do seu projeto. Funciona para mim. Não é uma solução perfeita, mas é boa no momento. Certifique-se de remover a pasta do pacote (localizada dentro da pasta obj \ Debug e / ou obj \ Release ) da pasta do projeto, caso contrário, você continuará recebendo o erro.

FWIW, MS sabe sobre este erro ...

Benpage
fonte
1
phil haack tem uma atualização sobre este problema, para aqueles que executam vs 2010 SP1: haacked.com/archive/2011/05/09/…
benpage
3
nb a solução que phil tem nesse blog NÃO funciona para mim. a solução acima é minha única solução.
benpage de
9
Eu acho que a exclusão da pasta obj é uma solução muito mais simples e menos para lembrar / manter sobre as alterações no arquivo de projeto. Parece que essa deve ser a principal resposta aqui. (em meados de 2011)
RyanW
FWIW, esta entrada realmente altera o caminho de saída intermediário para publicação (o \obj caminho), NÃO MvcBuildViews. A diferença é sutil, mas significativa.
newmanth
40

Eu apaguei tudo da minha pasta obj / Debug e ele corrigiu este erro. Isso me permitiu sair no

<MvcBuildViews>true</MvcBuildViews>

opção no meu arquivo de projeto (que é útil com o modelo T4MVC T4).

Editar: Isso pode ser conseguido muito mais facilmente simplesmente usando o menu "Build" -> "Rebuild Solution" (porque o que o rebuild realmente faz é limpar a pasta obj / Debug e então construir a solução).

Jimmay5469
fonte
26

Estou usando essa solução alternativa na página do MS Connect para esse erro. Ele limpa todos os arquivos obj e temporários em seu projeto (todas as configurações) antes de executar o AspNetCompiler.

Modifique o destino MvcBuildViews em seu arquivo de projeto para que dependa dos destinos que limpam os arquivos de empacotamento que o Visual Studio criou. Esses destinos são incluídos em projetos de aplicativos da web automaticamente.

Todos os arquivos de empacotamento serão excluídos sempre que o destino MvcBuildViews for executado.

<Target Name="MvcBuildViews" AfterTargets="AfterBuild" Condition="'$(MvcBuildViews)'=='true'" DependsOnTargets="CleanWebsitesPackage;CleanWebsitesPackageTempDir;CleanWebsitesTransformParametersFiles;">
    <AspNetCompiler VirtualPath="temp" PhysicalPath="$(MSBuildProjectDirectory)" />
</Target>
Jrummell
fonte
Funciona para mim. Também comentei o seguinte objetivo para funcionar: <Target Name = "AfterBuild" Condition = "'$ (MvcBuildViews)' == 'true'"> <AspNetCompiler VirtualPath = "temp" PhysicalPath = "$ (ProjectDir)" /> < / Target>
kaptan 01 de
Atualização - A atualização das ferramentas MVC 3 deve corrigir isso. haacked.com/archive/2011/05/09/…
jrummell
3
Sim ... adicionar rmdir /S /Q "$(ProjectDir)\obj"à seção de pós-compilação de acordo com o Microsoft Ticket resolveu o problema!
Leniel Maccaferri
Em 2012, o destino CleanWebsitesPackageTempDir e CleanWebsitesTransformParametersFiles não existe e ainda obtém o erro.
Dave
2
@jrummell interessante, estou recebendo este erro MachineToApplication quando a construção de visualizações está habilitada no meu projeto mvc4, pensei que estava de alguma forma relacionado.
Dave
24

Esse problema ocorre quando há saída de projeto da Web (web.config de modelo ou arquivos de publicação temporários) na pasta obj. O compilador ASP.NET usado não é inteligente o suficiente para ignorar coisas na pasta obj, então ele lança erros em seu lugar.

Outra correção é limpar a saída de publicação antes de chamar <AspNetCompiler>. Abra seu .csproj e altere isso:

<Target Name="MvcBuildViews" AfterTargets="AfterBuild" Condition="'$(MvcBuildViews)'=='true'">
  <AspNetCompiler VirtualPath="temp" PhysicalPath="$(WebProjectOutputDir)" />
</Target>

para isso:

<Target Name="MvcBuildViews" AfterTargets="AfterBuild" Condition="'$(MvcBuildViews)'=='true'">
  <ItemGroup>
    <ExtraWebConfigs Include="$(BaseIntermediateOutputPath)\**\web.config" />
    <ExtraPackageTmp Include="$([System.IO.Directory]::GetDirectories(&quot;$(BaseIntermediateOutputPath)&quot;, &quot;PackageTmp&quot;, System.IO.SearchOption.AllDirectories))" />
  </ItemGroup>
  <Delete Files="@(ExtraWebConfigs)" />
  <RemoveDir Directories="@(ExtraPackageTmp)" />
  <AspNetCompiler VirtualPath="temp" PhysicalPath="$(WebProjectOutputDir)" />
</Target>

Isso excluirá todos os web.configs em \ obj, bem como todas as pastas PackageTmp em \ obj.

Chris Hynes
fonte
MAIS UM todos os meus votos positivos. Eu tinha alguns detritos na objpasta.
ta.speot.is
O editor reclama que os elementos dentro do <ItemGroup>são inválidos, mas ignore isso - funciona de qualquer maneira.
Kjell Rilbe
Funcionou muito bem e me livra da dor de cabeça de excluir a pasta obj toda vez que eu quero mudar minha configuração de depuração para liberação
Todd Skelton
4

Se estiver usando a Publicação na Web, você pode definir MvcBuildViews=falsee PrecompileBeforePublish=true, que pré-compila após a cópia para a pasta temporária (imediatamente antes de publicar / empacotar).

NOTA: PrecompileBeforePublishsó é compatível com a pilha "nova" do Pipeline de publicação na Web (VS2010 SP1 + SDK do Azure ou VS2012 RTM). Se estiver usando VS2010 RTM, você precisará usar um dos métodos alternativos.

Richard Szalay
fonte
Não vejo essa solução construindo as visualizações. Eu coloquei propositalmente um erro em minha visão e configurei PrecompileBeforePublish = True e não falhou a compilação. (Estou usando o VS2012)
Hullah
Isso resolveu para mim, trabalhando em uma compilação de VSO onde eu estava tentando pré-compilar com / p: PrecompileBeforePublish = true
Stephen McDowell
3

Em relação à solução por jrummell, a configuração:

DependsOnTargets="CleanWebsitesPackage;CleanWebsitesPackageTempDir;CleanWebsitesTransformParametersFiles;"

Ele trabalha em VS 2010 , mas não em VS 2012 . Em 2012 você deve colocar:

DependsOnTargets="CleanWebsitesPackage;CleanWebsitesWPPAllFilesInSingleFolder;CleanWebPublishPipelineIntermediateOutput"

Fonte:

VS 2010: C: \ Arquivos de programas (x86) \ MSBuild \ Microsoft \ VisualStudio \ v10.0 \ Web \ Microsoft.Web.Publishing.targets

VS 2012: C: \ Arquivos de programas (x86) \ MSBuild \ Microsoft \ VisualStudio \ v11.0 \ Web \ Microsoft.Web.Publishing.targets

Pawel Gorczynski
fonte
3

Eu sei que isso foi respondido, mas eu só queria acrescentar algo interessante que achei.

Eu tinha definido o "MvcBuildViews" como falso no projeto, excluído todas as pastas bin e obj e ainda estava recebendo o erro. Descobri que havia um arquivo ".csproj.user" que ainda tinha "MvcBuildViews" definido como verdadeiro.

Excluí o arquivo ".csproj.user" e tudo funcionou.

Portanto, certifique-se de alterar o arquivo csproj, altere ou exclua também o arquivo ".csproj.user".

nootn
fonte
1

Eu também tive esse problema, então criei um evento de pré-construção nas propriedades do projeto para limpar os diretórios de saída ( ${projectPath}\bin,${projectPath}\obj\${ConfigurationName}). Em outro projeto, também estava recebendo esse erro, mesmo com o evento de limpeza no local. No segundo projeto, eu estava compilando as visualizações listadas no arquivo do projeto:

<MvcBuildViews>true</MvcBuildViews>

Mudei de verdadeiro para falso, e ele não reclamava mais daquele erro, mas ainda funcionava corretamente. Não vou alegar que sei exatamente o que estava causando o segundo erro, mas pelo menos me fez seguir em frente por enquanto.

eppdog
fonte
1
Obrigado por isso, mas eu realmente não posso marcar o MvcBuildViews como False, pois ajuda a corrigir problemas antes de implantar.
Dan,
0

O problema tem a ver com os arquivos intermediários, mas existe outra solução que consiste em limpar esses arquivos intermediários antes de construir as visualizações.

Esta solução foi incluída em alguma versão do VS, mas só posso dizer que tive o problema no VS 2013 Atualização 5. (Veja a seção "Cuidado" abaixo, poderia ser corrigido nesta versão, mas não funcionando apenas no meu particular caso não padrão).

Peguei emprestada a solução de Error: allowDefinition = 'MachineToApplication' além do nível do aplicativo no Visual Studio Connect.

A solução consiste em incluir estas linhas no projeto de aplicação web ( .csprojarquivo) que tratam da deleção dos arquivos intermediários offedning:

<!--Deal with http://connect.microsoft.com/VisualStudio/feedback/details/779737/error-allowdefinition-machinetoapplication-beyond-application-level, 
we will need to clean up our temp folder before MVC project starts the pre-compile-->
<PropertyGroup>
    <_EnableCleanOnBuildForMvcViews Condition=" '$(_EnableCleanOnBuildForMvcViews)'=='' ">true</_EnableCleanOnBuildForMvcViews>
</PropertyGroup>
<Target Name="CleanupForBuildMvcViews" Condition=" '$(_EnableCleanOnBuildForMvcViews)'=='true' and '$(MVCBuildViews)'=='true' " BeforeTargets="MvcBuildViews">
    <ItemGroup>
     <_PublishTempFolderNamesToCleanup Include="Database;TransformWebConfig;CSAutoParameterize;InsertAdditionalCS;ProfileTransformWebConfig;Package;AspnetCompileMerge" />
    </ItemGroup>
    <!--Force msbuild to expand all the wildcard characters so to get real file paths-->
    <CreateItem Include="@(_PublishTempFolderNamesToCleanup->'$(BaseIntermediateOutputPath)**\%(identity)\**\*')">
     <Output TaskParameter="Include" ItemName="_EvaluatedPublishTempFolderNamesToCleanup" />
    </CreateItem>
    <Delete Files="@(_EvaluatedPublishTempFolderNamesToCleanup)" />
</Target>

Cuidado: por algum motivo, provavelmente porque eu mesmo o incluí no projeto, meu destino de construção para construir as visualizações foi nomeado "BuildViews", em vez de "MvcBuildViews", então eu tive que modificar o BeforeTargetsatributo de acordo. Também simplifiquei o alvo, removendo o PropertyGroupe simplificando a condição, assim:

  <Target Name="CleanupForBuildMvcViews" Condition="'$(MVCBuildViews)'=='true' " BeforeTargets="BuildViews">
    <ItemGroup>
     <_PublishTempFolderNamesToCleanup Include="Database;TransformWebConfig;CSAutoParameterize;InsertAdditionalCS;ProfileTransformWebConfig;Package;AspnetCompileMerge" />
    </ItemGroup>
    <!--Force msbuild to expand all the wildcard characters so to get real file paths-->
    <CreateItem Include="@(_PublishTempFolderNamesToCleanup->'$(BaseIntermediateOutputPath)**\%(identity)\**\*')">
     <Output TaskParameter="Include" ItemName="_EvaluatedPublishTempFolderNamesToCleanup" />
    </CreateItem>
    <Delete Files="@(_EvaluatedPublishTempFolderNamesToCleanup)" />
  </Target>
JotaBe
fonte
0

No meu caso, vi que quando tenho MvcBuildViews e PrecompileDuringPublish como verdadeiros - era o que estava causando esse problema.

Então eu removi o PrecompileDuringPublish e essa solução funcionou para mim e não enfrentei esse problema desde então.

insira a descrição da imagem aqui

MoXplod
fonte