Переупаковка сторонних библиотек в пакет NuGet - PullRequest
1 голос
/ 08 февраля 2020

Я использую стороннюю библиотеку, которая поддерживает. NET Core, но не. NET Standard. Они предоставляют отдельные двоичные SDK для каждой платформы, которую они поддерживают; win-x86, linux -x64 и др. c. Для каждой платформы есть CoolSdkDotNetCore.dll и coolsdk.dll / so / dylib. * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * * *

* * * * * * * Файлы CoolSdkDotNetCore.dll действительно различны для каждой платформы - все они одинакового размера, но имеют разные хэши SHA.

*1003*. * использование идентификаторов времени выполнения, чтобы получить нужные данные для данной платформы, чтобы я мог строить для Windows, docker и т. д. c без необходимости обмениваться двоичными файлами. У меня есть файл проекта, такой как:
<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
    <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
    <PackageId>CoolSdk.NetStandard</PackageId>
    <Version>1.2.3</Version>
    <RootNamespace>coolsdk</RootNamespace>
    <AssemblyName>coolsdk</AssemblyName>
  </PropertyGroup>

  <ItemGroup>

    <None Pack="true" PackagePath="runtimes/win-x64/native/coolsdk.dll" Update="windows/x64/coolsdk.dll">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </None>
    <None Pack="true" PackagePath="runtimes/win-x64/lib/netcore/CoolSdkDotNetCore.dll" Update="windows/x64/CoolSdkDotNetCore.dll">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </None>

    <None Pack="true" PackagePath="runtimes/linux-x64/native/libcoolsdk.so" Update="linux/x64/libcoolsdk.so">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </None>
    <None Pack="true" PackagePath="runtimes/linux-x64/lib/netcore/CoolSdkDotNetCore.dll" Update="linux/x64/CoolSdkDotNetCore.dll">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </None>

  </ItemGroup>

</Project>

. Это создает .nupkg, который, кажется, имеет все, что мне нужно, но проекты-потребители на самом деле не получают ссылку на сборку CoolSdkDotNetCore. В папке bin я вижу папку времени выполнения с компонентами native, но без папок lib (папки lib определенно присутствуют в самом nupkg).

Что мне здесь не хватает? Нужно ли мне go вернуться назад и написать nuspec самостоятельно, вместо того, чтобы пытаться использовать csproj, чтобы сгенерировать все это для меня, или есть какой-то другой прием, который я могу использовать?


edit:

Изменение указанных выше путей к библиотекам с runtimes/<rid>/lib/netcore на runtimes/<rid>/netcoreapp позволяет копировать папки lib в папку bin в потребляющем проекте, но я все еще не могу ссылаться на сборку. Добавление ссылки к CoolSdkDotNetCore вручную, например:

<Reference Include="CoolSdkDotNetCore">
  <HintPath>CoolSdkDotNetCore.dll</HintPath>
</Reference>

Генерирует MSB3245 - Could not resolve this reference....

1 Ответ

0 голосов
/ 10 февраля 2020

Ответ заключается в том, чтобы включить одну копию. NET Базовая сборка в качестве "ref". Какой из них на самом деле не имеет значения - эта сборка никогда не будет запущена, только загружается IDE и во время компиляции. Во время выполнения правильная сборка будет загружена из папки runtimes. В заключение, Nuget не будет упаковывать один и тот же файл дважды; если у вас есть два или более элементов в группе элементов с одинаковым значением для клавиши Update, к последнему .nupkg будет добавлен только последний. Таким образом, выбирая наугад, я сделал копию Windows / x64 DLL в root моего проекта и обновил свой csproj таким образом:

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <TargetFramework>netstandard2.0</TargetFramework>
    <GeneratePackageOnBuild>true</GeneratePackageOnBuild>
    <PackageId>CoolSdk.NetStandard</PackageId>
    <Version>1.2.3</Version>
    <RootNamespace>coolsdk</RootNamespace>
    <AssemblyName>coolsdk</AssemblyName>
    <IncludeBuildOutput>false</IncludeBuildOutput>
  </PropertyGroup>

  <ItemGroup>
    <None Pack="true" PackagePath="ref/netcoreapp2.1/CoolSdkDotNetCore.dll" Update="CoolSdkDotNetCore.dll">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </None>

    <None Pack="true" PackagePath="runtimes/win-x64/native/coolsdk.dll" Update="windows/x64/coolsdk.dll">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </None>
    <None Pack="true" PackagePath="runtimes/win-x64/lib/netcore/CoolSdkDotNetCore.dll" Update="windows/x64/CoolSdkDotNetCore.dll">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </None>

    <None Pack="true" PackagePath="runtimes/linux-x64/native/libcoolsdk.so" Update="linux/x64/libcoolsdk.so">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </None>
    <None Pack="true" PackagePath="runtimes/linux-x64/lib/netcore/CoolSdkDotNetCore.dll" Update="linux/x64/CoolSdkDotNetCore.dll">
      <CopyToOutputDirectory>Always</CopyToOutputDirectory>
    </None>

  </ItemGroup>

</Project>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...