allowDefinition = ข้อผิดพลาด 'MachineToApplication' เมื่อเผยแพร่จาก VS2010 (แต่หลังจากสร้างก่อนหน้านี้เท่านั้น)


103

ฉันสามารถเรียกใช้แอปพลิเคชัน Asp.Net MVC 2 ได้โดยไม่มีปัญหากับคอมพิวเตอร์ในระบบของฉัน เพียงแค่เรียกใช้ / แก้ไขข้อบกพร่อง

แต่ถ้าสร้างไปแล้วจะเผยแพร่ไม่ได้! ฉันต้องทำความสะอาดโซลูชันและเผยแพร่อีกครั้ง ฉันรู้ว่านี่ไม่สำคัญกับระบบ แต่มันน่ารำคาญจริงๆ "One Click Publish" ไม่ใช่ "Clean solution แล้วคลิกเดียวเผยแพร่"

ข้อผิดพลาดที่แน่นอนมีดังนี้:

ข้อผิดพลาด 11 เป็นข้อผิดพลาดในการใช้ส่วนที่ลงทะเบียนเป็น allowDefinition = 'MachineToApplication' เกินระดับแอปพลิเคชัน ข้อผิดพลาดนี้อาจเกิดจากไดเร็กทอรีเสมือนไม่ได้รับการกำหนดค่าเป็นแอปพลิเคชันใน IIS

ฉันสงสัยว่ามันเกี่ยวข้องกับเว็บ Config ในโฟลเดอร์ Views แต่ทำไมหลังจากที่ฉันสร้างก่อนหน้านี้เพียงครั้งเดียว และโปรดทราบว่าแอปทำงานได้ดีเมื่อเผยแพร่แล้ว


1
หากมี web.config เพิ่มเติมในไดเร็กทอรีลูกให้ลองลบออก
user1154664

คำตอบ:


76

ฉันมีปัญหาเดียวกันกับแอพ MVC ของฉัน มันน่าหงุดหงิดเพราะฉันยังคงต้องการให้มีการตรวจสอบมุมมองของฉันดังนั้นฉันจึงไม่ต้องการปิด MvcBuildViews

โชคดีที่ฉันเจอโพสต์ที่ให้คำตอบแก่ฉัน ทำให้ MvcBuildViews เป็นจริงจากนั้นคุณสามารถเพิ่มบรรทัดต่อไปนี้ด้านล่างในไฟล์โครงการของคุณ:

<BaseIntermediateOutputPath>[SomeKnownLocationIHaveAccessTo]</BaseIntermediateOutputPath>

และทำให้โฟลเดอร์นั้นไม่อยู่ในโฟลเดอร์ของโครงการของคุณ เหมาะสำหรับฉัน ไม่ใช่วิธีแก้ปัญหาที่สมบูรณ์แบบ แต่เป็นวิธีที่ดีสำหรับช่วงเวลานี้ ตรวจสอบให้แน่ใจว่าคุณลบโฟลเดอร์แพ็คเกจ (อยู่ภายในobj \ Debugและ / หรือobj \ Release ) ออกจากโฟลเดอร์โปรเจ็กต์ของคุณมิฉะนั้นคุณจะได้รับข้อผิดพลาด

FWIW, MS ทราบเกี่ยวกับข้อผิดพลาดนี้ ...


1
phil haack มีการอัปเดตเกี่ยวกับปัญหานี้สำหรับผู้ที่ทำงานกับ 2010 SP1: haacked.com/archive/2011/05/09/…
benpage

3
nb วิธีแก้ปัญหาที่ phil มีในบล็อกนั้นไม่ได้ผลสำหรับฉัน วิธีแก้ปัญหาข้างต้นเป็นทางออกเดียวของฉัน
benpage

9
ฉันคิดว่าการลบโฟลเดอร์ obj เป็นวิธีแก้ปัญหาที่ง่ายกว่ามากและไม่ค่อยจำ / ดูแลเกี่ยวกับการเปลี่ยนแปลงในไฟล์โครงการ ดูเหมือนว่าน่าจะเป็นคำตอบอันดับต้น ๆ (ณ กลางปี ​​2554)
RyanW

FWIW รายการนี้เปลี่ยนเส้นทางเอาต์พุตกลางสำหรับการเผยแพร่ ( \objเส้นทาง) ไม่ใช่ MvcBuildViews ความแตกต่างนั้นละเอียดอ่อน แต่มีนัยสำคัญ
newmanth

40

ฉันลบทุกอย่างออกจากโฟลเดอร์ obj / Debug และแก้ไขข้อผิดพลาดนี้ สิ่งนี้ทำให้ฉันออกจากไฟล์

<MvcBuildViews>true</MvcBuildViews>

ตัวเลือกในไฟล์โครงการของฉัน (ซึ่งมาพร้อมกับเทมเพลต T4MVC T4)

แก้ไข: สิ่งนี้สามารถทำได้ง่ายขึ้นมากเพียงแค่ใช้เมนู "สร้าง" -> "สร้างโซลูชันใหม่" (เนื่องจากสิ่งที่สร้างใหม่ทำได้จริงคือล้างโฟลเดอร์ obj / Debug จากนั้นสร้างโซลูชัน)


26

ฉันกำลังใช้วิธีแก้ปัญหานี้ในหน้าMS Connectสำหรับข้อผิดพลาดนี้ จะล้างไฟล์ obj และ temp ทั้งหมดภายใต้โครงการของคุณ (การกำหนดค่าทั้งหมด) ก่อนที่จะเรียกใช้ AspNetCompiler

ปรับเปลี่ยนเป้าหมาย MvcBuildViews ในไฟล์โครงการของคุณเพื่อให้ขึ้นอยู่กับเป้าหมายที่ล้างไฟล์แพ็กเกจที่ Visual Studio สร้างขึ้น เป้าหมายเหล่านี้รวมอยู่ในโครงการเว็บแอปพลิเคชันโดยอัตโนมัติ

ไฟล์บรรจุภัณฑ์ทั้งหมดจะถูกลบทุกครั้งที่ MvcBuildViews เป้าหมายดำเนินการ

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

เหมาะสำหรับฉัน ฉันยังแสดงความคิดเห็นว่าเป้าหมายต่อไปนี้ใช้งานได้: <Target Name = "AfterBuild" Condition = "'$ (MvcBuildViews)' == 'true'"> <AspNetCompiler VirtualPath = "temp" PhysicalPath = "$ (ProjectDir)" /> < / Target>
kaptan

อัปเดต - การอัปเดตเครื่องมือ MVC 3 ควรแก้ไขปัญหานี้ haacked.com/archive/2011/05/09/…
jrummell

3
ใช่ ... การเพิ่มrmdir /S /Q "$(ProjectDir)\obj"ในส่วนการสร้างโพสต์ตาม Microsoft Ticket ช่วยแก้ปัญหาได้!
Leniel Maccaferri

ในปี 2012 CleanWebsitesPackageTempDir และ CleanWebsitesTransformParametersFiles เป้าหมายไม่มีอยู่และยังคงได้รับข้อผิดพลาด
Dave

2
@jrummell น่าสนใจฉันได้รับข้อผิดพลาด MachineToApplication นี้เมื่อเปิดใช้งานมุมมองการสร้างในโครงการ mvc4 ของฉันคิดว่ามันเกี่ยวข้องกัน
Dave

24

ปัญหานี้เกิดขึ้นเมื่อมีเอาต์พุตโครงการเว็บ (เทมเพลต web.config หรือไฟล์เผยแพร่ชั่วคราว) ในโฟลเดอร์ obj คอมไพเลอร์ ASP.NET ที่ใช้ไม่ฉลาดพอที่จะเพิกเฉยต่อสิ่งต่างๆในโฟลเดอร์ obj ดังนั้นจึงแสดงข้อผิดพลาดแทน

การแก้ไขอีกประการหนึ่งคือการทำให้เอาต์พุตเผยแพร่ก่อนที่จะเรียกใช้ <AspNetCompiler> เปิด. csproj ของคุณและเปลี่ยนแปลงสิ่งนี้:

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

สำหรับสิ่งนี้:

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

ซึ่งจะลบ web.configs ทั้งหมดภายใต้ \ obj รวมถึงโฟลเดอร์ PackageTmp ทั้งหมดภายใต้ \ obj


บวกหนึ่งคะแนนโหวตทั้งหมดของฉัน ฉันมีเศษขยะอยู่ในobjโฟลเดอร์
ta.speot.is

ผู้แก้ไขบ่นว่าองค์ประกอบภายใน<ItemGroup>ไม่ถูกต้อง แต่ไม่ต้องสนใจสิ่งนั้น - มันก็ใช้ได้อยู่ดี
Kjell Rilbe

ทำงานได้ดีและช่วยให้ฉันไม่ต้องปวดหัวกับการลบโฟลเดอร์ obj ทุกครั้งที่ฉันต้องการเปลี่ยน config จาก debug เป็น release
Todd Skelton

4

หากคุณใช้ Web Publish คุณสามารถตั้งค่าMvcBuildViews=falseและคอมPrecompileBeforePublish=trueไพล์ล่วงหน้าหลังจากคัดลอกไปยังโฟลเดอร์ชั่วคราวได้ (ทันทีก่อนเผยแพร่ / แพ็กเกจ)

หมายเหตุ: PrecompileBeforePublishรองรับเฉพาะสแต็กไปป์ไลน์การเผยแพร่เว็บ "ใหม่" (VS2010 SP1 + Azure SDK หรือ VS2012 RTM) หากคุณใช้ VS2010 RTM คุณจะต้องใช้วิธีการอื่น


ฉันไม่เห็นโซลูชันนี้สร้างมุมมอง ฉันตั้งใจใส่ข้อผิดพลาดในมุมมองของฉันและตั้งค่า PrecompileBeforePublish = True และมันไม่ได้ล้มเหลวในการสร้าง (ฉันใช้ VS2012)
Hullah

สิ่งนี้แก้ไขได้สำหรับฉันที่ทำงานในโครงสร้าง VSO ที่ฉันพยายามคอมไพล์ล่วงหน้าด้วย / p: PrecompileBeforePublish = true
Stephen McDowell

3

เกี่ยวกับการแก้ปัญหาโดย jrummell การตั้งค่า:

DependsOnTargets="CleanWebsitesPackage;CleanWebsitesPackageTempDir;CleanWebsitesTransformParametersFiles;"

มันทำงานใน VS 2010แต่ไม่ได้อยู่ใน VS 2012 ในปี 2555 คุณต้องใส่:

DependsOnTargets="CleanWebsitesPackage;CleanWebsitesWPPAllFilesInSingleFolder;CleanWebPublishPipelineIntermediateOutput"

ที่มา:

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

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


3

ฉันรู้ว่าได้รับคำตอบแล้ว แต่ฉันแค่อยากจะเพิ่มสิ่งที่น่าสนใจที่ฉันพบ

ฉันได้ตั้งค่า "MvcBuildViews" เป็นเท็จในโปรเจ็กต์ลบโฟลเดอร์ bin และ obj ทั้งหมดและฉันยังคงได้รับข้อผิดพลาด ฉันพบว่ามีไฟล์ ".csproj.user" ที่ยังคงตั้งค่า "MvcBuildViews" เป็น true

ฉันลบไฟล์ ".csproj.user" แล้วทุกอย่างก็ใช้งานได้

ดังนั้นตรวจสอบให้แน่ใจว่าคุณกำลังเปลี่ยนไฟล์ csproj ของคุณที่คุณเปลี่ยนหรือลบไฟล์ ".csproj.user" ด้วย


1

ฉันมีปัญหานี้เช่นกันดังนั้นฉันจึงสร้างเหตุการณ์ก่อนสร้างในคุณสมบัติโครงการเพื่อล้างไดเรกทอรีผลลัพธ์ ( ${projectPath}\bin,${projectPath}\obj\${ConfigurationName}) ในโครงการอื่นฉันได้รับข้อผิดพลาดนี้เช่นกันแม้ว่าจะมีกิจกรรมทำความสะอาดอยู่ก็ตาม ในโครงการที่สองฉันกำลังรวบรวมมุมมองตามที่ระบุไว้ในไฟล์โครงการ:

<MvcBuildViews>true</MvcBuildViews>

ฉันเปลี่ยนจริงเป็นเท็จและไม่บ่นเกี่ยวกับข้อผิดพลาดนั้นอีกต่อไป แต่ก็ยังทำงานได้อย่างถูกต้อง ฉันจะไม่อ้างว่าฉันรู้แน่ชัดว่าอะไรเป็นสาเหตุของข้อผิดพลาดที่สอง แต่อย่างน้อยมันก็ทำให้ฉันก้าวไปข้างหน้าได้ในขณะนี้


1
ขอบคุณสำหรับสิ่งนั้น แต่ฉันไม่สามารถทำเครื่องหมาย MvcBuildViews เป็น False ได้เพราะมันช่วยแก้ไขปัญหาก่อนที่ฉันจะปรับใช้
แดน

0

ปัญหาเกี่ยวข้องกับไฟล์ระดับกลาง แต่มีอีกวิธีหนึ่งซึ่งรวมถึงการล้างไฟล์กลางเหล่านั้นก่อนที่จะสร้างมุมมอง

โซลูชันนี้รวมอยู่ใน VS บางเวอร์ชัน แต่ฉันสามารถพูดได้ว่าฉันมีปัญหาใน VS 2013 Update 5 เท่านั้น (ดู"ระวัง"ด้านล่างซึ่งสามารถแก้ไขได้ในเวอร์ชันนี้ แต่ใช้งานไม่ได้เฉพาะในรุ่นของฉันเท่านั้น กรณีที่ไม่ได้มาตรฐาน)

ฉันยืมการแก้ปัญหาจากError: allowDefinition = 'MachineToApplication' เกินระดับแอปพลิเคชันบน Visual Studio Connect

การแก้ปัญหาประกอบด้วยการรวมบรรทัดเหล่านี้ไว้ในโครงการเว็บแอปพลิเคชัน ( .csprojไฟล์) ซึ่งจัดการการลบไฟล์ระดับกลางที่ไม่ได้รับอนุญาต:

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

ระวัง:ด้วยเหตุผลบางประการอาจเป็นเพราะฉันรวมไว้ในโปรเจ็กต์เป้าหมายการสร้างของฉันสำหรับการสร้างมุมมองถูกตั้งชื่อ"BuildViews"แทน"MvcBuildViews"ดังนั้นฉันจึงต้องแก้ไขBeforeTargetsแอตทริบิวต์ตามนั้น ฉันยังทำให้เป้าหมายง่ายขึ้นโดยการลบPropertyGroupและทำให้เงื่อนไขง่ายขึ้นเช่นนี้:

  <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

ในกรณีของฉันฉันเห็นว่าเมื่อฉันมี MvcBuildViews และ PrecompileDuringPublish เป็นจริงทั้งคู่คือสิ่งที่ทำให้เกิดปัญหานี้

ดังนั้นฉันจึงลบ PrecompileDuringPublish และโซลูชันนั้นใช้ได้ผลสำหรับฉันและฉันไม่ประสบปัญหานี้ตั้งแต่นั้นมา

ป้อนคำอธิบายภาพที่นี่

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.