allowDefinition = Errore "MachineToApplication" durante la pubblicazione da VS2010 (ma solo dopo una build precedente)


103

Posso eseguire la mia applicazione Asp.Net MVC 2 senza problemi sul mio computer locale. Basta eseguire / eseguire il debug.

Ma se l'ho già costruito, non posso pubblicarlo! Devo pulire la soluzione e pubblicarla di nuovo. So che non è fondamentale per il sistema, ma è davvero fastidioso. "Pubblica con un clic" non è "Soluzione pulita, quindi pubblica con un clic"

L'errore esatto è il seguente:

Errore 11 È un errore utilizzare una sezione registrata come allowDefinition = 'MachineToApplication' oltre il livello dell'applicazione. Questo errore può essere causato da una directory virtuale non configurata come applicazione in IIS.

Sospetto che abbia a che fare con Web.Config nella cartella Views, ma perché solo dopo aver compilato una volta in precedenza. E solo per notare, l'app funziona bene una volta pubblicata.


1
Se c'è un web.config extra in una directory figlio, prova a rimuoverlo.
user1154664

Risposte:


76

ho avuto lo stesso problema con le mie app MVC. era frustrante perché volevo ancora che le mie visualizzazioni fossero controllate, quindi non volevo disattivare MvcBuildViews

fortunatamente mi sono imbattuto in un post che mi ha dato la risposta. mantieni MvcBuildViews come true , quindi puoi aggiungere la seguente riga sotto nel tuo file di progetto:

<BaseIntermediateOutputPath>[SomeKnownLocationIHaveAccessTo]</BaseIntermediateOutputPath>

E rendi quella cartella non nella cartella del tuo progetto. Per me va bene. Non è una soluzione perfetta, ma va bene per il momento. Assicurati di rimuovere la cartella del pacchetto (situata all'interno della cartella obj \ Debug e / o obj \ Release ) dalla cartella del progetto altrimenti continuerai a ricevere l'errore.

FWIW, MS sa di questo errore ...


1
phil haack ha un aggiornamento su questo problema, per quelli che girano contro il 2010 SP1: haacked.com/archive/2011/05/09/…
benpage

3
nb la soluzione che Phil ha su quel blog NON funziona per me. la soluzione di cui sopra è la mia unica soluzione.
benpage

9
Penso che l'eliminazione della cartella obj sia una soluzione molto più semplice e meno da ricordare / mantenere sulle modifiche nel file di progetto. Sembra che questa dovrebbe essere la risposta migliore qui. (a partire da metà 2011)
RyanW

FWIW, questa voce modifica effettivamente il percorso di output intermedio per la pubblicazione (il \objpercorso), NON MvcBuildViews. La differenza è sottile, ma significativa.
newmanth

40

Ho cancellato tutto dalla mia cartella obj / Debug e ho risolto questo errore. Questo mi ha permesso di lasciare in

<MvcBuildViews>true</MvcBuildViews>

opzione nel mio file di progetto (che è utile con il modello T4MVC T4).

Modifica: questo può essere ottenuto molto più facilmente utilizzando semplicemente il menu "Build" -> "Rebuild Solution" (perché ciò che in realtà fa ricostruire è cancellare la cartella obj / Debug e quindi creare la soluzione).


26

Sto usando questa soluzione alternativa nella pagina MS Connect per questo errore. Pulisce tutti i file obj e temp nel progetto (tutte le configurazioni) prima di eseguire AspNetCompiler.

Modificare la destinazione MvcBuildViews nel file di progetto in modo che dipenda dalle destinazioni che puliscono i file di packaging creati da Visual Studio. Queste destinazioni vengono incluse automaticamente nei progetti di applicazioni Web.

Tutti i file di packaging verranno eliminati ogni volta che viene eseguita la destinazione MvcBuildViews.

<Target Name="MvcBuildViews" AfterTargets="AfterBuild" Condition="'$(MvcBuildViews)'=='true'" DependsOnTargets="CleanWebsitesPackage;CleanWebsitesPackageTempDir;CleanWebsitesTransformParametersFiles;">
    <AspNetCompiler VirtualPath="temp" PhysicalPath="$(MSBuildProjectDirectory)" />
</Target>

Per me va bene. Ho anche commentato il seguente obiettivo da utilizzare: <Target Name = "AfterBuild" Condition = "'$ (MvcBuildViews)' == 'true'"> <AspNetCompiler VirtualPath = "temp" PhysicalPath = "$ (ProjectDir)" /> < / Target>
kaptan

Aggiornamento: l'aggiornamento degli strumenti MVC 3 dovrebbe risolvere questo problema. haacked.com/archive/2011/05/09/…
jrummell

3
Sì ... l'aggiunta rmdir /S /Q "$(ProjectDir)\obj"alla sezione post build come da Microsoft Ticket ha risolto il problema!
Leniel Maccaferri

Nel 2012, i CleanWebsitesPackageTempDir e CleanWebsitesTransformParametersFiles di destinazione non esistono e continuano a ricevere l'errore.
Dave

2
@jrummell interessante, ricevo questo errore MachineToApplication quando le visualizzazioni di build sono abilitate nel mio progetto mvc4, pensavo fosse in qualche modo correlato.
Dave

24

Questo problema si verifica quando è presente l'output del progetto Web (web.config basato su modelli o file di pubblicazione temporanei) nella cartella obj. Il compilatore ASP.NET utilizzato non è abbastanza intelligente da ignorare le cose nella cartella obj, quindi genera errori.

Un'altra soluzione consiste nell'attaccare l'output di pubblicazione subito prima di chiamare <AspNetCompiler>. Apri il tuo .csproj e cambia questo:

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

a questa:

<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>

Questo cancellerà tutti i web.configs in \ obj, così come tutte le cartelle PackageTmp in \ obj.


PIÙ UNO tutti i miei voti. Avevo dei detriti nella objcartella.
ta.speot.is

L'editor si lamenta del fatto che gli elementi all'interno di <ItemGroup>non sono validi, ma lo ignora: funziona comunque.
Kjell Rilbe

Ha funzionato alla grande e mi salva dal mal di testa di eliminare la cartella obj ogni volta che voglio cambiare la mia configurazione dal debug al rilascio
Todd Skelton

4

Se utilizzi la pubblicazione Web, puoi impostare MvcBuildViews=falsee PrecompileBeforePublish=true, che precompila dopo la copia nella cartella temporanea (immediatamente prima della pubblicazione / pacchetto).

NOTA: PrecompileBeforePublishè supportato solo dal "nuovo" stack della pipeline di pubblicazione Web (VS2010 SP1 + Azure SDK o VS2012 RTM). Se stai usando VS2010 RTM, dovrai usare uno dei metodi alternativi.


Non vedo questa soluzione costruire le visualizzazioni. Ho volutamente messo un errore nella mia vista e impostato PrecompileBeforePublish = True e non ha fallito la compilazione. (Sto usando VS2012)
Hullah

Questo lo ha risolto per me lavorando in una build VSO in cui stavo tentando di precompilare con / p: PrecompileBeforePublish = true
Stephen McDowell

3

Per quanto riguarda la soluzione di jrummell, l'impostazione:

DependsOnTargets="CleanWebsitesPackage;CleanWebsitesPackageTempDir;CleanWebsitesTransformParametersFiles;"

Esso funziona in VS 2010 , ma non è in VS 2012 . Nel 2012 devi mettere:

DependsOnTargets="CleanWebsitesPackage;CleanWebsitesWPPAllFilesInSingleFolder;CleanWebPublishPipelineIntermediateOutput"

Fonte:

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

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


3

So che è stata data una risposta, ma volevo solo aggiungere qualcosa di interessante che ho trovato.

Avevo impostato "MvcBuildViews" su false nel progetto, cancellato tutte le cartelle bin e obj e stavo ancora ricevendo l'errore. Ho scoperto che c'era un file ".csproj.user" che aveva ancora "MvcBuildViews" impostato su true.

Ho cancellato il file ".csproj.user" e poi tutto ha funzionato.

Quindi assicurati di modificare il file csproj di modificare o eliminare anche il file ".csproj.user".


1

Ho avuto anche questo problema, quindi ho creato un evento di pre-compilazione nelle proprietà del progetto per pulire le directory di output ( ${projectPath}\bin,${projectPath}\obj\${ConfigurationName}). Anche su un altro progetto ho ricevuto questo errore, anche con l'evento di pulizia in atto. Nel secondo progetto stavo compilando le viste come elencato nel file di progetto:

<MvcBuildViews>true</MvcBuildViews>

Ho cambiato il vero in falso e non si è più lamentato di quell'errore, ma funzionava ancora correttamente. Non affermerò di sapere esattamente cosa stava causando il secondo errore, ma almeno mi ha fatto andare avanti per il momento.


1
Grazie per questo, ma non posso davvero contrassegnare MvcBuildViews come False in quanto aiuta a risolvere i problemi prima della distribuzione.
Dan

0

Il problema ha a che fare con i file intermedi, ma esiste un'altra soluzione che consiste nel ripulire quei file intermedi prima di compilare le viste.

Questa soluzione è stata inclusa in alcune versioni di VS, ma posso solo dire che ho avuto il problema in VS 2013 Update 5. (Vedi la sezione "Attenzione" di seguito, potrebbe essere risolto in questa versione, ma non funziona solo nel mio particolare caso non standard).

Ho preso in prestito la soluzione da Error: allowDefinition = 'MachineToApplication' oltre il livello dell'applicazione su Visual Studio Connect.

La soluzione consiste nell'includere queste righe al progetto dell'applicazione web ( .csprojfile) che gestisce la cancellazione dei file intermedi in arrivo:

<!--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>

Attenzione: per qualche motivo, probabilmente perché l'ho incluso io stesso nel progetto, il mio obiettivo di compilazione per la creazione delle viste è stato nominato "BuildViews", invece di "MvcBuildViews", quindi ho dovuto modificare l' BeforeTargetsattributo di conseguenza. Ho anche semplificato il target, rimuovendo PropertyGroupe semplificando la condizione, in questo modo:

  <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>

0

Nel mio caso ho visto che quando ho MvcBuildViews e PrecompileDuringPublish entrambi veri - era ciò che stava causando questo problema.

Quindi ho rimosso PrecompileDuringPublish e quella soluzione ha funzionato per me e da allora non ho affrontato questo problema.

inserisci qui la descrizione dell'immagine

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.