Создайте пакет NuGet на Linux, который targets.NET каркас

Я хочу создать пакет NuGet, который может одновременно и явно нацеливаться и .NET Framework 4.6.2 и .Net Standard 1.5. Вот сокращенное .файл csproj от VS 2017:

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

  <PropertyGroup>
    <TargetFrameworks>net462;netstandard1.5</TargetFrameworks>
    ...
  </PropertyGroup>

</Project>

когда я выполняю команды сборки и пакета dotnet с моей локальной машины Windows, пакет NuGet создается отлично, как и ожидалось.

, когда я пытаюсь выполнить те же команды dotnet в Linux, я получаю следующее ошибка:

/ opt/dotnet/sdk/1.0.4 / Microsoft.Общий.CurrentVersion будет.целевые показатели(1111,5): ошибка MSB3644: ссылочные сборки для framework ".NETFramework, версия=v4.6.2" не найдены. Для решения этой, установите SDK или пакет таргетинга для этой версии платформы или перенастройка приложения на версию фреймворка, для которой вы установите пакет SDK или Targeting Pack. Обратите внимание, что сборки будут будет разрешен из глобального кэша сборок (GAC) и будет быть использованы в место сборки. Поэтому ваше собрание не может быть правильно нацелены на рамки, которые вы намереваетесь.

затем меня осенило, что в Linux-боксе нет обычных сборок .NET Framework (не говоря уже . Таким образом, похоже, что я не смогу использовать Linux для создания пакета NuGet. Я искал "пакет таргетинга", но он доступен только для Windows.

рискуя показаться наивным, кто-нибудь успешно создание пакетов NuGet в Linux, которые могут быть нацелены на .NET Framework?

1 ответов


дистрибутив .NET CLI не содержит никаких ссылочных сборок для .NET Framework, поэтому его версия MSBuild не может разрешить необходимые ресурсы времени компиляции. Этот сценарий отслеживается на GitHub хотя и работал до миграции в MSBuild (CLI мог использовать ссылочные сборки mono).

есть несколько альтернатив, хотя это может быть использовано для создания вашей библиотеки на машинах, отличных от windows:

1. Используйте mono 5+ к построить библиотеку.

это, вероятно, самый стабильный путь.

Mono 5 и выше содержит необходимую логику сборки для создания приложений .NET Standar и .NET Core. В linux msbuild mono может потребоваться установить как отдельный пакет. Поэтому вместо следующих часто используемых команд

dotnet restore
dotnet build
dotnet publish -c Release

вы бы использовали msbuild mono, чтобы сделать следующее:

msbuild /t:Restore
msbuild
msbuild /t:Publish /p:Configuration=Release

обходной путь пакета для mono

единственное ограничение заключается в том, что mono (обходной путь с использованием NuGet.Build.Tasks.Pack пакета NuGet в проекте, который позволяет делать msbuild /t:Pack /p:Configuration=Release изменить файл проекта, как это (особенно обратите внимание на удалены на <Project> элемент):

<Project>
  <PropertyGroup>
    <NuGetBuildTasksPackTargets>junk-value-to-avoid-conflicts</NuGetBuildTasksPackTargets>
  </PropertyGroup>
  <Import Project="Sdk.props" Sdk="Microsoft.NET.Sdk" />

  <!-- All your project's other content here -->

  <ItemGroup>
    <PackageReference Include="NuGet.Build.Tasks.Pack" Version="4.0.0" PrivateAssets="All" />
  </ItemGroup>
  <Import Project="Sdk.targets" Sdk="Microsoft.NET.Sdk" />
</Project>

2. Используйте .NET CLI и скажите MSBuild использовать ссылку mono сборки.

при строительстве для net* целевые рамки, вы можете установить FrameworkPathOverride свойство как переменная среды, так и свойство в файле csproj. Он должен указывать на набор ссылочных сборок-здесь можно использовать ссылочные сборки mono. Но некоторые содержат специальный файл (redist list), содержащий ссылки на другие каталоги, которые версия MSBuild в .NET CLI не может следовать. Это работает во многих сценариях хотя:

export FrameworkPathOverride=/usr/lib/mono/4.5/
dotnet build -f net45

это было использовано и задокументировано командой F#.

3. Используйте пакет NuGet, содержащий ссылочные сборки.

в некоторых лентах MyGet Корпорация Майкрософт публикует пакеты NuGet, содержащие ссылочные сборки. Они не публикуются или "официальные", хотя этот процесс может потерпеть неудачу в какой-то момент времени. Однако они делают план расследования делает этот путь официальным.

первый создать NuGet для.Файл конфигурации в каталоге вашего решения со следующим содержимым для добавления фида:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
 <packageSources>
    <add key="dotnet-core" value="https://dotnet.myget.org/F/dotnet-core/api/v3/index.json" />
 </packageSources>
</configuration>

затем вы можете добавить группу элементов, чтобы добавить PackageReference в пакет таргетинга и PropertyGroup прописать путь к сборки такой:

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

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFrameworks>netcoreapp1.1;net461</TargetFrameworks>
  </PropertyGroup>

  <PropertyGroup Condition=" '$(TargetFramework)' == 'net461' ">
    <RuntimeIdentifier>win7-x64</RuntimeIdentifier>
    <FrameworkPathOverride>$(NuGetPackageFolders)microsoft.targetingpack.netframework.v4.6.1.0.1\lib\net461\</FrameworkPathOverride>
  </PropertyGroup>

  <ItemGroup Condition=" '$(TargetFramework)' == 'net461' ">
    <PackageReference Include="Microsoft.TargetingPack.NETFramework.v4.6.1" Version="1.0.1" ExcludeAssets="All" PrivateAssets="All" />
  </ItemGroup>

</Project>

вы можете изменить RuntimeIdentifier для разных платформ, если вы используете собственные ресурсы (например, чтобы получить .so файлы для linux) или полностью удалить его при создании библиотек.