ASP.NET Core: ваше первое приложение на Linux c использованием Visual Studio Code

Решил недавно написать небольшое ASP.Net MVC приложение после многолетнего перерыва и знающие люди на Хабре подсказали попробовать новый ASP.Net Core, тем более, что он работает в Линуксе из коробки без необходимости задействовать mono, и, судя по последним тестам, даже показывает неплохую производительность. За основу взял аналогичную статью для Mac, однако здесь в отличии от вдохновившей меня статьи хочу описать процесс пошагово в одном месте, для того, чтобы не пришлось лазить по перекрёстным ссылкам, пытаясь разобраться как установить непонятно для чего предназначенные приложения и пакеты. Такое подробное описание процесса возможно поможет многим избежать граблей, с которыми пришлось столкнуться мне. Несколько фраз и рисунков, в части одинаковой для любой платформы, с правками и корректировками взяты из статьи для Mac.


Установка .Net Core и Visual Studio Code


Приводимые здесь команды установки подходят для дистрибутивов Ubuntu 16.04/Mint 18.x, для остальных можно найти здесь.

Установка .Net Core:


Устанавливаем новейший на данный момент RC4 для совместимости с новейшим генератором проектов aspnet:
sudo sh -c 'echo "deb [arch=amd64] https://apt-mo.trafficmanager.net/repos/dotnet-release/ xenial main" > /etc/apt/sources.list.d/dotnetdev.list'
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 417A0893
sudo apt-get update
sudo apt install dotnet-dev-1.0.0-rc4-004771


Установка Visual Studio Code


Устанавливается легко в пару кликов по этой ссылке.

Установка расширения C#


Запускаем Visual Studio Code, нажимаем Ctrl-P, вводим команду:
ext install csharp

В появившейся слева панели нажимаем «Установить» напротив соответствующего расширения, если это не произошло автоматически. Visual Studio Code можно пока закрыть.

Подготовка среды разработки и формирование шаблонов приложений


Устанавливаем новейший node.js с оригинального сайта (тот, что идёт с дистрибутивом не подходит), он нам нужен из-за менеджера пакетов npm, который идёт вместе с ним:
curl -sL https://deb.nodesource.com/setup_7.x | sudo -E bash -
sudo apt-get install -y nodejs
sudo apt-get install -y build-essential
Для других дистрибутивов инструкция здесь.

Инициализация проекта


Для инициализации используется скаффолдер Yeoman — инициализатор проекта, включающий в себя развёртывание файловой структуры и генерацию шаблона проекта, т.е. исходного кода приложения. Включает в себя скаффолдер Yo, менеджер пакетов Bower и менеджер задач Grunt. При установке Yo вам будут установлены также Bower и Grunt. Здесь устанавливаем в любом терминале также новейший генератор aspnet, в котором возвращена система сборки msbuild вместо project.json:
sudo npm install -g yo bower generator-aspnet

Запуск генератора проекта


Генератор Yeoman — это npm-пакет с инструкциями и шаблонами для Yo, которые описывают инициализацию проекта: какие директории создать, какие файлы и куда копировать, каким образом обрабатывать шаблоны и куда их разместить после обработки. Заходим в папку, где мы хотим разместить проект и запускаем генератор проекта ASP.NET Core:
yo aspnet
  • Выбираем пункт Web Application Basic [without Membership and Authorization] и нажимаем Enter
  • Выбираем Bootstrap (3.3.6) в качестве фреймворка UI и нажимаем Enter
  • Оставляем имя «WebApplicationBasic» в качестве имени приложения и нажимаем Enter
Примечание: При выборе пункта WebApplication будет создан шаблон приложения с авторизацией клиентов, где в качестве БД может использоваться SQLite (генератор выдаст соответствующие инструкции как это сделать). Если же вы захотите в качестве базы использовать что-нибудь покруче, то можно добавить поддержку PostgreSQL:
  • Установка: npm install -g generator-aspnetpostgresql
  • Генерация шаблона: yo aspnetpostgresql
Данный генератор основан на том же самом OmniSharp/generator-aspnet. Версия несколько устарела, поэтому для запуска нужно сначала выполнить dotnet migrate & dotnet restore — именно в таком порядке.

Когда генератор окончит создание файлов, он проинструктирует вас как восстановить, собрать и запустить приложение:
Your project is now created, you can use the following commands to get going
cd «WebApplicationBasic»
dotnet restore
dotnet build (optional, build will also happen with it's run)
dotnet run
Восстановить и собрать можно, а вот запускать пока рано: нужно ещё кое что сделать.

Разработка приложений ASP.NET Core MVC на Linux с помощью Visual Studio Code


Теперь запустите Visual Studio Code.
image
Выберите пункт Файл → Отрыть папку и выберите папку, в которой Вы создали шаблон приложения ASP.NET Core MVC с помощью yo.



При первом запуске Visual Studio Code выдаст предупреждение об отсутствии необходимых инструментов для сборки и отладки. Нажимаем Yes, чтобы добавить их. Без этого автоматическая отладка и сборка средствами Visual Studio Code будет недоступна, а только через терминал командами dotnet build и dotnet run.



В Терминале Visual Studio Code (Ctrl-`) выполните команду dotnet restore, чтобы восстановить зависимости проекта (если не сделали этого раньше). Другой способ — выполнить команду Ctrl-Shift-P в Visual Studio Code и затем ввести dot, как показано ниже (у меня почему-то не заработало):

image

Для тех, кто только приступает к использованию Visual Studio Code (или Code, для краткости), следует заметить, что данный продукт не только имеет удобный, простой и отзывчивый интерфейс, обеспечивающий быструю работу с файлами, но он также предоставляет инструменты для наиболее эффективного написания кода.

В левой панели навигации находятся пять значков, представляющие четыре viewlet:
  • Explore
  • Search
  • Git
  • Debug
  • Extensions

Explore viewlet позволяет быстро перемещаться по системе каталогов, а также облегчает обзор файлов, с которыми вы работаете. При наличии несохраненных изменений в файлах специальный значок на экране будет уведомлять об этом; упрощается процесс создания новых файлов и папок (для этого не надо открывать новое окно). Также удобно пользоваться командой Save All (Сохранить все), доступной в меню, которое появляется при наведении курсора мыши.

Code интегрируется с Git, если он установлен на вашем компьютере. При помощи Git viewlet можно создавать новые репозитории, подтверждать изменение кода, отправлять изменения.

image

Debug viewlet поддерживает интерактивную отладку приложений.

Кроме того, в редакторе Code есть множество замечательных функций. Вы увидите, что неиспользованные операторы using будут подчеркнуты и могут быть удалены автоматически при помощи Сtrl-., если значок лампочки отображается на экране. Также можно видеть, сколько ссылок на классы и методы есть в проекте. Если вы переходить с Visual Studio, то вы можете использовать многие знакомые сочетания клавиш, например, Сtrl-K+C, чтобы закомментировать блок кода или Ctrl-K-U, чтобы раскомментировать его.

Запуск приложения при помощи Kestrel


Kestrel — это кросс-платформенный HTTP сервер, основанный на libuv — библиотеке асинхронного ввода-вывода. Для его установки нужно установить соответствующий пакет NuGet: Microsoft.AspNetCore.Server.Kestrel. Сделать это можно двумя способами:
  • Установив .Net Core Project Manager (Nuget) через viewlet Extensions (Расширения): Ctrl-Shift-P, набираем Nuget, ↵, затем Kestrel ↵ выбираем Microsoft.AspNetCore.Server.Kestrel
  • Через командную строку в терминале редактора vs code editor:

dotnet add package Microsoft.AspNetCore.Server.Kestrel 

Всё, теперь можно запускать: нажимаем F5 или в терминале dotnet run, при этом автоматически запускается браузер с приложением по адресу: localhost:5000. Чтобы остановить веб-сервер, нажмите Ctrl+C. Вот и всё, можете наслаждаться вашим первым приложением ASP.Net Core:
image

Из полезных источников для дальнейшей установки готового приложения можно отметить статью: Publish to a Linux Production Environment — «Развёртывание приложения ASP.Net MVC при эксплуатации в среде Линукс».

Также можно порекомендовать хорошие источники для изучения ASP.Net Core MVC:

Вот собственно и всё, чем хотелось бы поделиться для начала по данной теме. Если что-нибудь пропустил — подскажите, поправим.
Поделиться публикацией

Комментарии 42

    +1
    эх, жаль что от project.json отказались. на мой взгляд он был намного удобнее
      –1
      возможно, выглядел проще
        +1
        с другой стороны, они довольно сильно упростили формат csproj. Выстрелит или нет — узнаем со временем)
          –1
          мне вообще не понравился этот добровольно принудительный переход. кто активно следит за dotnet core возможно замечал, что не надолгое время был выпушен так называемый Preview 3, который уже перешел на csproj, при это LTS так и оставался Preview 2 на project.json. Но через некоторое время по всей видимости Preview 3 отозвали и заместо него сейчас на сайте до сих пор лежит Preview 2.1 который все еще на project.json. и все было бы хорошо, еслиб не то что это не тестовые билды, а просто текуший релиз. и отзывать его как минимум не совсем правильно. Вообщем я советую ставить LTS версию, меньше шансов что с ней что-то неожиданно случится
        0
        Как там телеметрия отключалась?
          0
          В settings:
          "telemetry.enableTelemetry": false,
          "telemetry.enableCrashReporter": false
          
          0

          Вот момент с генерацией проекта йоменом был вообще неожиданный. У матерых энтерпрайзников не подгорает от использования столь низменной технологии как nodejs?:)
          P.S. ничего не имею против .NET, просто многие посматривают свысока на JS вообще и на nodejs в частности.

            +1
            на самом деле генератор йоменом это просто удобная фишка пришедшая из мира js. почти все те-же проекты можно генерировать используя dotnet new
              +1
              $ dotnet new --help
              • Nuget Config
              • Web Config
              • Solution File

              А где ещё шаблоны можно взять для этой команды?
                0
                Preview 2.1
                dotnet new -t --help
                Unrecognized type: --help
                Avaiable types for C# :
                - Console
                - Web
                - Lib
                - xunittest
                

                в Preview 4 еще больше проектов
                  0
                  Благодарю! Попробую, в этом и был вопрос. Да, действительно, в RC4 шаблонов больше:

                  • Console Application console [C#], F# Common/Console
                  • Class library classlib [C#], F# Common/Library
                  • Unit Test Project mstest [C#], F# Test/MSTest
                  • xUnit Test Project xunit [C#], F# Test/xUnit
                  • Empty ASP.NET Core Web Application web [C#] Web/Empty
                  • MVC ASP.NET Core Web Application mvc [C#], F# Web/MVC
                  • Web API ASP.NET Core Web Application webapi [C#] Web/WebAPI
                  • Nuget Config nugetconfig Config
                  • Web Config webconfig Config
                  • Solution File

                +1
                почти все те-же проекты можно генерировать используя dotnet new

                Так почему в примере не используется dotnet new, какие преимущества у йомена в данном случае?

                  0
                  В том то и дело, что на данный момент в dotnet new 3 шаблона и ни одного веб приложения, только консольное, а для йомена уже наделали кучу, вот только несколько навскидку:
                  • https://github.com/omnisharp/generator-aspnet#readme
                  • https://github.com/kriasoft/aspnet-starter-kit#readme
                  • https://github.com/sgbj/generator-aspnetcore-angular2
                  • https://github.com/deatharrow01/generator-aspnetpostgresql#readme
                  • https://github.com/digipolisantwerp/generator-dgp-api-aspnetcore_yeoman
                  • https://github.com/aspnet/JavaScriptServices#readme
                  • https://github.com/rahulsahay19/generator-aspnetcore-angular-2

                  Смотри полный список здесь: http://yeoman.io/generators/ по запросу aspnet
                    0

                    Понятно, спасибо.

                    0
                    в йомене можно кроме непосредственное проекта, уже в готовый проект добавить например контроллер
                      0
                      Как это можно сделать?
                        0
                        открываешь корень проекта, там запускаешь йомен, потом выбираешь aspnet а дальше вибираешь что тебе нужно сгенерировать.
                          0
                          Да, так работает, только там в списке нет контроллера.
                            0
                            есть подгенераторы. В свое время они были, не знаю, как сейчас.
                            yo aspnet:interface
                            

                            Такая конструкция создавала новый интерфейс и помещала его в cs-файл.
                              0
                              Там сейчас только 2 подгенератора:
                              • aspnet:nugetconfig
                              • aspnet:webconfig
                  –5

                  Microsoft вводили project.json, потому что хотели быть модными.

                    +3

                    И, к счастью, избавляются от него :)

                      +1

                      А почему к счастью? Какие проблемы были у project.json?

                        +3

                        Чисто декларативное описание это прекрасно, но недостаточно гибко и для введения новой функциональности требует обновления toolset. Msbuild же, при всей громоздкости синтаксиса уже сложился и имеет кучу инструментов, которые упрощают процесс сборки, в том числе сложной и автоматизированной. Когда msbuild не было для платформ, отличных от Windows, в новом инструменте был существенный смысл, но теперь уже нет.
                        Я уверен, что и project.json можно было развить до такого состояния, но с учётом описанного выше, мне кажется что возврат к msbuild более логичный шаг. К сожалению, Microsoft могли бы додуматься до этого раньше, сложившаяся ситуация с необходимостью миграции, конечно далека от идеала.

                          0

                          Спасибо за объяснение.

                            0

                            Пожалуйста, но если что, то это мои личные ощущения, у создателей набор причин может быть совсем другим :)

                    +1

                    Эти сами "многие" просто еще не осознали, что node.js — это не только сервер, но и среда для запуска системных утилит, в том числе компиляторов.


                    Не использовать babel или tsc только потому что они написаны на js и требуют для запуска ноды — глупость.

                      0

                      С точки зрения веба:


                      С одной стороны, все стандартные решения из мира node.js хороши тем, что они стандартные (babel, tsc, grunt\gulp, webpack). Но я тестировал grunt, webpack — они куда медленнее применяют изменения на лету, чем старые добрые ASP.NET Bundles. Сохранил, подождал несколько секунд, а бандлы очень быстрые — не успеваю перевести взгляд на окно браузера (на относительно небольшом объеме транслируемого кода и там, и там)

                        0

                        А с каких пор бандлы перегружались на лету? Всегда же надо было страницу обновлять...

                          0

                          Less\Css обновлялся на лету.

                      0

                      Посматриваю свысока с удовольствием, ваш нематёрый неэнтерпрайзник :)

                        –2
                        Обычный для Microsoft Embrace, Extend, and Extinguish. Энтерпрайзники относятся с пониманием.
                        0
                        прикольный интерфейс у линукса, что за шкурка?

                        image

                        я думаю таки правильно было бы вставить интерфейс линукса в статье про линукс
                        0
                        судя по последним тестам, даже показывает неплохую производительность

                        Очень любопытные данные. Вот интересно, как так получается, что интерпретируемые языки (JS, Python итп) занимают более высокие позиции, чем даже компилируемые? (т.е. первые места у C\C++, потом могут идти JS, потом снова C++, Java и так далее в перемешку). Обусловлено веб-сервером, СУБД или чем-то иным?

                          +1

                          Предположу, что libuv обеспечивает всем более-менее одинаковую производительность на простых тестовых приложениях. Но в реальной жизни, когда появятся нагромождения бизнес-логики, все встанет на свои места.

                          0
                          На Arch только недавно устанавливал. Все хорошо, но из AUR пришлось собирать + зависимости.
                          Из минусов — в VS Code пока не удалось нормально настроить отладку (.

                            0
                            проблема в том что microsoft не поддерживает Arch. лючше взять какую-небудь убунту либо федору. там все ок
                            0

                            Для установки Visual Studio Code также хорошо подойдет ubuntu-make: https://github.com/ubuntu/ubuntu-make

                              +1
                              Ну официальная документация об этом умалчивает, я думаю, что установка с официального сайта в 2 клика проще всего.

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

                            Самое читаемое