allowDefinition = Lỗi 'MachineToApplication' khi xuất bản từ VS2010 (nhưng chỉ sau bản dựng trước)


103

Tôi có thể chạy ứng dụng Asp.Net MVC 2 mà không gặp sự cố trên máy tính cục bộ của mình. Chỉ cần chạy / gỡ lỗi.

Nhưng nếu tôi đã xây dựng nó rồi, tôi không thể xuất bản nó! Tôi phải làm sạch dung dịch và xuất bản lại. Tôi biết đây không phải là hệ thống quan trọng, nhưng nó thực sự khó chịu. "One Click Publish" không phải là "Giải pháp sạch và sau đó One click xuất bản"

Lỗi chính xác như sau:

Lỗi 11 Đó là một lỗi khi sử dụng một phần được đăng ký là allowDefinition = 'MachineToApplication' vượt quá mức ứng dụng. Lỗi này có thể do thư mục ảo không được định cấu hình làm ứng dụng trong IIS.

Tôi nghi ngờ đó là điều gì đó liên quan đến Web.Config trong thư mục Views, nhưng tại sao chỉ sau khi tôi xây dựng một lần trước đó. Và chỉ cần lưu ý, ứng dụng hoạt động tốt sau khi được xuất bản.


1
Nếu có thêm web.config trong thư mục con, hãy thử xóa nó.
user1154664 5/11/12

Câu trả lời:


76

tôi gặp vấn đề tương tự với các ứng dụng MVC của mình. điều đó thật khó chịu vì tôi vẫn muốn lượt xem của mình được kiểm tra, vì vậy tôi không muốn tắt MvcBuildViews

may mắn thay, tôi đã xem qua một bài đăng cho tôi câu trả lời. giữ MvcBuildViews là đúng , sau đó bạn có thể thêm dòng sau vào bên dưới tệp dự án của mình:

<BaseIntermediateOutputPath>[SomeKnownLocationIHaveAccessTo]</BaseIntermediateOutputPath>

Và làm cho thư mục đó không nằm trong thư mục của dự án của bạn. Làm việc cho tôi. Đó không phải là một giải pháp hoàn hảo, nhưng nó tốt cho thời điểm này. Đảm bảo rằng bạn xóa thư mục gói (nằm bên trong obj \ Debug và / hoặc obj \ Release ) khỏi thư mục dự án của mình, nếu không bạn sẽ tiếp tục gặp lỗi.

FWIW, MS biết về lỗi này ...


1
phil haack có bản cập nhật về vấn đề này, dành cho những người chạy so với 2010 SP1: haacked.com/archive/2011/05/09/…
benpage

3
nb giải pháp mà phil có trên blog đó KHÔNG làm việc cho tôi. giải pháp trên là giải pháp duy nhất của tôi.
benpage

9
Tôi nghĩ rằng việc xóa thư mục obj là một giải pháp đơn giản hơn nhiều và ít phải nhớ / duy trì các thay đổi trong tệp dự án. Có vẻ như đó nên là câu trả lời hàng đầu ở đây. (tính đến giữa năm 2011)
RyanW

FWIW, mục này thực sự thay đổi đường dẫn đầu ra trung gian để xuất bản ( \objđường dẫn), KHÔNG PHẢI MvcBuildViews. Sự khác biệt là nhỏ, nhưng đáng kể.
newmanth

40

Tôi đã xóa mọi thứ khỏi thư mục obj / Debug của mình và nó đã khắc phục được lỗi này. Điều này cho phép tôi rời khỏi

<MvcBuildViews>true</MvcBuildViews>

trong tệp dự án của tôi (có ích với mẫu T4MVC T4).

Chỉnh sửa: Điều này có thể đạt được dễ dàng hơn nhiều bằng cách sử dụng menu "Xây dựng" -> "Giải pháp xây dựng lại" (vì những gì xây dựng lại thực sự làm là xóa thư mục obj / Debug và sau đó xây dựng giải pháp).


26

Tôi đang sử dụng giải pháp thay thế này trên trang MS Connect cho lỗi này. Nó làm sạch tất cả các tệp obj và tạm thời trong dự án của bạn (tất cả các cấu hình) trước khi chạy AspNetCompiler.

Sửa đổi mục tiêu MvcBuildViews trong tệp dự án của bạn để nó phụ thuộc vào các mục tiêu dọn dẹp tệp đóng gói mà Visual Studio đã tạo. Các mục tiêu này được đưa vào các dự án ứng dụng web một cách tự động.

Tất cả các tệp đóng gói sẽ bị xóa mỗi khi mục tiêu MvcBuildViews thực thi.

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

Làm việc cho tôi. Tôi cũng nhận xét mục tiêu sau để hoạt động: <Target Name = "AfterBuild" Condition = "'$ (MvcBuildViews)' == 'true'"> <AspNetCompiler VirtualPath = "temp" PhysicalPath = "$ (ProjectDir)" /> < / Target>
kaptan

Cập nhật - Bản cập nhật công cụ MVC 3 sẽ sửa lỗi này. haacked.com/archive/2011/05/09/…
jrummell

3
Có ... thêm rmdir /S /Q "$(ProjectDir)\obj"vào phần xây dựng bài theo Microsoft Ticket đã giải quyết được vấn đề!
Leniel Maccaferri

Trong năm 2012, mục tiêu CleanWebsitesPackageTempDir và CleanWebsitesTransformParametersFiles không tồn tại và vẫn gặp lỗi.
Dave

2
@jrummell thú vị, tôi đang gặp lỗi MachineToApplication này khi chế độ xem bản dựng được bật trong dự án mvc4 của tôi, tôi nghĩ rằng nó có liên quan bằng cách nào đó.
Dave

24

Sự cố này xảy ra khi có đầu ra dự án web (web.config được tạo mẫu hoặc tệp xuất bản tạm thời) trong thư mục obj. Trình biên dịch ASP.NET được sử dụng không đủ thông minh để bỏ qua nội dung trong thư mục obj, vì vậy thay vào đó, nó sẽ tạo ra lỗi.

Một cách khắc phục khác là xóa đầu ra xuất bản ngay trước khi gọi <AspNetCompiler>. Mở .csproj của bạn và thay đổi điều này:

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

đến điều này:

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

Điều đó sẽ xóa tất cả các web.configs trong \ obj, cũng như tất cả các thư mục PackageTmp trong \ obj.


CỘNG MỘT tất cả các ủng hộ của tôi. Tôi có một số mảnh vụn trong objthư mục.
ta.speot.is

Người chỉnh sửa phàn nàn rằng các phần tử bên trong <ItemGroup>không hợp lệ, nhưng hãy bỏ qua điều đó - nó vẫn hoạt động.
Kjell Rilbe

Làm việc rất lớn và tiết kiệm cho tôi từ đau đầu xóa các thư mục obj mỗi khi tôi muốn chuyển sang cấu hình của tôi từ debug để phát hành
Todd Skelton

4

Nếu bạn đang sử dụng Web Publish, bạn có thể đặt MvcBuildViews=falsePrecompileBeforePublish=truebiên dịch trước sau bản sao vào thư mục tạm thời (ngay trước khi xuất bản / gói).

LƯU Ý: PrecompileBeforePublishchỉ được hỗ trợ bởi ngăn xếp Đường ống xuất bản web "mới" (VS2010 SP1 + Azure SDK hoặc VS2012 RTM). Nếu bạn đang sử dụng VS2010 RTM, bạn sẽ cần sử dụng một trong các phương pháp thay thế.


Tôi không thấy giải pháp này xây dựng các quan điểm. Tôi đã cố tình đặt một lỗi trong chế độ xem của mình và đặt PrecompileBeforePublish = True và nó không gây lỗi khi xây dựng. (Tôi đang sử dụng VS2012)
Hullah

Điều này đã giải quyết nó cho tôi khi làm việc trong một bản dựng VSO nơi tôi đang cố gắng biên dịch trước với / p: PrecompileBeforePublish = true
Stephen McDowell

3

Về giải pháp của jrummell, cài đặt:

DependsOnTargets="CleanWebsitesPackage;CleanWebsitesPackageTempDir;CleanWebsitesTransformParametersFiles;"

hoạt động trong VS 2010 , nhưng không hoạt động trong VS 2012 . Trong năm 2012, bạn phải đặt:

DependsOnTargets="CleanWebsitesPackage;CleanWebsitesWPPAllFilesInSingleFolder;CleanWebPublishPipelineIntermediateOutput"

Nguồn:

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

Tôi biết điều này đã được trả lời nhưng tôi chỉ muốn thêm một cái gì đó thú vị mà tôi tìm thấy.

Tôi đã đặt "MvcBuildViews" thành false trong dự án, xóa tất cả các thư mục bin và obj và tôi vẫn gặp lỗi. Tôi thấy rằng có một tệp ".csproj.user" vẫn có "MvcBuildViews" được đặt thành true.

Tôi đã xóa tệp ".csproj.user" và sau đó tất cả đều hoạt động.

Vì vậy, hãy đảm bảo nếu bạn đang thay đổi tệp csproj của mình thì bạn cũng thay đổi hoặc xóa tệp ".csproj.user".


1

Tôi cũng gặp sự cố này, vì vậy tôi đã tạo Sự kiện tạo trước trong thuộc tính dự án để Làm sạch các thư mục đầu ra ( ${projectPath}\bin,${projectPath}\obj\${ConfigurationName}). Trên một dự án khác, tôi cũng gặp lỗi này, ngay cả khi đã có sự kiện dọn dẹp. Trong dự án thứ hai, tôi đang biên dịch các dạng xem được liệt kê trong tệp dự án:

<MvcBuildViews>true</MvcBuildViews>

Tôi đã đổi true thành false và nó không còn phàn nàn về lỗi đó nữa mà vẫn chạy chính xác. Tôi sẽ không tuyên bố rằng tôi biết chính xác điều gì đã gây ra lỗi thứ hai, nhưng ít nhất nó đã giúp tôi tiến lên trong thời điểm hiện tại.


1
Cảm ơn vì điều đó, nhưng tôi thực sự không thể đánh dấu MvcBuildViews là Sai vì nó giúp khắc phục sự cố trước khi tôi triển khai.
Dan

0

Vấn đề liên quan đến các tệp trung gian, nhưng có một giải pháp khác bao gồm việc dọn dẹp các tệp trung gian đó trước khi tạo chế độ xem.

Giải pháp này đã được đưa vào một số phiên bản của VS, nhưng tôi chỉ có thể nói rằng tôi đã gặp sự cố trong VS 2013 Update 5. (Xem phần "Lưu ý" bên dưới, nó có thể được khắc phục trong phiên bản này, nhưng không hoạt động chỉ trong trường hợp cụ thể của tôi trường hợp phi tiêu chuẩn).

Tôi đã mượn lời giải thích từ Error: allowDefinition = 'MachineToApplication' vượt quá mức ứng dụng trên Visual Studio Connect.

Giải pháp bao gồm việc đưa các dòng này vào dự án ứng dụng web ( .csprojtệp) để xử lý việc xóa các tệp trung gian bị bỏ sót:

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

Lưu ý: vì một số lý do, có thể là do tôi tự đưa nó vào dự án "BuildViews", thay vì đặt tên cho mục tiêu xây dựng của tôi để xây dựng các khung nhìn , vì "MvcBuildViews"vậy tôi phải sửa đổi BeforeTargetsthuộc tính cho phù hợp. Tôi cũng đã đơn giản hóa mục tiêu, bằng cách loại bỏ PropertyGroupvà đơn giản hóa điều kiện, như sau:

  <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

Trong trường hợp của tôi, tôi thấy rằng khi tôi có MvcBuildViews và PrecompileDuringPublish đều đúng - đó là nguyên nhân gây ra sự cố này.

Vì vậy, tôi đã gỡ bỏ PrecompileDuringPublish và giải pháp đó phù hợp với tôi và tôi đã không gặp phải vấn đề này kể từ đó.

nhập mô tả hình ảnh ở đây

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.