ビルドサーバーでWebアプリケーションをビルド/パックしていますが、次のメッセージで失敗します。
ASPNETCOMPILERエラーASPCONFIG:CodeDomプロバイダーの種類 "Microsoft.VisualC.CppCodeProvider、CppCodeProvider、Version = 10.0.0.0、Culture = neutral、PublicKeyToken = b03f5f7f11d50a3a"が見つかりませんでした。
これはビルドサーバー環境です。
これはASP MVC 4 Webアプリケーションで、.NET 4.5を対象としています。
ビルド構成は、MSBuildを使用してソリューションをビルドし、それをパッケージにデプロイすることで構成されているため、後で公開できます。
TeamCityのログを通じて、MSBuildの実行時に発生するエラーを確認できますaspnet_compiler.exe
。
ビルドは私のDEVマシンで問題なく構築され、ローカルのIISに問題なく公開することもできます。
誰かがこの問題を引き起こしている可能性があることを知っていますか?
[〜#〜]更新[〜#〜]
私にとって、このエラーはVS2017でWebプロジェクトをビルドするときに発生しました。修正は、ファイルエクスプローラーでnode_modulesディレクトリを非表示にすることでした。どうやらこれにより、ASP.NETコンパイラがこれらのすべてのファイルをスキャンすることができなくなり、エラーが防止されます。
この投稿 は私に重要な手がかりを与えました:ASP.NETプリコンパイルはプロジェクトと出力ファイルをスキャンし、その言語にもかかわらず、その方法で見つかったすべてのソースファイルをコンパイルしようとします( ここを参照 )。
この場合、私のWebアプリは、 "。h"ファイルに沿ってアンマネージDLLを含むプロジェクトに依存しています。これらのファイルは出力ディレクトリにコピーされるため(「新しい場合はコピーする」)、実行時にピンを呼び出すことができます。
ASP.NETのプリコンパイルは ".h"を見つけて、それをコンパイルしようとしているようですが、必要はありません。そして、私が見ると、ビルドサーバーにジョブ用のツールがないために失敗します(CppCodeProvider
には 。NET 2.0 SDK が付属しているようです)。
これらのファイルを出力ディレクトリにコピーしないようにプロジェクトを変更すると、ビルドは正常に実行されました。ファイルのコピーもテストしましたが、発行プロファイルで "PrecompileBeforePublish"をfalseに設定して、それも機能しました。
今私はいくつかのオプションを持っていますが、それらのどれも好きではありません:
「PrecompileBeforePublish」を無効にします。その主な欠点は、アプリのユーザーエクスペリエンスが最初のサイトアクセスで遅くなることです。
出力フォルダーからファイルを除外して、プリコンパイル後に再度追加してください。そもそも、私が心配してはいけないことには、かなりの労力がかかるようです。
"aspnet_compiler.exe"に、実行時に問題のあるファイル/フォルダーを除外するよう指示してください。 "PrecompileBeforePublish"しか制御できないため、発行プロファイルを使用してそれを行う方法がわかりません。また、「aspnet_compiler.exe」はそのオプションを提供していないようです( ここ および ここ )。
今のところ、「PrecompileBeforePublish」を無効にすると思います。これは、注意点の少ない高速パスのようです。しかし、パブリッシュプロファイルを使用したプリコンパイルからフォルダーまたはファイルタイプを除外して、それを処理するより良い方法があるはずだと思います。
これは、VS2017に更新したときに発生し始めました。私の問題はnode.jsでした。node_modulesフォルダーを削除すると、プロジェクトはエラーなしでビルドされます。 anders here によって提案されているように、csprojファイルでMvcBuildViewsの値をfalseに変更すると修正されます。 IISそれらがレンダリングされるまでmvcビューはコンパイルされないため、これは理想的ではありません。個人的には、問題を回避するためにnode_modulesフォルダーを非表示にするだけですが、念のためこの回答を追加したいと思います他の誰かの根本的な問題に光を当てるのに役立ちます。
<MvcBuildViews>false</MvcBuildViews>
私のシナリオでは、ASP.Net WebサイトにPerlインタープリターを同梱する必要があります(なぜPerlが必要なのか、前もって申し訳ありませんが質問しないでください)。これには、aspnet_compilerを引き起こした.cファイルが含まれていました。他の人が彼らの問題であると述べているように、エラーアウトするexe。 Perlディレクトリは私のbinフォルダーにあり、実行時に必要です。
私が見つけた問題は、あなたがフォルダーをattrib +H
したときでした。それは確かにaspnet_compilerによってスキップされましたが、その後、パブリッシュ出力フォルダーにはありませんでした。そのため、フォルダーを非表示にし、ビューをコンパイルし、フォルダーを再表示して、フォルダーを正しい場所にコピーすることで、さらにハッキングする必要がありました。これには、元のAspNetPreCompile
タスクの変更が含まれていました。下記参照:
<!-- Overwrite AspNetPreCompile task because it was trying to compile .c files found in the Perl directory. This prevents that but still copies Perl to publish file. -->
<!-- Taken from: C:\Program Files (x86)\Microsoft Visual Studio\2017\Professional\MSBuild\Microsoft\VisualStudio\v15.0\Web\Transform -->
<Target Name="AspNetPreCompile" DependsOnTargets="$(AspNetPreCompileDependsOn)" Condition="'$(AspNetPreCompile)' != 'false'">
<PropertyGroup Condition="'$(UseMetabasePath)' == 'true'" >
<_PreAspnetCompileMergeSingleTargetFolderFullPath></_PreAspnetCompileMergeSingleTargetFolderFullPath>
<_AspNetCompilerVirtualPath></_AspNetCompilerVirtualPath>
</PropertyGroup>
<PropertyGroup Condition="'$(UseMetabasePath)' != 'true'" >
<_PreAspnetCompileMergeSingleTargetFolderFullPath>$([System.IO.Path]::GetFullPath($(_PreAspnetCompileMergeSingleTargetFolder)))</_PreAspnetCompileMergeSingleTargetFolderFullPath>
</PropertyGroup>
<PropertyGroup>
<_PostAspnetCompileMergeSingleTargetFolderFullPath>$([System.IO.Path]::GetFullPath($(_PostAspnetCompileMergeSingleTargetFolder)))</_PostAspnetCompileMergeSingleTargetFolderFullPath>
</PropertyGroup>
<!-- Modification #1. -->
<Exec Command="attrib +H "$(IntermediateOutputPath)AspnetCompileMerge\Source\bin\Perl"" />
<AspNetCompiler
PhysicalPath="$(_PreAspnetCompileMergeSingleTargetFolderFullPath)"
TargetPath="$(_PostAspnetCompileMergeSingleTargetFolderFullPath)"
VirtualPath="$(_AspNetCompilerVirtualPath)"
Force="$(_AspNetCompilerForce)"
Debug="$(DebugSymbols)"
Updateable="$(EnableUpdateable)"
KeyFile="$(_AspNetCompileMergeKeyFile)"
KeyContainer="$(_AspNetCompileMergeKeyContainer)"
DelaySign="$(DelaySign)"
AllowPartiallyTrustedCallers="$(AllowPartiallyTrustedCallers)"
FixedNames="$(_AspNetCompilerFixedNames)"
Clean="$(Clean)"
MetabasePath="$(_AspNetCompilerMetabasePath)"
ToolPath="$(AspnetCompilerPath)"
/>
<!-- Modification #2. -->
<Exec Command="attrib -H "$(IntermediateOutputPath)AspnetCompileMerge\Source\bin\Perl"" />
<!--
Removing APP_DATA is done here so that the output groups reflect the fact that App_data is
not present
-->
<RemoveDir Condition="'$(DeleteAppDataFolder)' == 'true' And Exists('$(_PostAspnetCompileMergeSingleTargetFolderFullPath)\App_Data')"
Directories="$(_PostAspnetCompileMergeSingleTargetFolderFullPath)\App_Data" />
<CollectFilesinFolder Condition="'$(UseMerge)' != 'true'"
RootPath="$(_PostAspnetCompileMergeSingleTargetFolderFullPath)" >
<Output TaskParameter="Result" ItemName="_AspnetCompileMergePrecompiledOutputNoMetadata" />
</CollectFilesinFolder>
<ItemGroup Condition="'$(UseMerge)' != 'true'">
<FileWrites Include="$(_PostAspnetCompileMergeSingleTargetFolderFullPath)\**"/>
</ItemGroup>
<!-- Modification #3. -->
<ItemGroup>
<Perl Include="$(IntermediateOutputPath)AspnetCompileMerge\Source\bin\Perl\**\*.*" />
</ItemGroup>
<!-- Modification #4. -->
<Copy SourceFiles="@(Perl)" DestinationFolder="$(_PostAspnetCompileMergeSingleTargetFolderFullPath)\bin\Perl\%(RecursiveDir)"></Copy>
</Target>
元の.targetsファイルは変更しないでください。これを<project>
ノードの子として.csprojファイルにコピーしてください。
重要なポイント:
AspNetCompilerタスクを介してaspnet_compiler.exeを実行する前にExec
コマンドをattrib +H Directory
に使用し、その後attrib -H Directory
を使用します。
ItemGroup
を作成して、まだコピーする必要があるすべてのファイルを取り込みます。
Copy
タスクを実行し、そのItemGroup
を利用して、残りのパブリッシュタスクに含めるために必要な場所にファイルを配置します。 Microsoftがこのタスクを作成するときに作成したすべての変数を使用できるので、ここでもそれらを使用できます。
元のタスクを変更するためのプロ:通常の動作に関する変更はほとんどないため、引き続き機能します。
元のタスクを変更する可能性のある詐欺:マイクロソフトは将来このタスクを変更し、コピーを古くする可能性があります。
私の奇妙な要件がない場合、フォルダーを非表示にする簡単な解決策は次のとおりです。
<Target Name="Test" BeforeTargets="AspNetPreCompile">
<Exec Command="attrib +H Directory" />
</Target>
<Target Name="Test" AfterTargets="AspNetPreCompile">
<Exec Command="attrib -H Directory" />
</Target>
Arthur Nunesで行ったコメントtwamleyに触発された回答。
このエラーに対する私の解決策は、このページの既存の2つの回答の組み合わせでした。 Webプロジェクトディレクトリに.hファイルがありましたが、VS 2017マシンでプロジェクトをビルドしようとするまで問題は発生しませんでした。
私の場合、単純に圧縮しただけですが、関連性のないコードファイルをWebディレクトリに保持できなくなるか、VSがそれらをコンパイルしようとしてトリップする可能性があります。
私の場合、このエラーの原因となったソリューションにangular Webサイトを追加しました。
次の手順でエラーを解決しました。
メニューバーで、[ビルド]> [構成マネージャー]を選択します。
プロジェクトコンテキストテーブルで、angular Webサイト(node_modulesを含む))を除外します
プロジェクトの[ビルド]列で、チェックボックスをオフにします。
[閉じる]ボタンを選択して、ソリューションを再構築します。
私の場合の問題は、IIS)の親ソリューション(ルートレベルのプロジェクト)のWeb構成にWeb構成でこれが含まれていたことです(誤って、どうやってそこに到達したのかわかりません)。追跡に長い時間がかかります。ソリューション/プロジェクトで私ができることは何もないので、何らかの影響を与える可能性があるからです。
したがって、関連する可能性のあるすべてのweb.configを確認する価値があるかもしれません。
私の場合、新しいマシンでVS2017をインストールし、ソース管理からasp.net core 1.1 Webアプリケーションを開きました。エラーが表示されました。 node.jsをインストールし、プロジェクトをコンパイルしました。
私にとって、このエラーは、IISでWebサイトの物理パスが無効であるときに表示されていました。この問題を解決するには、Webサイトを右クリックします(Webサイトの管理->詳細設定->物理パス)。
以下をやってみてください。
RequireTargetFrameworkを4.0に設定します。
後でグーグルでこれを見つけた人のために...
根本的な原因
エラーが示すように、アセンブリ "Microsoft.VisualC.CppCodeProvider"が見つかりませんでした。
これは、Visual Studio 2015のインストールの一部としてグローバルアセンブリキャッシュ(GAC)に追加されましたが、Visual Studio 2017には追加されませんでした。
修正
適切な修正は、不足している参照をGACに追加することです。
「開発者コマンドプロンプト」を管理者として実行し、以下を実行します。
_gacutil /i "path to CppCodeProvider.dll"
_またはgacutil /i "C:\Program Files (x86)\Microsoft Visual Studio\2 017\Professional\Common7\IDE\PublicAssemblies\CppCodeProvider.dll"
例えば.
_
C:\Windows\System32>gacutil /i "C:\Program Files (x86)\Microsoft Visual Studio\2
017\Professional\Common7\IDE\PublicAssemblies\CppCodeProvider.dll"
Microsoft (R) .NET Global Assembly Cache Utility. Version 4.0.30319.0
Copyright (c) Microsoft Corporation. All rights reserved.
Assembly successfully added to the cache
C:\Windows\System32>
_
次のビルドでは、次のエラーはスローされなくなりました。
ASPNETCOMPILERエラーASPCONFIG:CodeDomプロバイダーの種類 "Microsoft.VisualC.CppCodeProvider、CppCodeProvider、Version = 10.0.0.0、Culture = neutral、PublicKeyToken = b03f5f7f11d50a3a"が見つかりませんでした。