Windows Subsystem for Linux, или как разрабатывать приложения на Windows без боли

Как настроить полноценное окружение разработчика, привыкшего к Linux и Mac OS X.

В закладки

Традиционно считается, что разработчики (в особенности связанные с бэкенд-разработкой) предпочитают использовать unix-like-системы. Причиной тому было немало. Ситуация начала несколько меняться в 2017 году — именно тогда вышел первый стабильный релиз Windows Subsystem for Linux (также известен под более ранним названием BashOnWindows), который дал разработчикам то, чего они так давно ждали, — полноценный Linux в качестве приложения в Windows!

Но не всё оказалось так просто — лишь к концу 2018 года WSL стало возможно использовать полноценно, при этом способ отнюдь не очевиден. О нём и пойдёт речь.

Конечная цель

Для начала пара слов о том, что такое вообще Windows Subsystem for Linux, он же WSL в сокращённом варианте. Это прослойка между ядром Windows и приложениями для Linux, которая позволяет преобразовывать системные вызовы к ядру Linux в вызовы к ядру Windows. Благодаря тому, что виртуализация практически отсутствует, такое решение работает быстрее традиционной виртуализации, где эмулируется целый компьютер, как это происходит в Oracle VirtualBox и VMWare Player.

Кроме того, WSL включает в себя целый ряд утилит для интеграции с Windows — пути в файловой системе автоматически преобразовываются в нужный формат, из-под Linux можно запускать приложения в Windows (но не наоборот!), Linux в WSL имеет доступ ко всем портам и сервисам в Windows.

Для разработчика основное применение WSL сразу же видится в развёртывании среды разработки именно там. Всё же установка многих языков, компиляторов и интерпретаторов, утилит происходит в Linux куда проще — часто одной командой из репозитория. Да и привычная консоль под рукой.

В статье будет рассматриваться именно настройка среды разработки в WSL — для примера возьмём небольшой проект, написанный на Python/Angular/Go (а почему бы и нет?), разрабатываемый в Visual Studio Code. Однако описанные рекомендации в целом подойдут для любого другого редактора или IDE.

Установка для Windows 10 x64

Важный момент: WSL официально поддерживается только в Windows 10 x64, начиная с Anniversary Update. Если у вас иная версия — альтернативное решение представлено в следующем разделе.

Инструкция по установке WSL имеется на официальном сайте Microsoft. Если же описать её кратко, то необходимо:

  • Включить поддержку Windows Subsystem for Unix, открыв PowerShell от администратора и выполнив команду:
PS C:\Windows\system32> Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux
  • Если у вас установлена десктопная редакция Windows 10: зайти в Microsoft Store и установить необходимый вам дистрибутив. Для нашего эксперимента будет использована Ubuntu 18.04 LTS. Затем вы сможете запустить ваш дистрибутив через меню «Пуск».
  • Если у вас установлена иная редакция Windows, без Microsoft Store (например, Windows 10 LTSC либо Windows Server): в PowerShell выполнить следующие команды:
PS C:\Windows\system32> cd ~ PS C:\Users\somebody> Rename-Item .\Ubuntu.appx .\Ubuntu.zip PS C:\Users\somebody> Expand-Archive .\Ubuntu.zip .\Ubuntu PS C:\Users\somebody> cd .\Ubuntu\ PS C:\Users\somebody> .\ubuntu1804.exe

При первом запуске необходимо задать ваши логин и пароль.

vagrant up

Далее уже вам откроется консоль с Ubuntu.

Установка для 32-битных редакций Windows 10 и Windows 7, 8 и 8.1

К сожалению, на этих редакциях WSL не поддерживается. Но мы можем без особого труда заменить его Vagrant — мощной утилитой для конфигурирования виртуальных машин. Vagrant работает поверх других сред виртуализации: VirtualBox, VMWare Player или Microsoft Hyper-V. Поэтому стоит понимать, что такой вариант будет по умолчанию медленнее, нежели WSL. А в случае с VirtualBox значительно медленнее из-за файловой системы vboxsf.

Установить Vagrant можно с официального сайта. Также вам потребуется VirtualBox и Git. После этого создайте папку для вашей виртуальной машины, в ней создайте файл Vagrantfile со следующим содержимым:

Vagrant.configure("2") do |config| config.vm.box = "bento/ubuntu-18.04" config.vm.synced_folder "c:/", "/windows" # Необходимо указать для каждого порта, который вы хотите расшарить из ВМ или в ВМ config.vm.network :forwarded_port, host: 5432, guest: 5432 config.vm.provider "virtualbox" do |vb| vb.memory = 2048 end end

После чего в том же PowerShell или cmd выполните команду:

vagrant up

После загрузки, настройки и запуска виртуальной машины вы попадёте в консоль Linux. Ура!

Устанавливаем всякие скучные вещи

Разворачиваем наше окружение под Python/JS/Go.

:~$ sudo apt update :~$ sudo apt install build-essential :~$ sudo apt install -y git nodejs golang python-dev libreadline-dev libbz2-dev libssl-dev libsqlite3-dev libxslt1-dev libxml2-dev libffi-dev :~$ curl -L https://raw.githubusercontent.com/yyuu/pyenv-installer/master/bin/pyenv-installer | bash :~$ # Инсталлятор попросит вас добавить загрузку pyenv в ~/.bashrc :~$ source ~/.bashrc :~$ pyenv install 3.7.2 :~$ pyenv global 3.7.2

Отдельно хочу выразить благодарность Адилю Хашматову за хорошую инструкцию по использованию pyenv. Для чего он нам нужен? В этом случае — установить последнюю версию Python.

Быстро проверяем работоспособность версий и, собственно, версии:

:~$ nodejs -v v8.10.0 :~$ go version go version go1.10.4 linux/amd64 :~$ python -V Python 3.7.2 :~$

Неужели всё уже работает?

Конечно нет.

Сразу стоит отметить важный факт: ни Visual Studio Code, ни Sublime Text, ни даже ваша любимая IDE ничего не знают о существовании WSL. Из коробки более-менее с ним умеют работать только продукты от JetBrains. Лично мне Visual Studio Code по настройке, скорости работы нравится куда больше (но это текстовый редактор, о чём не стоит забывать).

И единственное, что вы можете сделать в Visual Studio Code, установленной на Windows, — подключить себе WSL вместо стандартного PowerShell в терминале. Это делается в User Settings:

{ "terminal.integrated.shell.windows": "C:\\Windows\\System32\\wsl.exe", # Добавьте сюда иные настройки по вашему усмотрению }

На этом всё. Про линтер, автодополнение кода из библиотек, подсветку ошибок можете забыть, по крайней мере для Python. Способа решения сообщество ждёт вот уже три года. Сейчас самый простой и действенный способ заставить его работать — установить в WSL.

  • Установите MobaXterm и Cmder. Конечно, вы можете по своему выбору заменить их на альтернативные приложения. MobaXterm — мощный SSH-терминал со встроенным X-сервером, что позволяет ему рендерить приложения, которые запускаются на удалённом X-сервере (в данном случае — внутри WSL). Cmder — локальный эмулятор терминала с поддержкой PowerShell, cmd, bash, WSL и не только, с нормальным копипастом.
  • Запустите Cmder. По умолчанию он запустит cmd, но при двойном клике на нижнюю панель покажет окно, где есть возможные варианты.
  • Нам нужен тот вариант, что отмечен как {WSL::bash}. Он запустит в новой вкладке консоль внутри WSL.
  • Запустите MobaXterm. Он сразу же увидит WSL, установленную в системе. Для запуска X-сервера нажмите выделенную на скриншоте кнопку.
  • Настроим WSL для запуска GUI-приложений. Для этого откройте файл ~/.bashrc и допишите в него:
export DISPLAY=:0
  • После этого выполните команду source ~/.bashrc для применения изменений.
  • Не обязательно, но желательно установить XFCE (или другой DE на ваш вкус), а также поставить шрифты, иначе от внешнего вида VS Code у вас, возможно, вытекут глаза. По крайней мере, люди жалуются.
:~$ sudo apt install -y xfce4 :~$ sudo apt install -y fonts-noto fonts-noto-hinted fonts-noto-mono fonts-noto-unhinted
:~$ sudo apt install libgtk2.0-0 libxss1 libasound2 :~$ sudo dpkg -i <code deb file> :~$ sudo apt install -f
  • Запустите VS Code при помощи команды code.

Вот теперь работает :) Ещё более кратко и по сути расписано вот тут.

Однако до совершенства есть ещё один штрих.

{ ... "window.titleBarStyle": "native", ... }

Добавьте приведённую выше настройку в User Settings. В противном случае окно VS Code не будет ресайзиться.

А ты ещё докажи, что работает

Именно для этого я форкнул чужой образец проекта на Django и Angular, чуточку перепилил структуру для наглядности, а также добавил парсер на Go. Взять его можно здесь.

Разворачивается оно стандартно для подобного рода проектов.

# You are on a project root :~$ python -m venv env/ :~$ source env/bin/activate :~$ pip install -r requirements.txt :~$ cd frontend :~$ npm install :~$ ng build outDir=../backend/microblog/static :~$ cd ../backend :~$ python manage.py runserver

Отличия в настройке между Vagrant и WSL

Единственное существенное различие в контексте статьи — необходимость пробрасывать порты в хостовую файловую систему. По умолчанию Vagrant поднимает SSH-туннель на порту 2222 — именно туда вам будет необходимо логиниться из Cmder и добавить соответствующее соединение в MobaXterm.

Более подробно об использовании Vagrant с MobaXterm можно прочитать по ссылке.

Итоги

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

{ "author_name": "Семён Бочкарёв", "author_type": "self", "tags": [], "comments": 9, "likes": 29, "favorites": 10, "is_advertisement": false, "subsite_label": "dev", "id": 55715, "is_wide": true, "is_ugc": true, "date": "Thu, 17 Jan 2019 14:03:21 +0300", "is_special": false }
Selectel
IT-инфраструктура для стартапов и бизнеса
Подписан
Отписаться
Объявление на vc.ru
0
9 комментариев
Популярные
По порядку
Написать комментарий...
3

Интересная статья, отлично подойдет для тех, у кого нет денег на мак

Ответить
0

Нищеброды с понтами покупают покусанное яблоко, остальные покупают то, что хотят из работающего, удобного, быстрого.

Ответить
0

Ужасно, честно говоря.
Какие могут быть причины перехода с Linux/Mac на Windows?

Ответить
1

Ну кому-то нужна Visual Studio например для Unity. Да она есть для mac OS, но она весьма глючная и урезанная. Игры. больше причин не знаю )

Ответить
0

Спасибо, давно подумываю уйти с мака на ПК, очень скучал бы терминалу

Ответить
0

Я ушел. Макось умудряется тормозить на свежей прошке, не очень хорошо работает с несколькими мониторами, а управление множеством окон на большом мониторе - в макосе это отдельная боль. И я говорю это после 10-ти лет владения маками ((
Windows 10 хоть была и непривычной, но работает очень хорошо

Ответить
0

тоже ушел на винду, по одной простой причине, десктоп с быстрой nvidia rtx. wsl справляется с задачами за 90% от требуемого.

Ответить
0

Я прошлым летом пробовал разрабатывать на Windows: все равно есть мелкие проблемы, постоянно что-то бесит.
Я просто вернулся на Ubuntu

Ответить
0

Полезная статья, спасибо!
Но в информации для установки WSL в Windows LTSB, думаю стоит добавить команду получения дистрибутива, если он автоматом не приехал.
В блок команд PowerShell добавить после: PS C:\Windows\system32> cd ~

PS C:\Users\somebody> Invoke-WebRequest -Uri https://aka.ms/wsl-ubuntu-1804 -OutFile Ubuntu.appx -UseBasicParsing

Инфа взята отсюда:
https://docs.microsoft.com/en-us/windows/wsl/install-manual

Ответить

Прямой эфир