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

https://andrewlock.net/the-net-core-2-0-preview-1-version-numbers-and-global-json/
  • Перевод

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



У этой статьи нет цели — дать введение в 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 теперь также включает 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 Files\dotnet\sdk\2.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 Files\dotnet\shared\Microsoft.NETCore.App (на маках нужно смотреть в папку /usr/local/share/dotnet/shared/Microsoft.NETCore.App). Как видите, на моем компьютере установлено три версии:



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


Всё очень просто: вам нужно указать нужную версию в .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 Files\dotnet\sdk (на маках нужно смотреть в папку /usr/local/share/dotnet/sdk), вы увидите, какие версии SDK установлены на вашем компьютере. Как видите, у меня установлено две версии: 1.0.0 и 2.0.0-preview1-005977.



Грубо говоря, 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. Я надеюсь, что этот пост помог прояснить некоторые из этих вопросов!

Метки:
Поделиться публикацией
Комментарии 13
  • –5
    Вот что выдает у меня команда dotnet info


    Вообще есть ощущение что каждые следующий продукт в семействе .NET и VisualStudio все сырее и сырее, торопятся выпускать, наверное.
    Например, из-за того что штатно перенес на другой диск часть каталогов (рабочий стол, документы, загрузки, AppData), перестали работать: панель задач (не работает всё что по правому клику мыши), не может обновиться VisualStudio 2017, так как захардкожено ищет папку Temp на диске C:.
    Также стали сбоить приложения других производителей. Но разработчикам Microsoft должно быть особенно стыдно допускать такие детские ошибки.
    • +4

      Прошу прощения, я опечатался в статье. Нужно набрать "dotnet --info", а не "dotnet info". Исправлю.

      • +3
        Вообще есть ощущение что каждые следующий продукт в семействе .NET и VisualStudio все сырее и сырее, торопятся выпускать, наверное.

        • .NET Core 2.0 Preview 1 SDK
        • ...Preview(!!!)...



        Например, из-за того что штатно перенес на другой диск часть каталогов...

        Ну с кем не бывает.




        Также стали сбоить приложения других производителей

        Эти вопросы к другим производителям. Не?

        • 0
          Написал как предупреждение скорее, что не стоит так делать.
          • +1

            У меня конфигурация похожая на вашу, из упомянутых папок на диске C: осталась только appdata, и то не вся, остальное уехало на RAM-диск, включая некоторые инстансы самой студии. Проблем не испытываю, студия обновляется, сторонние приложения работают — год-полтора уже как.

      • +1
        спасибо за статью, сам недавно дня два вкуривал в эти версии. А ведь еще есть и preview 2 ветка… Вобщем мрак ))
        Точнее мрак в том, что vs2017 всё же не очень хорошо понимает 2 версию. В билд таргете вообще поле пустое становится, когда в csproj прописываешь 2 версию руками. Сборка вечно ругается на несовместимость с указанным sdk. dotnet restore адекватно работает тока из командной строки. Вобщем до релиза еще походу пилить и пилить.
        Не то чтобы я жалуюсь, всё понятно, разработка в процессе. Но уж очень хочется приобщиться к будущему ))

        Плюс я смог запустить стандартный шаблон mvc сайта на этом самом превью на ARM проце raspberry pi на iot core винде… Это реально круто. Раньше о такой портабельности можно было только мечтать.
        • 0
          А в какой студии вы пробовали превью .NET Core? В статье написано, что стабильная версия с ним работать не умеет и нужно ставить превью VS. Я сам не пробовал ставить (т.к. сижу на маке), но, возможно, превью VS будет нормально работать.
          • 0
            VS тоже превью самый актуальный. Ну щас вроде получше стало, согласен. Я основые проблемы застал незадолго до выхода официального preview 1. Но то что dotnet new и сама студия генерят немного разные шаблоны и после не очень дружат между собой — еще осталось. Или у меня просто уже захламились дистибутивы разных версий сдк ))
            • 0
              Я использовал VS Code, что бы не тащить VS 2017.3.
              Все ок, просто и быстро.
            • 0

              Читайте спецификации, и мрака не будет. .NET Core 2.0 preview 1 на данный момент поддерживается только в VS 2017 Preview version 15.3, которая устанавливается отдельно. Ничего необычного в этом нет, preview на то и preview.

            • 0
              Вы не можете установить параллельно .NET Framework 4.5, 4.6 и 4.7 — версия 4.7 заменит предыдущие версии

              Я что-то путаю или это не вполне соответствует истине? Последующая версия .NET опеделённо заменяет предыдующую, но при этом перекрывает все предыдущие (кроме версии 1.*). Ведь при создании проекта, по крайней мере в Visual Studio, вполне можно выбрать под какой фреймворк его создавать: 2.0, 3.5 и т.д. И будут подключены соответствующие версии библиотек, а недопустимые (неподдерживаемые версией фреймворка) сборки — не будут включены в проект.

              • 0

                Перекрывает, но при этом поведение может слегка меняться. Причем оно бывает существенно даже между 4.5.1 и 4.5.2, был уже нехороший случай конкретно с этими версиями.

                • 0

                  Да, вы правы, у меня неточная формулировка.

                Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.