allowDefinition = kesalahan 'MachineToApplication' saat menerbitkan dari VS2010 (tetapi hanya setelah versi sebelumnya)

103

Saya dapat menjalankan aplikasi Asp.Net MVC 2 saya tanpa masalah di komputer lokal saya. Jalankan / Debug saja.

Tetapi jika saya sudah membuatnya, saya tidak dapat menerbitkannya! Saya harus membersihkan solusinya dan menerbitkannya lagi. Saya tahu ini bukan sistem kritis, tetapi sangat mengganggu. "One Click Publish" bukanlah "Solusi bersih dan kemudian One click publish"

Kesalahan tepatnya adalah sebagai berikut:

Kesalahan 11 Merupakan kesalahan untuk menggunakan bagian yang terdaftar sebagai allowDefinition = 'MachineToApplication' di luar level aplikasi. Kesalahan ini dapat disebabkan oleh direktori virtual yang tidak dikonfigurasi sebagai aplikasi di IIS.

Saya menduga itu ada hubungannya dengan Web.Config di folder Views, tapi mengapa hanya setelah saya membangun sekali sebelumnya. Dan sebagai catatan, aplikasi berfungsi dengan baik setelah dipublikasikan.

Dan
sumber
1
Jika ada web.config tambahan di direktori anak, coba hapus.
pengguna1154664

Jawaban:

76

saya memiliki masalah yang sama dengan aplikasi MVC saya. itu membuat frustrasi karena saya masih ingin pandangan saya diperiksa, jadi saya tidak ingin mematikan MvcBuildViews

untungnya saya menemukan posting yang memberi saya jawabannya. pertahankan MvcBuildViews sebagai true , lalu Anda dapat menambahkan baris berikut di bawahnya dalam file project Anda:

<BaseIntermediateOutputPath>[SomeKnownLocationIHaveAccessTo]</BaseIntermediateOutputPath>

Dan buat folder itu bukan di folder proyek Anda. Bekerja untuk saya. Ini bukan solusi sempurna, tapi bagus untuk saat ini. Pastikan Anda menghapus folder paket (terletak di dalam folder obj \ Debug dan / atau obj \ Release ) dari folder proyek Anda jika tidak, Anda akan terus mendapatkan kesalahan.

FWIW, MS tahu tentang kesalahan ini ...

benpage
sumber
1
phil haack memiliki pembaruan tentang masalah ini, untuk mereka yang menjalankan vs 2010 SP1: haacked.com/archive/2011/05/09/…
benpage
3
nb solusi yang dimiliki phil di blog itu TIDAK berhasil untuk saya. solusi di atas adalah satu-satunya solusi saya.
benpage
9
Saya pikir menghapus folder obj adalah solusi yang jauh lebih sederhana dan kurang untuk diingat / dipertahankan tentang perubahan dalam file proyek. Sepertinya itulah jawaban teratas di sini. (mulai pertengahan 2011)
RyanW
FWIW, entri ini sebenarnya mengubah jalur keluaran perantara untuk penerbitan ( \objjalur), BUKAN MvcBuildViews. Perbedaannya tidak kentara, tetapi signifikan.
newmanth
40

Saya menghapus semuanya dari folder obj / Debug saya dan itu memperbaiki kesalahan ini. Ini memungkinkan saya untuk pergi dalam

<MvcBuildViews>true</MvcBuildViews>

opsi di file proyek saya (yang berguna dengan template T4MVC T4).

Sunting: Hal ini dapat dicapai dengan lebih mudah hanya dengan menggunakan menu "Build" -> "Rebuild Solution" (karena apa yang sebenarnya dilakukan rekondisi adalah menghapus folder obj / Debug dan kemudian membangun solusi).

jimmay5469
sumber
26

Saya menggunakan solusi ini di halaman MS Connect untuk kesalahan ini. Ini membersihkan semua file obj dan temp di bawah proyek Anda (semua konfigurasi) sebelum menjalankan AspNetCompiler.

Ubah target MvcBuildViews di file proyek Anda sehingga bergantung pada target yang membersihkan file kemasan yang telah dibuat oleh Visual Studio. Target ini dimasukkan dalam proyek aplikasi web secara otomatis.

Semua file kemasan akan dihapus setiap kali target MvcBuildViews dijalankan.

<Target Name="MvcBuildViews" AfterTargets="AfterBuild" Condition="'$(MvcBuildViews)'=='true'" DependsOnTargets="CleanWebsitesPackage;CleanWebsitesPackageTempDir;CleanWebsitesTransformParametersFiles;">
    <AspNetCompiler VirtualPath="temp" PhysicalPath="$(MSBuildProjectDirectory)" />
</Target>
jrummell
sumber
Bekerja untuk saya. Saya juga mengomentari target berikut untuk bekerja: <Target Name = "AfterBuild" Condition = "'$ (MvcBuildViews)' == 'true'"> <AspNetCompiler VirtualPath = "temp" PhysicalPath = "$ (ProjectDir)" /> < / Target>
kaptan
Pembaruan - Pembaruan Alat MVC 3 harus memperbaiki ini. haacked.com/archive/2011/05/09/...
jrummell
3
Ya ... menambahkan rmdir /S /Q "$(ProjectDir)\obj"ke bagian post build sesuai Microsoft Ticket memecahkan masalah!
Leniel Maccaferri
Pada tahun 2012, target CleanWebsitesPackageTempDir dan CleanWebsitesTransformParametersFiles tidak ada, dan masih mendapatkan kesalahan.
Dave
2
@jrummell menarik, Saya mendapatkan kesalahan MachineToApplication ini ketika tampilan build diaktifkan di proyek mvc4 saya, saya pikir itu terkait.
Dave
24

Masalah ini terjadi ketika ada keluaran proyek web (web.config template atau mempublikasikan file sementara) di folder obj. Kompiler ASP.NET yang digunakan tidak cukup pintar untuk mengabaikan hal-hal di folder obj, jadi malah melempar kesalahan.

Perbaikan lainnya adalah dengan mengeluarkan keluaran publikasi tepat sebelum memanggil <AspNetCompiler>. Buka .csproj Anda dan ubah ini:

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

untuk ini:

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

Itu akan menghapus semua web.configs di bawah \ obj, serta semua folder PackageTmp di bawah \ obj.

Chris Hynes
sumber
PLUS SATU semua suara positif saya. Saya memiliki beberapa detritus di objfolder.
ta.speot. Adalah
Editor mengeluh bahwa elemen di dalam <ItemGroup>tidak valid, tetapi abaikan itu - tetap berfungsi.
Kjell Rilbe
Bekerja dengan baik dan menyelamatkan saya dari sakit kepala karena menghapus folder obj setiap kali saya ingin mengalihkan konfigurasi saya dari debug ke rilis
Todd Skelton
4

Jika Anda menggunakan Penerbitan Web, Anda dapat mengatur MvcBuildViews=falsedan PrecompileBeforePublish=true, yang mengkompilasi sebelumnya setelah salin ke folder sementara (segera sebelum terbitkan / paket).

CATATAN: PrecompileBeforePublishhanya didukung oleh tumpukan Pipa Penerbitan Web "baru" (VS2010 SP1 + Azure SDK atau VS2012 RTM). Jika Anda menggunakan VS2010 RTM, Anda perlu menggunakan salah satu metode alternatif.

Richard Szalay
sumber
Saya tidak melihat solusi ini membangun pandangan. Saya sengaja menempatkan kesalahan dalam tampilan saya dan menyetel PrecompileBeforePublish = True dan itu tidak gagal dalam pembuatan. (Saya menggunakan VS2012)
Hullah
Ini menyelesaikannya untuk saya yang bekerja dalam build VSO di mana saya mencoba untuk melakukan precompile dengan / p: PrecompileBeforePublish = true
Stephen McDowell
3

Mengenai solusi oleh jrummell, pengaturannya:

DependsOnTargets="CleanWebsitesPackage;CleanWebsitesPackageTempDir;CleanWebsitesTransformParametersFiles;"

Ia bekerja di VS 2010 , tetapi tidak di VS 2012 . Pada tahun 2012 Anda harus meletakkan:

DependsOnTargets="CleanWebsitesPackage;CleanWebsitesWPPAllFilesInSingleFolder;CleanWebPublishPipelineIntermediateOutput"

Sumber:

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

VS 2012: C: \ Program Files (x86) \ MSBuild \ Microsoft \ VisualStudio \ v11.0 \ Web \ Microsoft.Web.Publishing.t target

Pawel Gorczynski
sumber
3

Saya tahu ini telah dijawab tetapi saya hanya ingin menambahkan sesuatu yang menarik yang saya temukan.

Saya telah menyetel "MvcBuildViews" ke false dalam proyek, menghapus semua folder bin dan obj dan saya masih mendapatkan kesalahan. Saya menemukan bahwa ada file ".csproj.user" yang masih memiliki "MvcBuildViews" yang disetel ke true.

Saya menghapus file ".csproj.user" dan kemudian semuanya berhasil.

Jadi pastikan jika Anda mengubah file csproj Anda juga mengubah atau menghapus file ".csproj.user".

nootn
sumber
1

Saya mengalami masalah ini juga, jadi saya membuat Acara Pra-Bangun di properti proyek untuk Membersihkan direktori keluaran ( ${projectPath}\bin,${projectPath}\obj\${ConfigurationName}). Pada proyek lain saya juga mendapatkan kesalahan ini, bahkan dengan acara pembersihan di tempat. Pada proyek kedua saya menyusun tampilan seperti yang tercantum dalam file proyek:

<MvcBuildViews>true</MvcBuildViews>

Saya mengubah benar menjadi salah, dan tidak lagi mengeluh tentang kesalahan itu, tetapi masih berjalan dengan benar. Saya tidak akan mengklaim saya tahu persis apa yang menyebabkan kesalahan kedua, tetapi setidaknya itu membuat saya bergerak maju untuk saat ini.

eppdog
sumber
1
Terima kasih untuk itu, tetapi saya tidak dapat benar-benar menandai MvcBuildViews sebagai False karena membantu memperbaiki masalah sebelum saya menerapkan.
Dan
0

Masalahnya berkaitan dengan file perantara, tetapi ada solusi lain yang terdiri dari membersihkan file perantara tersebut sebelum membangun view.

Solusi ini telah disertakan dalam beberapa versi VS, tetapi saya hanya dapat mengatakan bahwa saya memiliki masalah di Pembaruan VS 2013 5. (Lihat "Hati-hati" di bawah, ini bisa diperbaiki dalam versi ini, tetapi tidak hanya berfungsi di versi saya kasus non-standar).

Saya meminjam solusi dari Error: allowDefinition = 'MachineToApplication' melampaui level aplikasi di Visual Studio Connect.

Solusinya terdiri dari memasukkan baris-baris berikut ke proyek aplikasi web ( .csprojfile) yang menangani penghapusan file perantara yang 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>

Hati-hati: untuk beberapa alasan, mungkin karena saya memasukkannya sendiri ke dalam proyek, target pembangunan saya untuk membangun tampilan dinamai "BuildViews", bukan "MvcBuildViews", jadi saya harus memodifikasi BeforeTargetsatribut yang sesuai. Saya juga menyederhanakan target, dengan menghapus PropertyGroupdan menyederhanakan kondisinya, seperti ini:

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

Dalam kasus saya, saya melihat bahwa ketika saya memiliki MvcBuildViews dan PrecompileDuringPublish sebagai keduanya benar - itulah yang menyebabkan masalah ini.

Jadi saya menghapus PrecompileDuringPublish dan solusi itu berhasil untuk saya dan saya tidak menghadapi masalah ini sejak itu.

masukkan deskripsi gambar di sini

MoXplod.dll
sumber