ASP.NET Core 웹 사이트에 Microsoft.CodeAnalysis가 게시 된 이유는 무엇입니까?


13

ASP.NET Core MVC 3.0 웹 사이트를 게시하고 있으며 출력 폴더에는 여러 언어로 된 Microsoft.CodeAnalysis라이브러리 에 대한 많은 참조가 포함되어 있습니다 . 누군가 이유를 알고 있습니까?

물론 FxCopAnalyzersNuget 패키지는 프로젝트에 설치되어 있지만 이전 버전의 프로젝트에서는 게시되지 않았으므로 프로덕션 환경이 아닌 데브 타임에서만 유용해야하기 때문에 지금 왜 그런지 이해할 수 없습니다.


그것은 어떻게 든 출판에 대한 .net 코어 3 컴파일 뷰와 관련이있는 것 같지만 확실하지 않습니다
Jonathan

답변:


5

Microsoft에 대한 많은 언어 참조가 포함되어 있습니다.

3.0 버전을 사용할 때도 같은 문제가 발생했습니다. 그렇지만, 나 또한 거기에 있기 때문에이 출판물에 그물 코어 (3) 컴파일 전망에 의한 생각하지 않는 보기 ViewCompilation을release/2.1지점입니다.


프로덕션 환경이 아닌 데드 타임에만 유용해야합니다.

  1. 당신이 맞다고 생각합니다. 이러한 분석은 실시간으로 만 사용해야합니다.

  2. 그러나 SDK (3.0)를 수동으로 제거 하고 최신 SDK를 다시 설치하면 더 이상 재현 할 수 없습니다. 나는 왜 그런 일이 일어나지 않았는지, 아마도 지금 수정되었을 것입니다. 다른 이유로 발생할 가능성이 큽니다 . 우연히 Microsoft.CodeAnalysis의존하는 다른 패키지에 대한 추가 참조를 추가했습니다 . 어쨌든 먼저 SDK를 최신 버전으로 업그레이드하십시오.

  3. 또 다른 중요한 점은 Visual Studio를 사용하여 컨트롤러를 추가 할 때 Microsoft.VisualStudio.Web.CodeGeneration.Design자동으로 참조를 추가한다는 것 입니다. 이 패키지는 Microsoft.CodeAnalysis.Common패키지에 간접적으로 의존합니다 . 다음은 Microsoft.CodeAnalysis.CommonMicrosoft .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에 직간접 적으로 종속되어 있는지 어떻게 알 수 있습니까?
Jonathan


네, 의존성이있는 Microsoft.VisualStudio.Web.CodeGeneration.Design 패키지와 같습니다. PrivateAssets 속성을 all로 설정하면 Microsoft.CodeAnalysis 파일이 더 이상 게시 된 프로젝트에 없습니다. 프로젝트의 종속성 목록에 패키지 위에 노란색 삼각형이 있으므로 코드 생성이 여전히 잘 작동하는지 확실하지 않습니다.
Jonathan

@Jonathan 개발 시간 동안 만이 패키지가 필요합니다. 실제로 VSCode와 같은 스캐 폴딩 기능이 필요하지 않은 경우 이러한 종속성을 전혀 추가하지 않습니다.
itminus

@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에서 나를 위해 일했으며 국가 폴더를 막았습니다. 필요하지 않은 "런타임"폴더의 하위 폴더 (유닉스 등)를 방지 할 수 있습니까?
Gen1-1

@ Gen1-1 .NET 코어에 대해 2.1이 질문을 참조하십시오 stackoverflow.com/questions/53507229/...
mrmowji

감사. 게시 할 때 가능하지만 단순히 빌드 / 컴파일 할 때 낭비되는 폴더를 막을 수는 없습니다.
Gen1-1

3

솔루션을 더 쉽게 볼 수 있도록 노력하겠습니다.

문제는 아마도의 사용입니다 AddRazorRuntimeCompilation(). 더 구체적으로, startup.cs에서 다음과 같이 면도기 런타임 컴파일을 추가 할 가능성이 있습니다.

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

이를 지원하기 위해 웹 프로젝트에 대한 참조가있을 수 있습니다. 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/…
Antonio Nicolaas Teyken

@AntonioNicolaasTeyken 탁월한 추가 기능, 그것은 내가 광택을내는 것을 깨닫지 못했던 중요한 세부 사항입니다.
Ron 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.