У меня есть пакет NuGet, который поддерживает 3 разных TF
и должен быть доступен для потребителей (приложений) в файлах Non-sdk
(старый формат csproj
) и Sdk
(новый) csproj
. Мой самородок также содержит native
библиотек для Windows, Linux и mac os.
Единственная проблема у меня связана с обработкой нативных библиотек. Я настраиваю его таким образом (также есть аналогичные шаги, которые охватывают не-Windows OS
s):
<!--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
)
Кроме того, есть ли какие-либо предложения по поводу предоставленной конфигурации?