NuGet 패키지에서 특정 어셈블리 참조
이것이 필요한 이유에 대한 몇 가지 배경 지식부터 시작하여 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 입니다.
Reference
이 문제에 관하여(NuGet 패키지에서 특정 어셈블리 참조), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://dev.to/maartenba/referencing-a-specific-assembly-from-a-nuget-package-43dl텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)