2017-11-18 1 views
6

나는 a .NET Standard project과 NuGet을 가지고있다. 프로젝트가 있는데 uploaded it to NuGet.org이 있습니다. 내 프로젝트는 should support .NET Framework 4.6 및 .NET Core 1.0 인 .NET Standard 1.3을 대상으로합니다.왜 .NET 표준 NuGet 패키지가 많은 종속성을 유발합니까?

그러나 새로운 프로젝트 (NuGet을 통해)를 새로운 .NET Framework 4.6 프로젝트에 추가하려고하면 종속성이 개의 패키지로 해결되었습니다! 이들은 모두 시스템 라이브러리이며 Microsoft.NETCore.Platforms 또는 NETStandard.Library 1.6.1 중 하나의 종속성 인 것처럼 보입니다. (Gist of full PM output.)

내 프로젝트는 (using) 소수의 라이브러리 만 가져오고, 어느 것도 수동으로 추가하지 않았습니다. 즉 .NET 표준과 함께 제공되는 모든 라이브러리입니다. 이 라이브러리는 다음과 같습니다

  1. 시스템
  2. System.Text
  3. 하는 System.Reflection
  4. 을 System.Linq
  5. System.Collections.Generic;

저는 .NET Framework 및 .NET Core 응용 프로그램에서 완벽하게 작동하기를 원했기 때문에 프로젝트 대상으로 .NET Standard를 사용하기로했습니다. 표준의 전체적인 점은 최소한의 호환성 수준을 설정하는 것이라고 생각했습니다. 필자는 아마도 System.Console과 같은 라이브러리가 코어 나 프레임 워크에서 자동으로 사용할 수 있다고 가정했을 것입니다.

내 표준 프로젝트를 동일한 솔루션 내에서 프레임 워크 및 핵심 프로젝트의 종속성으로 테스트했을 때이 사실을 알지 못했기 때문에 이것이 NuGet 일 수 있습니다.

실제로 무엇이 일어나고 있습니까? 그리고 .NET 표준 라이브러리를 NuGet에서 사용할 수 있도록하려면 어떻게해야합니까?

NuGet 패키지를 지정한 방식에 문제가 있습니까? 아니면 내가 근본적으로 오해 한 적이 있습니까?

+0

실제로 출력 폴더에 추가 된 항목이 있는지 또는 패키지를 설치할 때 패키지가 무서운 목록인지 여부를 확인했습니다. 제 경험은 그것이 후자인데 여전히 위대하지는 않지만 걱정스러운 것은 아닙니다. –

+0

@JonSkeet 내 패키지 폴더에는 이제 폴더가 하나만있을 때 폴더 목록이 길어졌습니다. 추가적으로, "NuGet 패키지 관리"화면에는 모든 패키지가 표시됩니다 (일부 패키지는 보류중인 업데이트가 있음). –

+2

오른쪽 - bin 디렉토리에는 무엇이 있습니까? (FWIW, 나는 이것이 매우 불행한 상황이라는 것에 완전히 동의한다.나중의 릴리스에서 개선되었는지 여부는 알 수 없습니다. 그러나 이것이 제가 생산하는 일부 패키지의 경우 netstandard1.x 버전뿐만 아니라 net45 타겟을 만듭니다 ...) –

답변

9

당신은 아무런 잘못을하지 않았습니다, 이것은 일어날 것으로 예상됩니다. 새 .NET Framework 프로젝트에 자신의 DLL을 추가하기를 원한다면 라이브러리에 .NET 표준 2.0을 지정해야합니다. .NET Framework 버전은 API와 어셈블리 버전을 모두 기본적으로 지원합니다. (.NET Framework 4.7.1은 모든 API를 지원하지만 일부 어셈블리의 버전이 변경되는 방식에 버그가 있으므로 툴링 (VS 2017 15.5+)이이를 수정하기 위해 추가 어셈블리를 추가하게됩니다).

.NET Standard가 어떻게 빌드되고 지원되는 프레임 워크에 대한 지원이 구현되는지에 대한 부작용이 있습니다. 또한 대상인 .NET Standard 버전과 라이브러리 패키지를 참조하는 데 사용 된 도구에 따라 다릅니다. .NET 표준 < 2.0

, 당신은 NETStandard.Library 메타 패키지 차례 참조에 추가 ( System.*) 패키지를 참조합니다. 이러한 패키지에는 ".NET Standard Contract"(API 세트 및 어셈블리 이름 + 버전 세트)를 구성하는 참조 어셈블리가 포함되어 있습니다.

.NET Standard 1.0-1.6 용으로 만든 NuGet 패키지가 응용 프로그램에서 참조 될 때 이러한 개별 패키지는 참조 어셈블리를 가져 오지 않고 응용 프로그램이 대상으로하는 프레임 워크의 구현 어셈블리를 가져옵니다.

.NET 코어의 경우 이미 런타임에 포함 된 어셈블리와 일치하므로 DLL 파일이 빌드 된 응용 프로그램 옆에 표시되지 않습니다. 그러나 .NET Core 1.1 (NETStandard.Library 버전 1.6.1)에 대해 새로운 패키지 집합이 릴리스 된 경우에도 변경되었습니다. 이로 인해 .NET Core 1.0 용으로 빌드 된 응용 프로그램이 .NET Core 1.1에 포함될 예정이었던 새로운 구현 어셈블리를 얻게되었습니다. (운좋게도 1.1은 "장기 지원"버전이되었습니다. LTS 약속의 일부 임).

.NET Framework에서 이러한 라이브러리는 (System.Net.Http과 같은 일부 예외가 있음) 많은 작업을 수행하지 않고 시스템 어셈블리로 전달합니다. 예를 들어 "계약"은 System.ObjectSystem.Runtime.dll 어셈블리에 정의되어 있다고 정의합니다. 따라서 System.Runtime.dll 파일은 .NET Framework 응용 프로그램에서 System.Runtime.dll에 전달 형식 .NET Framework의 mscorlib.dll을 포함합니다. .NET 코어에는 이미 해당 플랫폼에 대해 다른 작업을 수행하는 다른 System.Runtime.dll이 포함되어 있습니다. 이 메커니즘은 단일 DLL 파일이 두 플랫폼 모두에서 작동하도록합니다. 이러한 형식 전달 및 추가 구현은 두 구현에서 모두 작동하는 동일한 "계약"(유형 + 어셈블리 + 어셈블리 버전)을 보장하기 때문입니다.

.NET Standard 2.0은 새로운 .NET Core 버전이 출시 될 때마다 필요한 패키지 및 DLL 수를 줄이고 필요한 업데이트를 NETStandard.Library으로 제거하기위한 것입니다.

.NET Standard 2.0 및 .NET Core 2.0의 경우 NETStandard.Library 패키지는 코드를 프로젝트에 컴파일하기위한 참조 어셈블리 만 가져 오지만 결과 NuGet 패키지는 더 이상이 패키지에 의존하지 않습니다. 따라서 .NET Standard 2.0을 대상으로하는 라이브러리를 만들고 게시 할 때 NuGet 종속성이 없습니다 (추가하지 않는 한).

.NET 표준 라이브러리를 사용할 때 가져 오는 "지원 라이브러리"의 논리가 빌드 중에 사용되는 도구로 옮겨졌습니다. 따라서 netstandard.dll에 대한 참조가 포함 된 라이브러리가 .NET Framework 프로젝트에 추가되면 도구에서 사용중인 .NET Framework 버전을 기반으로 필요한 지원 DLL을 추가합니다. .NET Framework 4.6.1은 이러한 종류의 DLL 파일을 통해 소급하여 .NET Standard 2.0 (이전에는 1.4)과 호환 되었기 때문에 .NET Standard 2.0 및 .NET Standard 1.5+에서 수행되었습니다. 동일한 도구를 사용하여 NuGet 패키지가 어떻게 든 그런 응용 프로그램 프로젝트로 가져 오더라도 NuGet을 통해 가져온 .NET Standard 구현 라이브러리는 빌드에서 제거됩니다. 따라서 .NET Core 1.0이 출시되었을 때 빌드 된 .NET Standard 1.0 NuGet 패키지를 참조하면 모든 NuGet 종속성이 제거되고 대신 빌드 도구와 함께 제공되는 지원 라이브러리가 제공됩니다.

아이디어는 .NET 프레임 워크 4.7.1에 netstandard.dll, System.Runtime.dll 등이 .NET Framework의 일부이고 모든 .NET Standard 1.0-2.0 DLL 파일이 "필요한 모든 어셈블리" 작업 "문제는 이러한"받은 편지함 "dll 파일에 라이브러리에 대한로드가 실패 할 정도로 너무 낮은 버전 번호가 있다는 것입니다.이 라이브러리는 툴링을 다시 변경하여 지원되는 라이브러리의 버전 번호가 높은 DLL 파일을 포함하도록 수정되었습니다. "받은 편지함".NET Framework 어셈블리로 전달하십시오. 이 문제는 .NET Framework 4.7.2에서 수정 될 예정입니다.

+0

Martin 감사합니다. 이 포괄적 인 대답을 완전히 소화하기 위해 잠시만 시간을 보냈습니다. 나는 .NET Standard가 여전히 초기 단계에 있다고 생각하며, 이는 치근 통증 중 하나입니다. 나는 꽉 앉아 프레임 워크 4.7.2 버전을 기다릴 것이다. –

+0

해결 방법에 대한 내 관심이 끌렸습니다. http://blog.tdwright.co.uk/2017/11/21/update-getting-net-standard-apps-playing-nicely-on-nuget/ –

+1

예, NuGet 's get-nearest-framework 로직은 다른 것들을 고려하기 전에 낮은 버전의 동일한 타겟 프레임 워크를 선호합니다 (net471 프로젝트는'netstand'2보다'net35'를 선택합니다). –

관련 문제