As the F# Foundation states: “F# is a mature, open source, cross-platform, functional-first programming language”. Today I decided to try out the cross-platform part of that statement by trying to get my project running on Linux.
I’m running Ubuntu 16.10 64-bit with 3GB of RAM in VirtualBox. The steps below come from various sources, which are referenced by links.
F# Setup on Linux
Steps taken from http://fsharp.org/use/linux/ and sites it references. All steps were run in a Terminal in Ubuntu.
Step 1. Add mono to apt sources
sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF echo "deb http://download.mono-project.com/repo/debian wheezy main" | sudo tee /etc/apt/sources.list.d/mono-xamarin.list sudo apt-get update
Step 2. Install Mono
sudo apt-get install mono-devel sudo apt-get install mono-complete
At this point I was able to create and run the hello.cs program as described here meaning Mono and therefore .NET was functioning on the machine.
Step 3. Finally, install fsharp
sudo apt-get install fsharp
Setting up the project
To get the project running we first needed the source code
git clone -b Suave https://github.com/winterlimelight/FunctionalDomainProject.git FunctionalDomainProject cd FunctionalDomainProject
and then to restore the libraries using paket. This came with a slight hiccup as linux needed to be told that the bootstrapper and paket were executables by using chmod
.
chmod a+x .paket/paket.bootstrapper.exe .paket/paket.bootstrapper.exe chmod a+x .paket/paket.exe .paket/paket.exe update
At this point I tried my first compile but got a series of errors rooted at the Store.fs. This is the file containing the SqlDataProvider connection string, and in order for F# to compile it needed to be able to connect to that database. This required the connection string to change to reference the IP address of the VirtualBox host machine, and to replace Trusted_Connection=true
with User Id=...;Password=...
. The host machine needed the above SQL login created and given dbo rights to the AssetManager database. It also needed a firewall exclusion added for SQL Server.
With those changes in place, the following command performed a successful compile:
xbuild AmApi/AmApi.fsproj
To run it, the executable needed execute rights, then could be called:
cd AmApi/bin/Debug/ chmod a+x AmApi.exe ./AmApi.exe
The integration tests have been hosted in Postman, a Chrome extension, so it was a simple matter to install that extension in Chrome in Ubuntu and open the test collection and run it. The results: 22/22 passed.
Playing in the environment
Beyond this I also tried to get debugging going using VS Code with Ionide. I found some information about possible configuration steps necessary for F# debugging, but couldn’t get it working myself.
I also decided to create a FAKE build by creating an empty project using the Ionide FAKE plugin in VS Code. This created the necessary build.* files which were copied into the project repository, and a paket dependency for FAKE created. The outcome of that can be seen here.