.NET Core: номера версий и global.json

в 18:24, , рубрики: .net, .net core, C#, microsoft

Уверен, большинство людей, читающих это, знают, что Microsoft недавно анонсировала ASP.NET Core и .NET Core 2.0 Preview 1 на Microsoft Build 2017.

.NET Core: номера версий и global.json - 1

У этой статьи нет цели — дать введение в ASP.NET Core. Вместо этого мы рассмотрим установку .NET Core 2.0 Preview 1 на ваш компьютер таким образом, чтобы это не мешало параллельно работать над другими проектами под ASP.NET Core 1.0/1.1. Т.е. мы установим несколько версий .NET Core на одном компьютере.

Установка .NET Core 2.0 Preview 1 SDK

Очевидно, первое, что нужно сделать — установить .NET Core 2.0 Preview 1 SDK отсюда. Это очень легко: никакого выбора вариантов установки — просто скачиваете и устанавливаете. И там только один номер версии!

.NET Core: номера версий и global.json - 2

Одно небольшое замечание: .NET Core теперь также включает ASP.NET Core. Это значит, что вам нужно устанавливать меньше внешних пакетов, когда вы разворачиваете свое приложение, что не может не радовать!

Стоит также отметить, что, если вы хотите создавать приложения ASP.NET Core 2.0 в Visual Studio, вам нужно будет установить предварительную версию Visual Studio 2017. Её можно устанавливать параллельно со стабильной версией.

Версии .NET Core

Выше я написал, что новый .NET Core имеет только один номер версии 2.0 preview 1, но это не совсем так. Есть два разных аспекта установки .NET Core: номер версии SDK/CLI (command line interface) и номер версии runtime (среды исполнения или .NET Core Shared Framework Host).

Если вы только-что установили 2.0 preview 1, то, если наберете в консоли dotnet --info, увидите примерно следующее:

$ dotnet --info
.NET Command Line Tools (2.0.0-preview1-005977)

Product Information:  
 Version:            2.0.0-preview1-005977
 Commit SHA-1 hash:  414cab8a0b

Runtime Environment:  
 OS Name:     Windows
 OS Version:  10.0.14393
 OS Platform: Windows
 RID:         win10-x64
 Base Path:   C:Program Filesdotnetsdk2.0.0-preview1-005977

Microsoft .NET Core Shared Framework Host

  Version  : 2.0.0-preview1-002111-00
  Build    : 1ff021936263d492539399688f46fd3827169983

Там целая куча разной информации, среди которой есть два разных номера версий:

  • 2.0.0-preview1-005977 — версия SDK
  • 2.0.0-preview1-002111-00 — версия среды исполнения

Но эти номера версий немного вводят в заблуждение. У меня на компьютере установлены также .NET Core SDK версии 1.0 и .NET Core Runtime версии 1.1.1 и 1.0.4, но здесь нет никакой информации о инх.

Понимание версий .NET Core runtime

Одно из преимуществ .NET Core заключается в возможности установи параллельно нескольких версий среды исполнения параллельно, без влияния их друг на друга. Это отличается от того, как происходит установка .NET Framework. Вы не можете установить параллельно .NET Framework 4.5, 4.6 и 4.7 — версия 4.7 заменит предыдущие версии.

Вы можете увидеть, какие версии среды исполнения .NET Core уже установлены, если зайдете в папку C:Program FilesdotnetsharedMicrosoft.NETCore.App (на маках нужно смотреть в папку /usr/local/share/dotnet/shared/Microsoft.NETCore.App). Как видите, на моем компьютере установлено три версии:

.NET Core: номера версий и global.json - 3

Следующий вопрос — как узнать, какая версия среды исполнения будет использоваться, когда вы запускаете свое приложение?

Всё очень просто: вам нужно указать нужную версию в .csproj файле!

Например, в проекте .NET Core 1.1 вы можете установить параметр <TargetFramework> (или <TargetFrameworks>, если вы собираете проект под несколько разных версий) в значение netcoreapp1.1:

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

  <PropertyGroup>
    <TargetFramework>netcoreapp1.1</TargetFramework>
  </PropertyGroup>

</Project>

В этом случае приложение будет использовать .NET Core версии 1.1.1 (см. выше список установленных версий). Если вы установите <TargetFramework> в значение netcoreapp1.0, то будет использоваться версия 1.0.4.

Файл .csproj: для ASP.NET приложения, использующего runtime версии 2.0 preview 1 будет выглядеть примерно так:

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

  <PropertyGroup>
    <TargetFramework>netcoreapp2.0</TargetFramework>
    <UserSecretsId>aspnet-v2test-32250BD7-D335-414A-A537-53B40874D211</UserSecretsId>
  </PropertyGroup>

  <ItemGroup>
    <Folder Include="wwwroot" />
  </ItemGroup>

  <ItemGroup>
    <PackageReference Include="Microsoft.AspNetCore.All" Version="2.0.0-preview1-final" />
  </ItemGroup>

</Project>  

В файле .csproj указано для <TargetFramework> значение netcoreapp2.0 и будет использована максимальная соответствующая ему версия (на моем компьютере — это 2.0.0-preview1-002111-00).

Понимание версий SDK

Надеюсь, теперь вы всё понимаете про версии среды исполнения .NET Core. Но у нас всё еще остается открытым вопрос про версии SDK/CLI.

Если вы перейдете в папку C:Program Filesdotnetsdk (на маках нужно смотреть в папку /usr/local/share/dotnet/sdk), вы увидите, какие версии SDK установлены на вашем компьютере. Как видите, у меня установлено две версии: 1.0.0 и 2.0.0-preview1-005977.

.NET Core: номера версий и global.json - 4

Грубо говоря, SDK — это штука, которая предоставляет команды, связанные со сборкой: dotnet new, dotnet build, dotnet publish и т.п.

В общем случае, любая версия SDK, которая больше версии, использованной при создании проекта, может быть использована для его сборки (dotnet build и dotnet publish). Таким образом, вы можете просто использовать SDK версии 2.0 для работы с проектами, созданными в SDK версии 1.0.

Это значит, что в большинстве случаев вы можете использовать для всех проектов последнюю версию SDK. Другая версия SDK может понадобиться, например, если вы хотите собрать проект, использующий файл project.json (в этом случае вам будет нужен RC2 SDK).

Текущая версия SDK также влияет на новые проекты, создаваемые командой dotnet new. Если вы используете SDK версии 2.0 Preview 1, вы получите приложение на основе netcoreapp2.0, если вы используете SDK версии 1.0, вы получите приложение на основе netcoreapp1.1!

Следующий вопрос — как указать приложению, какую версию SDK нужно использовать.

Выбор версии SDK в файле global.json

Файл global.json имеет очень простой формат, который просто задает, какую версию SDK нужно использовать:

{
  "sdk": {
    "version": "1.0.0"
  }
}

Раньше файл global.json использовался еще и для того, чтобы указать папки с исходным кодом решения, но эта функциональность будет удалена в будущих версиях.

Когда вы запускаете dotnet new или dotnet build, dotnet ищет global.json, сначала в текущей папке, потом во всех родительских папках. Если global.json найден (и доступна версия SDK, указанная там!), то эта версия будет использована для всех запускаемых команд SDK внутри этой папки. Если не получилось найти ни один файл global.json, будет использована последняя доступная версия SDK, в моем случае, 2.0.0-preview1-005977.

Лично я поместил вышеуказанный global.json в свою папку Projects и поэтому все существующие проекты, которые в ней находятся, будут продолжать использовать SDK 1.0.0 (а также все новые проекты, которые я там создаю). Затем я создал подпапку netcore20 и добавил следующий global.json. В ней я размещаю все проекты, в которых хочу "поиграть" с предварительной версией ASP.NET Core 2.0, не рискуя получить проблемы из-за этого!

{
  "sdk": {
    "version": "2.0.0-preview1-005977"
  }
}

Заключение

Версионирование было одной из проблем .NET Core до недавнего времени. Выравнивание всех версий в будущем, безусловно, упростит ситуацию и, как мы надеемся, это будет вызывать меньше путаницы. Но по-прежнему стоит попытаться понять разницу между версиями среды выполнения и версиями SDK. Я надеюсь, что этот пост помог прояснить некоторые из этих вопросов!

Автор: dima117

Источник


* - обязательные к заполнению поля


https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js