Wednesday, 19 October 2016

Installing Mono in Bash on Windows 10

I was working on a pull request to add a feature to Cake, which includes bootstrapper scripts written in PowerShell and in Bash. Ideally my PR would include changes for both scripts to keep them in feature parity. I could create a VM and install a flavour of Linux
to test out the Bash shell script. But then I remembered that since the July 2016 update, Windows 10 now has an optional Linux Subsystem, which includes a 'native' Bash shell.

Enable Developer Mode and Bash

So first off, let's get the subsystem installed and up to date. You could do this manually through Windows Settings, but I love scripting things where possible. From an elevated PowerShell prompt:

$RegistryKeyPath = "HKLM:\SOFTWARE\Microsoft\Windows\CurrentVersion\AppModelUnlock"
if (-not(Test-Path -Path $RegistryKeyPath)) {
    New-Item -Path $RegistryKeyPath -ItemType Directory -Force

# Add registry value to enable Developer Mode
New-ItemProperty -Path $RegistryKeyPath -Name AllowDevelopmentWithoutDevLicense -PropertyType DWORD -Value 1

Restart Windows, then open an elevated PowerShell prompt again:

Enable-WindowsOptionalFeature -Online -FeatureName Microsoft-Windows-Subsystem-Linux

Reboot again.

Now, type in 'Bash' and launch the Bash shell. The first time, you'll be prompted to enter a separate username/password. It's a good idea to make sure all the components are current.

Run the following to download and install any package updates:

sudo apt-get upgrade

Installing Mono

Cake currently uses Mono when run on Linux or MacOS (apparently .NET Core support is in the works). There's one trick regarding Mono running in Bash on Windows 10 - the build that works correctly is 4.2.4 (See the discussion on this Github issue

First up, add the key for the Mono project:

sudo apt-key adv --keyserver hkp:// --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF

And now download and install Mono 4.2.4 and related tools:

sudo sh -c 'echo "deb wheezy/snapshots/4.2.4 main">>/etc/apt/sources.list.d/mono-xamarin.list;apt-get -qq update;apt-get -qq install git gcc mono-complete'

I found after this, this easiest thing was to exit Bash and then open it again. Now I could use Cake's script which could successfully use Mono to run nuget.exe and cake.exe!

No comments: