Microsoft.CodeAnalysisがASP.NET Core Webサイトで公開されるのはなぜですか?


13

私はASP.NET Core MVC 3.0 Webサイトを公開しています。出力フォルダーには、Microsoft.CodeAnalysisライブラリへの参照が多くの言語で多く含まれています。誰かがその理由を知っていますか?

もちろん、FxCopAnalyzersNugetパッケージはプロジェクトにインストールされていますが、以前のバージョンのプロジェクトでは公開されていなかったので、本番環境では開発時にのみ役立つはずなので、なぜ今なのかわかりません。


なんとか、.netコア3のパブリケーションに関するコンパイルビューに関連しているようですが、よく
Jonathan

回答:


5

Microsoft.CodeAnalysisライブラリへの多くの言語での参照が多数含まれています

3.0バージョンを使用したときにも同じ問題が発生しました。しかし、ブランチにView ViewCompilationもあるので、パブリケーションで.net core 3コンパイルビューが原因であるとは思いませんrelease/2.1


本番環境ではなく、開発時にのみ役立つはずです。

  1. 私はあなたが正しいと信じています。これらの分析は、開発時にのみ使用する必要があります。

  2. しかし、SDK(3.0)を手動でアンインストールして最新のSDKを再インストールすると、それ以上再生できなくなります。なぜそうなるのかはわかりませんが、たぶん修正されました。それは別の理由が原因である可能性が高いです:誤ってMicrosoft.CodeAnalysisに依存する他のパッケージに追加の参照追加しました)。とにかく、まずSDKを最新バージョンにアップグレードしてください。

  3. もう1つの重要なことは、Visual Studioを使用してコントローラーを追加すると、Microsoft.VisualStudio.Web.CodeGeneration.Design自動的に参照が追加されることです。このパッケージはMicrosoft.CodeAnalysis.Common間接的にパッケージに依存しています。ここでMicrosoft.CodeAnalysis.Commonは、Microsoft .NETコンパイラプラットフォーム(「Roslyn」)が使用する共有パッケージを示します。このパッケージをダウンロードし、このlibを手動で解凍すると、次のようになりますMicrosoft.CodeAnalysis.dll

    microsoft.codeanalysis.common.3.3.1 /
    ├───lib/
    │└───netstandard2.0/
    │├───... ...
    │├─── Microsoft.CodeAnalysis.dll
    │├───Microsoft.CodeAnalysis.pdb
    │├───Microsoft.CodeAnalysis.xml
    │└───... ...
    ├───パッケージ/
    │└───......
    └───_rels/
    

    このパッケージはDev-Timeでのみ必要です。この依存関係を削除しないMicrosoft.CodeAnalysisと、公開フォルダーに関連するDLLがかなり多くなります。

    <ItemGroup>
        <!-- this is not necessary when publishing -->
        <PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="3.0.0" />
    </ItemGroup>

    に依存するパッケージを削除するMicrosoft.CodeAnalysisと、Microsoft.CodeAnalysis関連するDLL が取得されなくなります。

    ここに画像の説明を入力してください


Microsoft.CodeAnalysisに直接または間接的に依存しているパッケージを確認するにはどうすればよいですか?
ジョナサン


わかりました、依存関係があるMicrosoft.VisualStudio.Web.CodeGeneration.Designパッケージを言ったようです。PrivateAssetsプロパティをallに設定すると、Microsoft.CodeAnalysisファイルは公開されたプロジェクトに存在しなくなります。プロジェクトの依存関係リストにあるパッケージの上に黄色の三角形が表示されているため、コード生成が引き続き正常に機能するかどうかはわかりません。
ジョナサン

@Jonathanこのパッケージは開発時にのみ必要です。実際、VSCodeを使用するなど、スキャフォールディング機能が必要ない場合は、そのような依存関係をまったく追加しません。
itminus '15年

@Jonathan足場が必要な場合、VSを使用すると、パッケージが再度インストールされます。VSCode / CLIを使用している場合は、呼び出す前にそのようなパッケージを追加する必要がありますdotnet aspnet-codegenerator controlller ...
itminus

10

私にとって、*.csprojファイル内のこの行は問題をどういうわけか解決しました。それでもはデプロイされますが、次のMicrosoft.CodeAnalysis場合のみですen

<PropertyGroup>
  <!-- ... -->
  <SatelliteResourceLanguages>en</SatelliteResourceLanguages>
</PropertyGroup>

Githubの問題に関するコメント(Jonathon Marolfによる)を参照してください。


これは私にとってASP.Net Core 3.0で機能し、国別フォルダーを防止しました。必要のない "runtimes"フォルダのサブフォルダ(unixなど)を防ぐことはできますか?
Gen1-1

@ Gen1-1 .NETコア2.1について、この質問を参照してください:stackoverflow.com/questions/53507229/...
mrmowji

ありがとう。したがって、公開することは可能ですが、単にビルド/コンパイルするときに無駄なフォルダーを防ぐことはできないと思います。
Gen1-1

3

ソリューションをより見やすくするための私の見解を以下に示します。

問題は、おそらくの使用ですAddRazorRuntimeCompilation()。より具体的には、startup.csで次のようにかみそりランタイムコンパイルを追加する可能性があります。

     IMvcBuilder builder = services.AddControllersWithViews()
                          .AddRazorRuntimeCompilation(); 

それをサポートするために、あなたのWebプロジェクトはおそらく Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation

そのnugetパッケージは依存関係Microsoft.CodeAnalysisがあり、発行フォルダーに不要な出力をすべて生成しています。

修正は、プロジェクトファイルを編集し、依存関係をデバッグモードで条件付きにすることです。

    <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.Mvc.Razor.RuntimeCompilation" 
Version="3.1.0" Condition="'$(Configuration)' == 'Debug'" />
  </ItemGroup>

そして、startup.csファイルで条件付きで次のように呼び出しますAddRazorRuntimeCompilation()

    IMvcBuilder builder = services.AddControllersWithViews();

     #if DEBUG
            if (Env.IsDevelopment()) {
                builder.AddRazorRuntimeCompilation();
            }
      #endif

これにより、これらのMicrosoft.CodeAnalysisライブラリはすべて、デバッグモードでコンパイルするときにのみ出力されます。したがって、リリースモードを使用してパブリッシュすると、出力の一部にはなりません。


1
IWebHostEnvironment(上記の例ではEnv)は、ConfigureServices()では簡単に使用できませんが、非常に簡単に明らかにできます。stackoverflow.com/questions/37660043/...
アントニオ・ニコラスTeyken

@AntonioNicolaasTeykenすばらしい追加です。これは、私が気づかなかったことに気づかなかった重要な詳細です。
ロンC

0

多分これは誰かを助けることができるかもしれません、私の場合問題は「Microsoft.VisualStudio.Web.CodeGeneration.Desig」でした、私はExcludeAssets = "all"を含めるために ".csproj"ファイルのパッケージ参照を変更する必要がありました:

<PackageReference Include="Microsoft.VisualStudio.Web.CodeGeneration.Design" Version="3.1.1" ExcludeAssets="All" />
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.