allowDefinition = VS2010'dan yayınlarken 'MachineToApplication' hatası (ancak yalnızca önceki bir derlemeden sonra)


103

Asp.Net MVC 2 uygulamamı yerel bilgisayarımda sorunsuz çalıştırabilirim. Sadece Çalıştır / Hata Ayıkla.

Ama zaten inşa ettiysem, yayınlayamam! Çözümü temizlemem ve tekrar yayınlamam gerekiyor. Bunun sistem açısından kritik olmadığını biliyorum, ama gerçekten can sıkıcı. "Tek Tıkla Yayınlama", "Temiz çözüm ve ardından Tek tıklamayla yayınlama" değildir

Kesin hata aşağıdaki gibidir:

Hata 11 Uygulama seviyesinin ötesinde allowDefinition = 'MachineToApplication' olarak kaydedilmiş bir bölümü kullanmak bir hatadır. Bu hata, sanal bir dizinin IIS'de bir uygulama olarak yapılandırılmamasından kaynaklanabilir.

Bunun Görünümler klasöründeki Web.Config ile bir ilgisi olduğundan şüpheleniyorum, ancak neden daha önce bir kez oluşturduktan sonra. Ve sadece not etmek gerekirse, uygulama yayınlandıktan sonra iyi çalışıyor.


1
Bir alt dizinde fazladan bir web.config varsa, onu kaldırmayı deneyin.
user1154664

Yanıtlar:


76

MVC uygulamalarımda aynı sorunu yaşadım. sinir bozucuydu çünkü görünümlerimin hala kontrol edilmesini istiyordum, bu yüzden MvcBuildViews'ı kapatmak istemedim

Neyse ki bana cevabı veren bir yazı ile karşılaştım. MvcBuildViews doğru olarak kalırsa , proje dosyanızın altına aşağıdaki satırı ekleyebilirsiniz:

<BaseIntermediateOutputPath>[SomeKnownLocationIHaveAccessTo]</BaseIntermediateOutputPath>

Ve bu klasörü projenizin klasöründe yapmayın. Benim için çalışıyor. Mükemmel bir çözüm değil ama şu an için iyi. Paket klasörünü ( obj \ Debug ve / veya obj \ Release klasöründe bulunur) proje klasörünüzden kaldırdığınızdan emin olun, aksi takdirde hatayı almaya devam edersiniz.

FWIW, MS bu hatayı biliyor ...


1
phil haack,
benpage

3
nb phil'in bu blogda sahip olduğu çözüm benim için ÇALIŞMAZ. yukarıdaki çözüm benim tek çözümüm.
benpage

9
Obj klasörünün silinmesinin çok daha basit bir çözüm olduğunu ve proje dosyasındaki değişiklikler hakkında hatırlanması / bakımı daha az yapılması gerektiğini düşünüyorum. Görünüşe göre buradaki en iyi cevap bu olmalı. (2011 ortası itibariyle)
RyanW

FWIW, bu girdi aslında yayımlama için ara çıktı yolunu ( \objyolu) değiştirir, MvcBuildViews DEĞİL. Aradaki fark ince ama önemli.
newmanth

40

Obj / Debug klasörümdeki her şeyi sildim ve bu hatayı düzelttim. Bu beni terk etmeme izin verdi

<MvcBuildViews>true</MvcBuildViews>

proje dosyamdaki seçeneği (T4MVC T4 şablonuyla kullanışlıdır).

Düzenleme: Bu, basitçe "Build" -> "Rebuild Solution" menüsünü kullanarak çok daha kolay yapılabilir (çünkü rebuild aslında obj / Debug klasörünü temizler ve ardından çözüm derler).


26

Bu hata için MS Connect sayfasındaki bu geçici çözümü kullanıyorum . AspNetCompiler'ı çalıştırmadan önce projenizdeki tüm obj ve temp dosyalarını (tüm konfigürasyonlar) temizler.

Proje dosyanızdaki MvcBuildViews hedefini, Visual Studio'nun oluşturduğu paketleme dosyalarını temizleyen hedeflere bağlı olacak şekilde değiştirin. Bu hedefler otomatik olarak web uygulama projelerine dahil edilir.

MvcBuildViews hedefi her yürütüldüğünde tüm paketleme dosyaları silinecektir.

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

Benim için çalışıyor. Çalışmak için aşağıdaki hedefi de yorumladım: <Target Name = "AfterBuild" Condition = "'$ (MvcBuildViews)' == 'true'"> <AspNetCompiler VirtualPath = "temp" PhysicalPath = "$ (ProjectDir)" /> < / Hedef>
kaptan

Güncelleme - MVC 3 Araçları Güncellemesi bunu düzeltmelidir. haacked.com/archive/2011/05/09/…
jrummell

3
Evet ... rmdir /S /Q "$(ProjectDir)\obj"Microsoft Ticket'e göre post build bölümüne eklemek sorunu çözdü!
Leniel Maccaferri

2012'de CleanWebsitesPackageTempDir ve CleanWebsitesTransformParametersFiles hedefi mevcut değil ve hala hatayı alıyor.
Dave

2
@jrummell ilginç, mvc4 projemde derleme görünümleri etkinleştirildiğinde bu MachineToApplication hatasını alıyorum, bunun bir şekilde ilişkili olduğunu düşündüm.
Dave

24

Bu sorun, obj klasöründe web projesi çıktısı (şablonlu web.config veya geçici yayınlama dosyaları) olduğunda oluşur. Kullanılan ASP.NET derleyicisi, obj klasöründeki şeyleri yok sayacak kadar akıllı değildir, bu nedenle bunun yerine hataları atar.

Başka bir düzeltme de <AspNetCompiler> 'ı çağırmadan hemen önce yayınlama çıktısını nuke etmektir. .Csproj dosyanızı açın ve bunu değiştirin:

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

buna:

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

Bu, \ obj altındaki tüm web.configs'leri ve \ obj altındaki tüm PackageTmp klasörlerini siler.


Tüm olumlu oylarım için PLUS ONE. objKlasörde biraz pislik vardı .
ta.speot.is

Editör, içindeki öğelerin <ItemGroup>geçersiz olduğundan şikayet ediyor , ancak bunu görmezden geliyor - yine de çalışıyor.
Kjell Rilbe

Harika çalıştı ve yapılandırmamı hata ayıklamadan yayınlamaya her değiştirmek istediğimde obj klasörünü silme zahmetinden kurtardı
Todd Skelton

4

Web Yayını kullanıyorsanız, ayarlayabilir MvcBuildViews=falsevePrecompileBeforePublish=true , geçici klasöre kopyalamadan sonra (yayınlamadan / paketlemeden hemen önce) hangi ön derlemeyi .

NOT: PrecompileBeforePublishyalnızca "yeni" Web Publishing Pipeline yığını tarafından desteklenir (VS2010 SP1 + Azure SDK veya VS2012 RTM). VS2010 RTM kullanıyorsanız, alternatif yöntemlerden birini kullanmanız gerekir.


Bu çözümün görüşleri oluşturduğunu görmüyorum. Kendi görüşüme bilerek bir hata koydum ve PrecompileBeforePublish = True olarak ayarladım ve derleme başarısız olmadı. (Ben VS2012 kullanıyorum)
Hullah

Bu, / p: PrecompileBeforePublish = true
Stephen McDowell

3

Jrummell'in çözümüyle ilgili olarak, ayar:

DependsOnTargets="CleanWebsitesPackage;CleanWebsitesPackageTempDir;CleanWebsitesTransformParametersFiles;"

O VS 2010 çalışır , ancak değil VS 2012 . 2012'de şunları koymalısınız:

DependsOnTargets="CleanWebsitesPackage;CleanWebsitesWPPAllFilesInSingleFolder;CleanWebPublishPipelineIntermediateOutput"

Kaynak:

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

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


3

Bunun yanıtlandığını biliyorum ama sadece bulduğum ilginç bir şeyi eklemek istedim.

Projede "MvcBuildViews" öğesini false olarak ayarladım, tüm bin ve obj klasörlerini sildim ve hala hatayı alıyordum. Hala "MvcBuildViews" öğesi true olarak ayarlanmış bir ".csproj.user" dosyası olduğunu buldum.

".Csproj.user" dosyasını sildim ve sonra hepsi çalıştı.

Bu nedenle, csproj dosyanızı değiştirirken ".csproj.user" dosyasını da değiştirdiğinizden veya sildiğinizden emin olun.


1

Ben de bu sorunu yaşadım, bu yüzden çıktı dizinlerini temizlemek için proje özelliklerinde bir Pre-Build Event oluşturdum ( ${projectPath}\bin,${projectPath}\obj\${ConfigurationName}). Başka bir projede, temizlik olayında bile bu hatayı alıyordum. İkinci projede, proje dosyasında listelenen görünümleri derliyordum:

<MvcBuildViews>true</MvcBuildViews>

Doğruyu yanlış olarak değiştirdim ve artık bu hatadan şikayet etmedi, ancak yine de doğru şekilde çalıştı. İkinci hataya neyin sebep olduğunu tam olarak bildiğimi iddia etmeyeceğim, ama en azından şimdilik ilerlememi sağladı.


1
Bunun için teşekkürler, ancak dağıtımdan önce sorunları gidermeye yardımcı olduğu için MvcBuildViews gerçekten Yanlış olarak işaretlenemiyor.
Dan

0

Sorunun ara dosyalarla ilgisi var, ancak görünümleri oluşturmadan önce bu ara dosyaları temizlemekten oluşan başka bir çözüm var.

Bu çözüm VS'nin bazı sürümlerinde eklenmiştir, ancak sorunu yalnızca VS 2013 Güncelleme 5'te yaşadığımı söyleyebilirim ( Aşağıdaki "Dikkat" bölümüne bakın, bu sürümde düzeltilebilir, ancak yalnızca benim özelde çalışmıyor standart olmayan durum).

Çözümü , Visual Studio Connect'teki uygulama seviyesinin ötesinde Hata: allowDefinition = 'MachineToApplication' bölümünden ödünç aldım .

Çözüm, bu satırları .csproj, offedning ara dosyaların silinmesini işleyen web uygulaması projesine ( dosya) dahil etmekten oluşur:

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

Dikkat: Bazı nedenlerden dolayı, muhtemelen onu projeye kendim dahil ettiğim için, görünümleri oluşturmak için inşa hedefime "BuildViews"bunun yerine adı verildi "MvcBuildViews", bu yüzden BeforeTargetsniteliği buna göre değiştirmek zorunda kaldım . Ayrıca PropertyGroupkoşulu kaldırarak ve basitleştirerek hedefi basitleştirdim, şöyle:

  <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

Benim durumumda, MvcBuildViews ve PrecompileDuringPublish'e sahip olduğumda her ikisinin de doğru olduğunu gördüm - bu soruna neden olan şeydi.

Bu yüzden PrecompileDuringPublish'i kaldırdım ve bu çözüm benim için çalıştı ve o zamandan beri bu sorunla karşılaşmadım.

görüntü açıklamasını buraya girin

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.