allowDefinition = 'MachineToApplication'VS2010에서 게시 할 때 오류 발생 (이전 빌드 이후에만)


103

로컬 컴퓨터에서 문제없이 Asp.Net MVC 2 애플리케이션을 실행할 수 있습니다. 그냥 실행 / 디버그하십시오.

하지만 이미 구축했다면 게시 할 수 없습니다! 솔루션을 정리하고 다시 게시해야합니다. 나는 이것이 시스템에 중요하지 않다는 것을 알고 있지만 정말 성가신 일입니다. "원 클릭 게시"는 "클린 솔루션 후 원 클릭 게시"가 아닙니다.

정확한 오류는 다음과 같습니다.

Error 11 애플리케이션 수준을 넘어서 allowDefinition = 'MachineToApplication'으로 등록 된 섹션을 사용하면 오류가 발생합니다. 이 오류는 IIS에서 응용 프로그램으로 구성되지 않은 가상 디렉터리로 인해 발생할 수 있습니다.

Views 폴더의 Web.Config와 관련이 있다고 생각하지만 이전에 한 번만 빌드 한 후에야합니다. 참고로 앱이 게시되면 정상적으로 작동합니다.


1
자식 디렉터리에 추가 web.config가있는 경우 제거해보십시오.
user1154664

답변:


76

내 MVC 앱에서 동일한 문제가 발생했습니다. 나는 여전히 내 뷰를 확인하기를 원했기 때문에 실망 스러웠으므로 MvcBuildViews 를 끄고 싶지 않았습니다.

운 좋게도 나는 나에게 대답을 준 게시물 을 발견했습니다 . MvcBuildViews를 true 로 유지 한 다음 프로젝트 파일 아래에 다음 줄을 추가 할 수 있습니다.

<BaseIntermediateOutputPath>[SomeKnownLocationIHaveAccessTo]</BaseIntermediateOutputPath>

그리고 그 폴더를 프로젝트 폴더에 넣지 마십시오. 나를 위해 작동합니다. 완벽한 솔루션은 아니지만 현재로서는 좋습니다. 확실히 당신은 제거 확인 패키지 합니다 (내부에있는 폴더 OBJ \ 디버그 및 / 또는 OBJ \ 릴리스 그렇지 않으면 오류가 계속하겠습니다 프로젝트 폴더에서 폴더).

FWIW, MS는이 오류에 대해 알고 있습니다 ...


1
phil haack은 2010 SP1 대비 실행되는 문제에 대한 업데이트를 제공합니다. haacked.com/archive/2011/05/09/…
benpage

3
nb phil이 그 블로그에있는 솔루션이 저에게 적합하지 않습니다. 위의 해결책은 나의 유일한 해결책입니다.
benpage

9
나는 obj 폴더를 삭제하는 것이 훨씬 더 간단한 해결책이며 프로젝트 파일의 변경 사항을 기억 / 유지하는 것이 적다고 생각합니다. 그게 여기에 최고의 대답이 될 것 같습니다. (2011 년 중반 기준)
RyanW

FWIW,이 항목은 실제로 \objMvcBuildViews가 아닌 게시를위한 중간 출력 경로 ( 경로) 를 변경합니다 . 차이는 미묘하지만 중요합니다.
newmanth

40

내 obj / Debug 폴더에서 모든 것을 삭제했고이 오류를 수정했습니다. 이것은 내가

<MvcBuildViews>true</MvcBuildViews>

내 프로젝트 파일의 옵션 (T4MVC T4 템플릿과 함께 유용함).

편집 : "Build"-> "Rebuild Solution"메뉴를 사용하면 훨씬 쉽게 수행 할 수 있습니다 (실제로 rebuild가 수행하는 작업은 obj / Debug 폴더를 지운 다음 솔루션을 빌드하기 때문입니다).


26

이 오류 에 대해 MS Connect 페이지 에서이 해결 방법을 사용하고 있습니다. AspNetCompiler를 실행하기 전에 프로젝트 (모든 구성)의 모든 obj 및 temp 파일을 정리합니다.

Visual Studio에서 만든 패키징 파일을 정리하는 대상에 따라 달라 지도록 프로젝트 파일에서 MvcBuildViews 대상을 수정합니다. 이러한 대상은 웹 애플리케이션 프로젝트에 자동으로 포함됩니다.

모든 패키징 파일은 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 2011-06-01

업데이트-MVC 3 도구 업데이트로이 문제를 해결할 수 있습니다. haacked.com/archive/2011/05/09/…
jrummell

3
예 ... rmdir /S /Q "$(ProjectDir)\obj"Microsoft 티켓에 따라 빌드 후 섹션에 추가 하면 문제가 해결되었습니다!
Leniel Maccaferri

2012 년에는 대상 CleanWebsitesPackageTempDir 및 CleanWebsitesTransformParametersFiles가 존재하지 않고 여전히 오류가 발생합니다.
Dave

2
@jrummell 흥미 롭습니다. 내 mvc4 프로젝트에서 빌드 뷰를 사용할 때이 MachineToApplication 오류가 발생합니다.
Dave

24

이 문제는 obj 폴더에 웹 프로젝트 출력 (템플릿 web.config 또는 임시 게시 파일)이있을 때 발생합니다. 사용 된 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>

그러면 \ obj 아래의 모든 web.config와 \ obj 아래의 모든 PackageTmp 폴더가 삭제됩니다.


PLUS ONE 내 모든 업 보트. obj폴더에 찌꺼기가 있었어요 .
ta.speot.is

편집자 <ItemGroup>는 내부의 요소 가 유효하지 않다고 불평 하지만 무시합니다. 어쨌든 작동합니다.
의 Kjell Rilbe

큰 일 나는 릴리스로 디버그에서 내 설정을 전환 할 때마다 폴더 OBJ를 삭제하는 두통에서 저를 저장
토드 스켈 톤

4

당신이 웹 게시를 사용하는 경우, 당신은 설정할 수 있습니다 MvcBuildViews=falsePrecompileBeforePublish=true 하는 경우 임시 폴더에 복사 한 후 (게시 / 패키지 직전에) 미리 컴파일되는 .

참고 : PrecompileBeforePublish"새로운"웹 게시 파이프 라인 스택 (VS2010 SP1 + Azure SDK 또는 VS2012 RTM)에서만 지원됩니다. VS2010 RTM을 사용하는 경우 대체 방법 중 하나를 사용해야합니다.


이 솔루션이 뷰를 구축하는 것을 보지 못했습니다. 일부러 내 뷰에 오류를 넣고 PrecompileBeforePublish = True를 설정했는데 빌드가 실패하지 않았습니다. (저는 VS2012를 사용하고 있습니다)
Hullah 2013 년

이것은 내가 / p : PrecompileBeforePublish = true로 프리 컴파일을 시도했던 VSO 빌드에서 작업하는 것을 위해 그것을 해결했습니다.
Stephen McDowell

3

jrummell의 솔루션과 관련하여 설정 :

DependsOnTargets="CleanWebsitesPackage;CleanWebsitesPackageTempDir;CleanWebsitesTransformParametersFiles;"

그것은 VS 2010에서 작동 하지만, 하지 VS에서 2012 년 . 2012 년에는 다음을 입력해야합니다.

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"를 false로 설정하고 모든 bin 및 obj 폴더를 삭제했는데 여전히 오류가 발생했습니다. 여전히 "MvcBuildViews"가 true로 설정된 ".csproj.user"파일이 있음을 발견했습니다.

".csproj.user"파일을 삭제 한 다음 모두 작동했습니다.

따라서 csproj 파일을 변경하는 경우 ".csproj.user"파일도 변경하거나 삭제해야합니다.


1

이 문제도 발생했기 때문에 프로젝트 속성에 사전 빌드 이벤트를 만들어 출력 디렉터리 ( ${projectPath}\bin,${projectPath}\obj\${ConfigurationName}) 를 정리했습니다 . 다른 프로젝트에서도 청소 이벤트가있는 경우에도이 오류가 발생했습니다. 두 번째 프로젝트에서는 프로젝트 파일에 나열된대로 뷰를 컴파일했습니다.

<MvcBuildViews>true</MvcBuildViews>

나는 참을 거짓으로 바꾸었고 더 이상 그 오류에 대해 불평하지 않았지만 여전히 올바르게 실행되었습니다. 두 번째 오류의 원인을 정확히 알고 있다고 주장하지는 않지만 적어도 당분간은 앞으로 나아갈 수있었습니다.


1
감사합니다.하지만 배포하기 전에 문제를 해결하는 데 도움이되므로 MvcBuildViews를 False로 표시 할 수 없습니다.
Dan

0

문제는 중간 파일과 관련이 있지만 뷰를 구축하기 전에 중간 파일을 정리하는 또 다른 솔루션이 있습니다.

이 솔루션은 일부 VS 버전에 포함되어 있지만 VS 2013 업데이트 5에서 문제가 있었다고 만 말할 수 있습니다 ( "주의" 참조). 이 버전에서는 수정할 수 있지만 내 특정 버전에서만 작동하지는 않습니다. 비표준 사례).

Visual Studio Connect의 응용 프로그램 수준을 넘어서 오류 : allowDefinition = 'MachineToApplication' 에서 해결책을 빌 렸습니다 .

솔루션은 .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.