실행 전 검증 프로그램 집합 리셋

이번 주 야크 면도 프로젝트는 몇 개의 대형 데이터베이스 중의 라이브러리 의존항을 업데이트하고 있다.NET 솔루션.그것은 우리가 예상한 시간을 들였지만, 우리가 예상한 이유가 아니다. - 이것은 프로그램 집합의 귀속 방향을 바꾸는 이야기이다.
이 라이브러리(Npgsql)는 두 가지 주요 버전이 있는데 각각 2이다.x에서 4.x. 우리의 사례에서 갱신의 주요 장점을 증가시켰다.NET 핵심 지원을 통해 이 monorepo의 서비스 증가분을 이식할 수 있습니다.순수한 핵심.
우리의 의존 구조는 다음과 같다.
- Npgsql
  - SharedBusinessLogic
    - Web UI layer
    - Some async services that generate reports
    - An unrelated UI project that doesn't use Npgsql directly
일부 데이터베이스 조회에 장애가 발생했지만 전체적으로 업데이트가 순조롭게 진행되는 것 같아서 테스트는 로컬과 CI에서 통과되었다.
그러나 지점을 통합하여 테스트 환경에 배치한 후에 프로젝트가 일부 노선에서 오류를 던지기 시작했습니다.

어떻게 된 거야?
업데이트된 종속성 맵:
- System.Runtime.CompilerServices.Unsafe
- System.Numerics.Vectors
- System.Memory
- System.Threading.Tasks.Extensions
  - Npgsql
    - SharedBusinessLogic
      - Web UI layer
      - Some async services that generate reports
      - An unrelated UI project that doesn't use Npgsql directly
Npgsql 의존 항목은 현재 netstandard를 목표로 하고 있습니다. 이것은 우리가 그것을 인용할 수 있다는 것을 의미합니다.NET Core 및.NET Framework 에는 호환성 해커가 없습니다.그러나 이를 실현하기 위해 이전에 에서 인용한 의존항을 설치했다.NET runtime은 이제 NuGet 패키지를 통해 참조됩니다.관례에 따르면, 그 중 대다수는 의존항 목록에 접두사가 있다System..

그러나 우리의 일부 다른 응용 프로그램 의존항은 이미 이 System. 프로그램 집합을 인용했지만 버전은 다르다.
곤혹스러웠어우리가 어떻게 일을 하는지 이야기합시다.
안에 있다NET 핵심 프로젝트 프로그램 집합 귀속 리셋은 필요하지 않지만, 우리의 많은 프로젝트는 여전히 위에서 실행되고 있습니다.NET 4.8이라고도 합니다.NET 프레임워크 또는 netfx
실행 중.NET Framework는 요청된 종속 항목의 특정 버전을 해석하려고 시도합니다.만약 bin 폴더에 정확한 버전이 존재하지 않는다면, 프로그램 집합 귀속이'강제'로 실행될 때 특정 버전으로 해석되어야 합니다. 그렇지 않으면 이상이 발생합니다.이 귀속은 설정 파일에 지정되어 실행될 때 검사됩니다.
더 읽기 위해 귀속 리디렉션에 대한 Nick Craver의 우수한 게시물here을 추천합니다.
일을 더욱 복잡하게 하는 것은 모든 프로그램 집합이 프로그램이 시작될 때 불러오고 검사하는 것이 아니라는 것이다.우리는 일부 서버 사이드 루트만 Npgsql 프로그램 집합의 불러오기를 초래했기 때문에 메인 루트만 구축하고 실행하는 것은 부족하다는 것을 발견했다.
알겠습니다. 코드가 붕괴된 것을 알고 있기 때문에 이 귀속을 업데이트하겠습니다.그러나, 우리의 웹 응용 프로그램에서 가능한 모든 경로를 실행하기 전에, 우리는 어떻게 이 문제를 알 수 있습니까?
우리의 첫 번째 시도는 msbuild /warnaserror 로고를 사용하는 것이다.이 스위치를 사용하여 인쇄 NuGet 수준 복원 문제 (다운그레이드 경고) 에 대한 경고와 일치하지 않거나 완전히 누락된 바인딩 방향을 조정합니다.추가 정보here.
C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\MSBuild\Current\Bin\Microsoft.Common.CurrentVersion.targets(2084,5): warning MSB3247: Found conflicts between different versions of the same dependent assembly. 

In Visual Studio, double-click this warning (or select it and press Enter) to fix the conflicts; otherwise, add the following binding redirects to the "runtime" node in the application configuration file:

<assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"><dependentAssembly><assemblyIdentity name="System.Memory" culture="neutral" publicKeyToken="cc7b13ffcd2ddd51" /><bindingRedirect oldVersion="0.0.0.0-4.0.1.1" newVersion="4.0.1.1" /></dependentAssembly></assemblyBinding> 
우리의 사례에서 우리는 아직 사용할 수 없다/warnaserror. 왜냐하면 우리는 이 검증을 점차적으로 전개하기를 원하기 때문이다. 또한 다음과 같다.
  • 라이브러리의 이전 버전에 대한 귀속 리디렉션 경고
  • bin 폴더에 존재하지 않는 프로그램 집합의 유행이 지난 방향 (삭제된 의존항) 경고
  • 이 도구를 전체 git 저장소에서 로컬로 실행하여 여러 개의 해결 방안 파일을 사용하여 Repo의 건전성을 신속하게 검사합니다
  • 부족한 귀속을 생성하고 msbuild의 출력에서 붙여넣기 텍스트를 복사하지 않습니다

  • 우리는 마침내 이 문제를 처리하기 위해 Powershell 스크립트를 만들었다.그것은 의존성이 없고 Powershell 5에서 테스트되었습니다.Check it out here if you're interested
    그 기본 사상은 다음과 같다.
  • 사이트를 찾습니다.구성 또는 응용 프로그램.폴더의 파일 반복 구성
  • 해석된 모든 설정에 대해 bin 폴더를 열고 각 DLL을 불러오고 버전과 키 영패의 맵을 구축합니다
  • 목록이 일치하는지 확인
  • 없으면 구축 실패
  • ???
  • 이윤
  • 구축 도구에 대한 신뢰가 증가함에 따라 우리는 더욱 주동적으로 공유 프로젝트를netstandard로 옮기고 최종적으로 더 많은 프로젝트를 발표할 수 있다.순수한 핵심.
    운송이 즐겁다!

    좋은 웹페이지 즐겨찾기