NuGet 패키지에서 특정 어셈블리 참조

7848 단어 csharpdotnetnuget
이 게시물에서는 NuGet 패키지의 특정 어셈블리를 참조하는 Rider 에 대한 XAML Styler 플러그인을 빌드하는 동안 사용한 약간의 트릭을 설명합니다.

이것이 필요한 이유에 대한 몇 가지 배경 지식부터 시작하여 NuGet 패키지에서 특정 어셈블리를 참조하는 방법을 살펴보겠습니다. 배경에 관심이 없다면 첫 번째 섹션을 건너뛰어도 됩니다.

배경



다른 nerd snipe … A는 Rider에 대한 XAML Styler 플러그인을 빌드하는 것이 얼마나 어려운지 물었고 그래서 작업을 시작했습니다. 플러그인은 XAML 스타일러를 사용하여 프로젝트 또는 솔루션에서 XAML 문서를 다시 포맷할 수 있도록 IDE에 의도를 추가합니다.

아이디어는 다음과 같습니다(작업 중인 플러그인으로 기록됨).



플러그인 프로젝트 설정을 올바르게 가져오는 것은 Rider and ReSharper plugin template 덕분에 상대적으로 간단합니다.

흥미로운 사실은 Rider is powered by .NET Core on macOS and Linux ReSharper 기반 백엔드에서 실행되는 플러그인( architecture )이 .NET Framework 4.6.1을 대상으로 해야 한다는 것입니다.

서식 자체는 XamlStyler.Core 어셈블리를 사용하여 수행할 수 있습니다. 이것은 netstandard2.0 어셈블리이며 XamlStyler.Console 패키지의 일부이기도 합니다.

.NET Framework 4.6.1을 대상으로 하는 플러그인과 XamlStyler.Core를 대상으로 하는 netstandard2.0 어셈블리를 연결하는 것은 .NET 4.6.1이 .NET Standard 2.0을 지원하므로 쉬워야 합니다.

플러그인 작성자인 저에게 문제는 NuGet 패키지가 없다는 것입니다XamlStyler.Core. 어셈블리를 포함하는 XamlStyler.Console 이 있지만 XamlStyler.Console 패키지는 netcoreapp3.1 를 대상으로 합니다. 패키지 참조를 추가하면 빌드 시 다음 메시지가 표시됩니다.

Plugin.csproj : error NU1202: Package XamlStyler.Console 3.2003.9 is not compatible with net461 (.NETFramework,Version=v4.6.1).
Package XamlStyler.Console 3.2003.9 supports: netcoreapp3.1 (.NETCoreApp,Version=v3.1) / any [Plugin.sln]
Plugin.csproj : error NU1212: Invalid project-package combination for XamlStyler.Console 3.2003.9. DotnetToolReference project style can only contain references of the DotnetTool type [Plugin.sln]
  Restore failed in 572,8 ms for Plugin.csproj.


XamlStyler.Console는 "도구 패키지"(명령줄용)이기도 하므로 직접 참조할 수 없습니다. 그러나 지금은 그 사실을 무시합시다.

NuGet Package Explorer 을 사용하는 패키지를 보면 XamlStyler.Core 어셈블리가 있고 올바른 대상 프레임워크가 있음을 알 수 있습니다.



해당 어셈블리만 참조할 수 있습니까? 우리는 할 수 있습니다!

NuGet 패키지에서 특정 어셈블리를 참조하는 방법



NuGet documentation on PackageReference 에 흥미로운 섹션이 있습니다.

Sometimes it is desirable to reference files in a package from an MSBuild target. In packages.config based projects, the packages are installed in a folder relative to the project file. However in PackageReference, the packages are consumed from the global-packages folder, which can vary from machine to machine.

To bridge that gap, NuGet introduced a property that points to the location from which the package will be consumed.



즉, GeneratePathProperty="true" 파일의 PackageReference 요소에 .csproj 속성을 추가하면 $(PkgPackage_Id) 변수를 사용하여 해당 패키지 참조의 경로에 액세스할 수 있습니다. 여기서 Package_Id는 패키지 ID입니다. , 여기서 점은 밑줄로 대체됨).

또한 복원 시 패키지에 어떤 일이 발생하는지 조정할 수 있습니다. 우리는 할 수 있고control the asset behaviour 본질적으로 NuGet에게 패키지를 복원하라고 지시하지만 패키지를 전혀 참조하지 않습니다. 이러한 특성을 PackageReference 요소에 추가하면 다음과 같이 됩니다. 패키지가 다운로드되고 참조되지 않도록 합니다.

IncludeAssets="None" ExcludeAssets="All" PrivateAssets="None"



거의 완료 이제 디스크에 NuGet 패키지에 대한 경로가 있으며 패키지 참조를 추가하지 않습니다. 어셈블리 참조는 XamlStyler.Core 어셈블리에 대한 참조를 추가하여 믹스에 추가할 마지막 항목입니다.

<Reference Include="XamlStyler.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=0b11ff60a8153268">
    <HintPath>$(PkgXamlStyler_Console)\tools\netcoreapp3.1\any\XamlStyler.Core.dll</HintPath>
</Reference>



어셈블리 힌트 경로를 $(PkgXamlStyler_Console) 로 설정하고 그 뒤에 NuGet 패키지의 어셈블리 파일에 대한 경로를 설정하면 어셈블리를 직접 참조할 수 있습니다!

여기에 도착하여 .csproj 파일에 추가할 수 있는 전체 스니펫을 원하는 사람들을 위해: 여기 있습니다!

<ItemGroup>
    <!--
        XAML Styler Console package targets netcoreapp3.x - we can't reference it, but we can download it :-)
        GeneratePathProperty will make the path to the package available in $(PkgXamlStyler_Console), and we can then add an assembly reference...
        https://docs.microsoft.com/en-us/nuget/consume-packages/package-references-in-project-files#generatepathproperty
    -->
    <PackageReference Include="XamlStyler.Console" Version="3.2003.9" IncludeAssets="None" ExcludeAssets="All" PrivateAssets="None" GeneratePathProperty="true" />
</ItemGroup>

<ItemGroup>
    <Reference Include="XamlStyler.Core, Version=1.0.0.0, Culture=neutral, PublicKeyToken=0b11ff60a8153268">
        <HintPath>$(PkgXamlStyler_Console)\tools\netcoreapp3.1\any\XamlStyler.Core.dll</HintPath>
    </Reference>
</ItemGroup>



이 트릭은 적절한 NuGet 사용의 가장자리에 있을 수 있으므로 주의해서 사용하십시오. 그러나 다른 어셈블리를 무시하고 NuGet 패키지에서 어셈블리를 직접 참조해야 하는 경우에는 이것이 잘 작동하는 솔루션입니다.

살펴볼 수 있는 또 다른 항목은 GitHub에서 패키지, 어셈블리 및 파일을 참조하기 위한 여러 옵션이 있는 Paket 입니다.

좋은 웹페이지 즐겨찾기