Пакет Nuget с собственными библиотеками для типов проектов SDK и не-SDK, а также с поддержкой многоцелевого назначения (net452, netstandard20, netstandard21).

У меня есть пакет NuGet, который поддерживает 3 разных TF и должен быть доступен для потребителей (приложений) в файлах Non-sdk (старый формат csproj) и Sdk (новый) csproj. Мой самородок также содержит native библиотек для Windows, Linux и mac os.

Единственная проблема у меня связана с обработкой нативных библиотек. Я настраиваю его таким образом (также есть аналогичные шаги, которые охватывают не-Windows OSs):

<!--IsWindows is defined in the first steps-->

<ItemGroup Condition=" '$(IsWindows)' == 'true' ">
  <Content Include="$(MyLibrariesPathInTheSolution)/nativeWindowsLibrary.dll">
    <Pack>true</Pack>
    <PackagePath>runtimes/win/native</PackagePath>
  </Content>
</ItemGroup>

<ItemGroup Condition=" '$(IsWindows)' == 'true' ">
  <Content Include="$(MyLibrariesPathInTheSolution)/nativeWindowsLibrary.dll">
    <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    <Link>nativeWindowsLibrary.dll</Link>
  </Content>
</ItemGroup>

приведенная выше конфигурация хорошо работает для проектов sdk, но не распространяется на проекты non-sdk. Итак, я добавил еще один шаг в основной csproj:

<ItemGroup Condition=" '$(IsWindows)' == 'true' ">
  <Content Include="MyApp.targets">
    <Pack>true</Pack>
    <PackagePath>build</PackagePath>
  </Content>
</ItemGroup>

где MyApp.targets выглядит так:

<?xml version="1.0" encoding="utf-8"?>

<!--IsWindows is also defined here, skipped this definition just to reduce the number of lines-->

<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">   
  <ItemGroup Condition=" '$(IsWindows)' == 'true' ">
    <Content Include="$(MSBuildThisFileDirectory)../runtimes/win/native/nativeWindowsLibrary.dll">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
      <Link>nativeWindowsLibrary.dll</Link>
    </Content>
  </ItemGroup>
</Project>

вышеприведенное устраняет проблему потребителя, связанную с non-sdk проектами, но вызывает проблему, если потребитель использует xamarin + mac OS, потому что эта платформа пытается обработать nativeWindowsLibrary.dll (библиотека MacOS-built также обрабатывается, но ожидается, в отличие от Windows-built) во время сборки, даже если есть условие на OS = Windows (в данном случае это false).

Итак, мой главный вопрос: есть ли какое-либо руководство (пример) о том, как создать пакет NuGet для приведенного выше случая, когда нам нужно поддерживать:

  • csproj-файлы, отличные от SDK и SDK
  • разные целевые фреймворки
  • библиотеки, связанные с платформой (которые находятся в runtimes)

Кроме того, есть ли какие-либо предложения по поводу предоставленной конфигурации?


person dododo    schedule 22.12.2020    source источник


Ответы (1)


это ошибка в xamarin https://github.com/xamarin/xamarin-macios/issues/10337, связанные с проблемой mono msbuild https://github.com/mono/mono/issues/15569

person dododo    schedule 10.02.2021