Управление пакетами nuget с помощью PackageReferences при объединении .Net Framework+Standard+Core

Вопрос:

Как управлять пакетами nuget в решении VisualStudio2017 с 3 платформами:

  • .Net Стандарт 1.3
  • .NET Framework 4.6
  • .Net Core 1.0

?

Мне нравится подход PackageReference, но я не знаю, как его использовать. Они говорят о:

<ItemGroup>
    <!-- ... -->
    <PackageReference Include="Contoso.Utility.UsefulStuff" Version="3.6.0" />
    <!-- ... -->
</ItemGroup>
  • Означает ли это, что в целом мне нужно как минимум 3 PackageReferences для каждого из Framework/Standard/Core?
  • Как управлять версиями, когда мы застряли на .Net Framework 4.6?
  • Я также столкнулся с проблемой, когда не мог запустить консольное .net core приложение, ссылающееся на .net standard библиотеку, из-за проблемы совместимости версий nuget.

Кроме того, я хотел бы упомянуть, что я наткнулся на пару статей, в которых говорилось, что .csproj вернулись и .xproj, project.json не нужны. Лично мне нравится эта идея, чтобы иметь дело с .csprojs, как раньше.


Контекст:

Я не являюсь носителем английского языка, и я новичок в нетривиальном использовании nuget и разработке .Net Core/Standard.

Я готовлюсь перенести приложение .Net Framework на .Net Framework+Standard+Core. Теперь это просто приложение WPF. Но в будущем предполагается, что оно останется тем же приложением WPF, но также будет иметь новую ветвь .Net Core, основанную на существующей логике. Я точно не знаю, какие планы на возможную новую ветку .Net Core. Скорее всего, в планах создание сайта ASP.Net Core. Что я знаю точно, так это то, что задача состоит в том, чтобы поддерживать работу логики как .Net Framework (с пользовательским интерфейсом WPF), а также реализовывать ее как .Net Core.

Я решил использовать комбинацию Framework+Standard+Core в качестве решения из-за ее простоты. Я имею в виду, что концепция проста для понимания: базовые классы (стандартные), используемые двумя подразделениями (FWK, Core). Нет необходимости в мутитаргетинге или директивах в коде (условная компиляция). Подразумевается, что новое решение должно быть создано с нуля путем копирования и изменения. До сих пор не уверен на 100% в разумности этого решения.

Но вопрос подразумевает, что именно этот подход должен быть выбран: Framework+Standard+Core.


Я надеюсь, что этот вопрос разумен; я имею в виду, что эффективное управление пакетами nuget в таком случае является хорошим началом для успешного кроссплатформенного проекта. Спасибо!


person Andrey K.    schedule 20.07.2018    source источник
comment
Если вы застряли на .NET Framework 4.6, создайте многоцелевую базовую библиотеку для net46 и netstandard20. Нет смысла нацеливаться на netstandard13, так как API там очень ограничен, и вам не нужно поддерживать устаревшие платформы, такие как WP или Silverlight. Проведите свои эксперименты с PackageReference, и вам даже не нужно будет задавать первые вопросы. В чем именно заключается проблема. Я также столкнулся с проблемой, когда не смог запустить консольное приложение .net core, ссылающееся на стандартную библиотеку .net, из-за проблемы совместимости версий nuget?   -  person Lex Li    schedule 20.07.2018
comment
@LexLi это не бессмысленно - просто обычно это бесполезно, если вы не пытаетесь активно нацеливаться на некоторые фреймворки более низкого уровня, такие как Windows Phone.   -  person Marc Gravell    schedule 20.07.2018
comment
@LexLi, большое спасибо! вероятно, это хорошая идея сделать мультитаргетинг. Что касается проблемы совместимости версий: я не смог запустить консольное приложение netcore1.0, ссылающееся на библиотеку netstandard1.3, в vs17 (см. следующий комментарий). Спасибо!   -  person Andrey K.    schedule 20.07.2018
comment
@LexLi, вывод: программа «[12780] dotnet.exe» завершила работу с кодом -2147450751 (0x80008081). Программа «[1996] iisexpress.exe» завершилась с кодом 0 (0x0).   -  person Andrey K.    schedule 20.07.2018


Ответы (1)


Примечание. Я предполагаю, что вы используете здесь новый формат SDK csproj и что-то вроде:

<TargetFrameworks>netstandard1.3;net46;netcoreap1.0</TargetFrameworks>

Если вещь, на которую вы ссылаетесь, существует и нацелена на те же платформы, что и ваш проект, она должна просто работать. Однако, если вы на самом деле не делаете что-то другое в Framework, Standard и Core, вы можете просто ориентироваться на Standard, и на самом деле: многие библиотеки теперь перебазируются против netstandard2.0 как минимум. Это может быть или не быть возможным для вас.

Версии не работают по-другому на 4.6, если нет проблем с определенными пакетами, но: вы можете обойти это, используя атрибуты Condition для <ItemGroup> или для определенных элементов <PackageReference>. Например, у меня есть библиотека, предназначенная для net461 и netstandard2.0; и так получилось, что все, что я использую, уже встроено в net461, поэтому, чтобы избежать каких-либо подчиненных зависимостей, я могу сделать:

  <ItemGroup Condition="'$(TargetFramework)'=='net461'">
    <Reference Include="Microsoft.CSharp" />
  </ItemGroup>
  <ItemGroup Condition="'$(TargetFramework)'!='net461'">
    <PackageReference Include="System.Data.Common" Version="4.3.0" />
    <PackageReference Include="System.Reflection" Version="4.3.0" />
    <PackageReference Include="System.Reflection.Emit" Version="4.3.0" />
    <PackageReference Include="System.Reflection.Emit.ILGeneration" Version="4.3.0" />
    <PackageReference Include="System.Reflection.Emit.Lightweight" Version="4.3.0" />
    <PackageReference Include="Microsoft.CSharp" Version="4.5.0" />
    <PackageReference Include="System.Security.Permissions" Version="4.5.0" />
  </ItemGroup>

Это дает мне (в nuget):

введите здесь описание изображения

Однако; Я мог бы оставить все как есть:

  <ItemGroup>
    <PackageReference Include="System.Data.Common" Version="4.3.0" />
    <PackageReference Include="System.Reflection" Version="4.3.0" />
    <PackageReference Include="System.Reflection.Emit" Version="4.3.0" />
    <PackageReference Include="System.Reflection.Emit.ILGeneration" Version="4.3.0" />
    <PackageReference Include="System.Reflection.Emit.Lightweight" Version="4.3.0" />
    <PackageReference Include="Microsoft.CSharp" Version="4.5.0" />
    <PackageReference Include="System.Security.Permissions" Version="4.5.0" />
  </ItemGroup>

и это сработало бы нормально - просто: цель net461 будет перечислять зависимости. Я также мог бы перечислить совершенно разные зависимости для каждой целевой платформы.

person Marc Gravell    schedule 20.07.2018