[번역] .NET Framework 클래스 라이브러리를 구축하는 리눅스에서 모노를 설치하지 않습니다

이 기사에서는 리눅스 대신에 모노를 사용하는 .NET 프로젝트의 .NET Framework 버전을 만드는 방법을 보여 주었다. 범용의 마이크로 소프트의 새로운 릴리스를 사용 Mocrosoft.NETFramework.ReferenceAssemblies NuGet 패키지를, 당신은 .NET 코어 SDK에 추가되었습니다에 추가 소프트웨어 패키지를 설치할 필요가 없습니다! 리눅스 시스템에 .NET Framework 클래스 라이브러리를 구축 할 때 일반적으로, 당신은 단지 프로젝트 파일에 다음 노드를 추가해야합니다 :

< PackageReference 포함 = "Microsoft.NETFramework.ReferenceAssemblies" PrivateAssets = "모든" 버전 = "1.0.0-preview.2"  />

 

배경 : 리눅스에서 전체 프레임 워크 라이브러리의 건설

당신이 .NET 표준 NuGet 패키지를 구축하고, 당신은 최고의 경험을 사용자에게 제공 (원하는 경우 일부 종속성을 피 ), 당신은 확인해야합니다 크로스 플랫폼 권고 위치를. 이 할 일의 많은이며, 권장하지 않습니다,하지만 난 졸이다하는 경향이있다 : 당신의 목표는 .NET 표준의 모든 버전에 있다면, 당신은 적어도 다음과 같은 목표 프레임 워크가 필요합니다 :

< TargetFrameworks > netstandard2.0; net461; net472 </ TargetFrameworks >

당신의 목표는 다음 표준 1.x에서를 .NET 대상을 구축하는 데 추가하는 경우, .NET 프레임 워크 .NET 표준 2.0 가스켓 문제를 방지하기 위해 두 가지 목표를 포함하는 것이 중요합니다.

이론적으로는 Windows에서만 구축 할 수 있습니다 전체 .NET Framework를 대상 -이 문제들을 제기한다. 이전 기사 , I 설치하고이 제공 모노 어셈블리를 사용하여이 문제를 해결하는 방법을 보여 주었다. 에서 그 기사 , 나는 또한 리눅스 .NET 프레임 워크 테스트 스위트에서 실행 보여 주었다. 지금까지, 그것은 나에게 매우 효과적이지만, 몇 가지 단점이 있습니다 :

  • 그것은 모노를 설치해야합니다
  • 약간의 해키 .props 파일을 추가 할 필요가있다
  • 그것은 공식적인 지원을받지 않기 때문에 작동하지 않는 경우, 당신은 방법을 생각해야

.props 파일 FrameworkPathOverride 은 MSBuild 변수가 우리의 방법을 구축 할 수있는 모노 참조 어셈블리로 설정됩니다. 그러나 코멘트에 존 소총은 지적, 모노 정말 필요가 없습니다. 우리는 쉽게 컴파일 된 어셈블리에 대한 참조를 얻을 수있는 방법이 필요합니다. 그는 마이크로 소프트에서 제공 Microsoft.NETFramework.ReferenceAssemblies의 패키지로 제공된다.

절차 설정 NuGet을 사용하여 Microsoft.NETFramework.ReferenceAssemblies을

내가 볼 무하마드 Rehan 사이드를 이 트윗 전에, 나는 알아 차리지 않았다 Microsoft.NETFramework.ReferenceAssemblies NuGet 패키지를. 이 정보는 전체 .NET Framework 클래스 라이브러리는 리눅스에 .NET 핵심 SDK를 설치해야 큰 건물입니다!

한 가지 예를 들어 보겠습니다.

당신은 사용할 수 있습니다   DOTNET 새로운 CLASSLIB는   아래와 같이 .csproj 파일을 제공하는 .NET 핵심 라이브러리를 만들 :

< 프로젝트 SDK = "Microsoft.NET.Sdk" > 

  < PropertyGroup > 
    < TargetFrameworks > netstandard2.0 </ TargetFrameworks > 
  </ PropertyGroup > 

</ 프로젝트 >

 구축에 더 많은 목표를 추가 .csproj 프로젝트 파일을 수정합니다 :

< 프로젝트 SDK = "Microsoft.NET.Sdk" > 

  < PropertyGroup > 
    < TargetFrameworks > netstandard2.0; net461; net472 </ TargetFrameworks > 
  </ PropertyGroup > 

</ 프로젝트 >

 당신이 리눅스에이 시간을 사용하려고하면   DOTNET 빌드를  다음과 유사한 오류가 발생합니다 :

는 / usr / share / DOTNET / SDK / 2.1 . 700 /Microsoft.Common.CurrentVersion.targets ( 1175 , 5 ) : 
오류 MSB3644 : 기준 어셈블리 에 대한 프레임 워크 " .NETFramework 버전 = v4.6.1은 "  
발견되지 않았다. 이 문제를 해결하려면 설치 SDK를 또는 팩을 타겟팅 을 위해 이 프레임 워크의 
버전 또는 프레임 워크의 버전으로 응용 프로그램의 대상을 위해  하는 당신이 
SDK를 또는 팩이 설치 타겟팅을. 어셈블리가에서 해결 않습니다 
전역 어셈블리 캐시 (GAC)와 사용됩니다 참조 어셈블리 대신. 
따라서 어셈블리가 제대로 대상이되지 않을 수 있습니다 에 대한 당신이하고자하는 프레임 워크.

 그리고 마지막으로 기적의 순간을 목격합니다. 프로젝트 파일에 Microsoft.NETFramework.ReferenceAssemblies NuGet 패키지를 추가 :

< 프로젝트 SDK = "Microsoft.NET.Sdk" > 

  < PropertyGroup > 
    < TargetFrameworks > netstandard2.0, net461, net472 </ TargetFrameworks > 
  </ PropertyGroup > 

  <! - 이 참조를 추가 -> 
  < ItemGroup > 
    < PackageReference 포함 = "Microsoft.NETFramework.ReferenceAssemblies" PrivateAssets = "모든" 버전 = "1.0.0-preview.2"  /> 
  </ ItemGroup > 

</ 프로젝트 >

 다시 실행 된   DOTNET 빌드  , 실제로 성공을 건설했다.

빌드 성공했다.
    0 경고 (들)
     0 오류 (들)

사용 PrivateAssets는 종속 프로젝트에 방지의 Microsoft.NETFramework.ReferenceAssemblies 패키지 "누출"또는 게시 NuGet 패키지를 특징으로, 그것은 빌드에만 의존한다.

간단히 모노를 설치하는 것보다 더 나은 경험을 얻을 수있는 프로젝트에 패키지를 추가합니다. 가장 중요한 것은, 이 방법은 .NET 코어 지원을 지금부터가 될 것입니다 . 필요한 경우 그리고는 .NET 코어 3.0 SDK에서 더 얻을 것이다, .NET 핵심 SDK는 자동으로이 패키지를 참조 할 것이다, 그래서 이론적으로, 우리는 수동으로 .NET 프레임 워크 프로젝트를 빌드 할 노드 프로젝트를 추가하는 구성 파일을 편집 할 필요가 없습니다!

메타 패키지, .targets 및 DLL을 많이 : 작동 방식

당신은 작업 패키지에 관심이 있다면, 당신이 읽을 제안 관련 질문 ,하지만 난 여기에 높은 수준의 개요를 제공합니다.

우리는 것이다 Microsoft.NETFramework.ReferenceAssemblies NuGet 패키지 자체가 시작됩니다. 이 패키지에는 코드를 포함하지 않는 메타 패키지입니다,하지만 .NET Framework의 지원되는 버전의 각각에 대해 서로 다른 NuGet 패키지에 의존 :

例如:以 .NET Framework 4.6.1 为目标时将依赖 Microsoft.NETFramework.ReferenceAssemblies.net461。此方法可以确保您只会下载到与目标框架一致的 NuGet 包。

如果你打开一个特定 Framework 的 NuGet 包,你会在 build 文件夹中发现两件事:

  • 一个 .targets 文件
  • 一个 .NETFramework 文件夹,其中包含引用的全部程序集(> 100MB)

.targets 文件与我上一篇文章中的 .props 文件的用途类似 - 它告诉 MSBuild 在哪里可以找到框架库。以下示例来自.NET 4.6.1包: 

<Project>
  <PropertyGroup Condition=" ('$(TargetFrameworkIdentifier)' == '.NETFramework') And ('$(TargetFrameworkVersion)' == 'v4.6.1') ">
    <TargetFrameworkRootPath>$(MSBuildThisFileDirectory)</TargetFrameworkRootPath>

    <!-- FrameworkPathOverride is typically not set to the correct value, and the common targets include mscorlib from FrameworkPathOverride.
         So disable FrameworkPathOverride, set NoStdLib to true, and explicitly reference mscorlib here. -->
    <EnableFrameworkPathOverride>false</EnableFrameworkPathOverride>
    <NoStdLib>true</NoStdLib>
  </PropertyGroup>

  <ItemGroup Condition=" ('$(TargetFrameworkIdentifier)' == '.NETFramework') And ('$(TargetFrameworkVersion)' == 'v4.6.1') ">
    <Reference Include="mscorlib" Pack="false" />
  </ItemGroup>

</Project>

 这会将 TargetFrameworkRootPath 参数设置为包含 .targets 文件的文件夹。MSBuild 遍历 NuGet 包的文件夹结构(.NETFramework \ v4.6.1),找到dll,并找到引用程序集: 

我已经使用.NET Core 2.1 SDK 和 2.2 SDK 测试了这些软件包,并且它的工作时间都非常出色。试试看!

Reference

 

추천

출처www.cnblogs.com/jRoger/p/using-reference-assemblies-to-build-net-framework-libararies-on-linux-without-mono.html