web-dev-qa-db-ja.com

VS2010から公開するときのallowDefinition = 'MachineToApplication'エラー(ただし、以前のビルド後のみ)

ローカルコンピューターで問題なくAsp.Net MVC 2アプリケーションを実行できます。実行/デバッグするだけです。

しかし、すでにビルドしている場合は、公開できません!ソリューションをクリーンアップして、再度公開する必要があります。これはシステムにとって重要ではないことは知っていますが、本当に面倒です。 「ワンクリック発行」は「クリーンなソリューションとワンクリック発行」ではありません

正確なエラーは次のとおりです。

エラー11アプリケーションレベルを超えてallowDefinition = 'MachineToApplication'として登録されたセクションを使用するとエラーになります。このエラーは、IISでアプリケーションとして設定されていない仮想ディレクトリが原因で発生する可能性があります。

ViewsフォルダのWeb.Configに関係しているのではないかと思いますが、なぜ以前に一度だけビルドしたのでしょうか。そして、注意してください、アプリは公開されると正常に動作します。

103
Dann

mVCアプリでも同じ問題が発生しました。私はまだビューをチェックしたいのでイライラしていましたので、オフにしたくありませんでしたMvcBuildViews

幸いなことに、私は post に出会ったので、答えが得られました。 MvcBuildViewsをtrueのままにしておくと、プロジェクトファイルの下に次の行を追加できます。

<BaseIntermediateOutputPath>[SomeKnownLocationIHaveAccessTo]</BaseIntermediateOutputPath>

そして、そのフォルダーをプロジェクトのフォルダーに入れないでください。私のために働く。これは完璧な解決策ではありませんが、現時点では有効です。 packageフォルダー(obj\Debug内にあることを確認してください。および/またはobj\Releaseフォルダ)をプロジェクトフォルダから取得しないと、エラーが発生し続けます。

FWIW、 MSはこのエラーについて知っています ...

76
benpage

Obj/Debugフォルダーからすべてを削除し、このエラーを修正しました。これにより、私は

<MvcBuildViews>true</MvcBuildViews>

プロジェクトファイルのオプション(T4MVC T4テンプレートに便利です)。

編集:これは、[ビルド]-> [ソリューションの再構築]メニューを使用するだけで簡単に実現できます(実際の再構築はobj/Debugフォルダーをクリアしてからソリューションを構築するためです)。

40
jimmay5469

このエラーの MS Connect ページでこの回避策を使用しています。 AspNetCompilerを実行する前に、プロジェクト(すべての構成)の下のすべてのobjおよびtempファイルを消去します。

プロジェクトファイルのMvcBuildViewsターゲットを変更して、Visual Studioが作成したパッケージファイルをクリーンアップするターゲットに依存するようにします。これらのターゲットは、Webアプリケーションプロジェクトに自動的に含まれます。

MvcBuildViewsターゲットが実行されるたびに、すべてのパッケージファイルが削除されます。

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

この問題は、objフォルダーにWebプロジェクト出力(テンプレート化された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フォルダーが削除されます。

24
Chris Hynes

Web Publishを使用している場合は、MvcBuildViews=falseおよびPrecompileBeforePublish=true。これは、一時フォルダーへのコピー後(発行/パッケージの直前)にプリコンパイルされます。

注:PrecompileBeforePublishは、「新しい」Web公開パイプラインスタック(VS2010 SP1 + Azure SDKまたはVS2012 RTM)でのみサポートされます。 VS2010 RTMを使用している場合、代替方法のいずれかを使用する必要があります。

4
Richard Szalay

私はこれが回答されたことを知っていますが、私が見つけた興味深い何かを追加したかっただけです。

プロジェクトで「MvcBuildViews」をfalseに設定し、すべてのbinフォルダーとobjフォルダーを削除しても、まだエラーが発生していました。 「MvcBuildViews」がtrueに設定されたままの「.csproj.user」ファイルがあることがわかりました。

「.csproj.user」ファイルを削除すると、すべて正常に機能しました。

したがって、csprojファイルを変更する場合は、「。csproj.user」ファイルも変更または削除してください。

3
nootn

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

私もこの問題を抱えていたので、プロジェクトのプロパティにビルド前イベントを作成して、出力ディレクトリをクリーンアップしました(${projectPath}\bin,${projectPath}\obj\${ConfigurationName})。別のプロジェクトでは、クリーニングイベントが設定されていても、このエラーが発生していました。 2番目のプロジェクトでは、プロジェクトファイルにリストされているビューをコンパイルしていました。

<MvcBuildViews>true</MvcBuildViews>

私はtrueをfalseに変更しましたが、そのエラーについては文句を言わなくなりましたが、それでも正しく実行されました。 2番目のエラーの原因を正確に知っているとは言いませんが、少なくとも当面は前進できました。

2
eppdog

問題は中間ファイルに関係していますが、ビューを構築する前にそれらの中間ファイルをクリーンアップすることから成る別の解決策があります。

このソリューションはVSの一部のバージョンに含まれていますが、VS 2013 Update 5で問題が発生したとしか言えません(下記の"注意"を参照してください。このバージョンでは修正できますが、しかし、私の特定の非標準の場合にのみ機能しません)。

私は Error:allowDefinition = 'MachineToApplication'からVisual Studio Connectのアプリケーションレベルを超えるソリューションを借りました。

ソリューションは、これらの行をWebアプリケーションプロジェクト(.csproj file)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>

注意:何らかの理由で、おそらくプロジェクトに自分自身を含めたため、ビューをビルドするためのビルドターゲットは"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
JotaBe

私の場合、MvcBuildViewsとPrecompileDuringPublishが両方ともtrueの場合、この問題の原因であることがわかりました。

だから私はPrecompileDuringPublishを削除し、その解決策は私のために働いたし、それ以来この問題に直面していない。

enter image description here

0
MoXplod