F# na Azurze

27 Lutego 2017

Azure jest świetną platformą chmurową, ma dużo opcji i dość sensowny panel administracyjny. Jego główną wadą jest cena, choć dla dużych firm nie będzie ona stanowiła problemu. Studenci zaś mogą skorzystać z darmowej oferty Microsoft Azure for Students.

Jednak aby uruchomić moją aplikację F# + Suave na Azurze musiałem się nieco namęczyć.

Konfiguracja aplikacji

Na Azurze aplikacje webowe są hostowane w środowisku Windowsowym w oparciu o IIS. W dodatku są opracowane w taki sposób, że to nie my decydujemy na jakim porcie działamy, tylko musimy się dostować do Azura.

Żeby moja aplikacja wiedziała na jakim porcie nasłuchiwać to w pliku web.config należy ustawić np. zmienną środowiskową port. To ustawienie jest częścią polecenia uruchamiającego moją aplikację:

<configuration>
    <system.webServer>
        <httpPlatform 
                stdoutLogEnabled="false" stdoutLogFile="app.log" startupTimeLimit="20" 
                processPath="%HOME%\site\wwwroot\App.exe" >
            <environmentVariables>
            <environmentVariable name="port" value="%HTTP_PLATFORM_PORT%"/> 
            </environmentVariables>            
        </httpPlatform>
    </system.webServer>
</configuration>

Więc IIS ustawia %HTTP_PLATFORM_PORT% w zmiennej środowiskowej port, którą ja następnie otwieram w mojej aplikacji:

let envport = System.Environment.GetEnvironmentVariable "port"
let port = (if not (isNull envport) then envport else "8083") |> int

I to działa. Chciałbym w tym miejscu skończyć ten post, ale miałem błędy.

F# na Linuxie vs na Windowsie

Kompilator F# na Linuxie oparty o Mono i ten na Windowsie się różnią. Nie wiem czym dokładnie, nie chciałem się w to zagłębiać. Ale to powoduje dziwne problemy.

F# ma kilka wersji: 3.0, 3.1, 4.0 i nic w tym dziwnego. A odpowiadające im biblioteki FSharp.Core to 4.3.0.0, 4.3.1.0, 4.4.0.0.

Natomiast numerowanie paczek NuGet łamie wszystko. Odpowiednie wersje to 3.0.2, 3.1.2.5 i 4.0.0.1.

Po długim czasie szukania o co chodzi znalazłem artykuł, który opisuje jak się obchodzić z FSharp.Core. Jest też krótsze wytłumaczenie na StackOverflow.

Więc czemu miałem błąd? Ponieważ mój projekt niewłaściwie referensuje FSharp.Core. Tak jak się teraz zastanawiam, to chyba właśnie pisząc te słowa wpadłem dlaczego. Mając wcześniej podobne problemy źle skonfigurowałem target kompilacji w pliku projektu.

Tak czy siak, dostawałem wyjątek na Windowsie odnośnie brakującej biblioteki FSharp.Core w wersji 4.3.1.0.

Moim rozwiązaniem było przesłanie projektu przez FTP i skompilowanie go bezpośrednio na Azurze (przez Kudu) z linii poleceń.

Co dziwne, to to, że niezależnie od tego jak kompilowałem projekt na Linuxie i jakich referencji używałem, to i tak działał.

Moja aplikacja

A wszystko po to, żeby wrzucić na Azura aplikację, którą napisałem w 20 min. Aplikacja jest banalna - licznik fauli jakich doświadczyła koleżanka z drużyny na treningach. Kod źródłowy znajdziecie na GitHubie.