如何在 Ubuntu 18.04 上安装 F# 并设置本地编程环境

作者选择了自由软件基金会作为 写给捐款计划的一部分接受捐款。

介绍

F# 是一个开源编程语言,最初由微软研究公司开发,以扩展 .NET,微软的工具,库和语言组合来构建应用程序和服务。

采用特定的 paradigm 或代码风格,决定了我们如何思考和组织我们的编程问题解决方式。采用 _imperative 方法,使用的设计模型在语言如 C++Java中,开发人员逐步描述计算机如何完成任务。 它是写出一系列声明,在程序执行时会改变内存状态。 这很好,直到我们遇到一些不规则的情况。 例如,考虑到一个 _shared 对象,该对象由多个应用程序同时使用。 我们可能希望在另一个组件正在修改它时同时读取它的值。 这些是 concurrent 行动在一个内存位置上,可以产生数据不一致性和未定义的行为。

functional code design中,我们通过最大限度地减少可变状态的使用来预防此类问题,或者在我们创建它们后可以改变的状态。 函数是这里的关键词,指一些作为论点提供的信息的数学转换。 函数代码通过将解决方案构成一组要执行的函数来表达什么。

F# 的功能编程带来了一些好处:

  • 更易于阅读和表达的语法,可提高程序的可维护性。
  • 由于无状态函数而更容易破坏和更容易调试的代码,可用于测试。
  • 可促进非同步编程和更安全的兼并的原生构件。
  • 访问.NET 世界中的所有现有工具,包括社区共享的包。

选择一个 Runtime

由于F# 是跨平台的,所以通过不同的操作系统保持类似的执行模型行为至关重要。.NET 通过运行时间实现了这一点。

实际上,在 Linux 上有两种.NET 运行时实现: .NET CoreMono。 历史上,.NET 只在 Windows 上工作. 当时,人们可以使用社区 Mono 项目在 Linux 和 macOS 等其他平台上运行.NET 应用程序。

在本教程发布时,它们可以用于构建Web应用程序或命令行实用程序,也就是说,.NET Core 不会发送模型来在 Linux 和 macOS 上创建 GUI 桌面应用程序,而 Mono 是唯一支持移动和游戏平台的模型。

在本教程中,您将使用.NET Core 和 Mono 运行时间在 Ubuntu 18.04 上设置 F# 编程环境,然后写一些代码示例来测试和审查构建和编译方法。

前提条件

要完成本教程,您将需要对命令行和运行Ubuntu 18.04(http://releases.ubuntu.com/18.04)的计算机的基本熟悉性,并具有具有sudo特权的非根用户(https://andsky.com/tech/tutorials/initial-server-setup-with-ubuntu-18-04# step-2-%E2%80%94-creating-a-new-user)。

步骤 1 — 使用.NET Core 安装 F#

Microsoft 為 F# 開發人員提供 .NET Core Software Development Kit (SDK) 。 軟體開發套件是一套程式工具,允許程序員生產專用應用程式,並將其適應到各種作業系統。 它傳統上包括文本編輯器、語言支援、執行時間和編譯器,以及其他組件。 在此步驟中,您將安裝此 SDK。

您将在命令行上完成安装和设置,这是与计算机交互的非图形方式. 也就是说,而不是点击按钮,您将键入文本并通过文本从您的计算机获得反馈。

命令行,也被称为 shellterminal,可以帮助修改和自动化您每天在计算机上执行的许多任务,并且是软件开发人员必不可少的工具。

在Ubuntu 18.04,你可以通过点击屏幕的左上角的Ubuntu图标来找到终端应用程序,然后在搜索栏中键入终端

Ubuntu Terminal

打开终端后,使用wget命令下载包含一些所需文件、Microsoft 存储库配置和服务器通信密钥的包。

1wget -q https://packages.microsoft.com/config/ubuntu/18.04/packages-microsoft-prod.deb

现在,添加 Microsoft 存储库并使用dpkg -i指令将包安装到您的系统。

1sudo dpkg -i packages-microsoft-prod.deb

接下来,激活 Universe 存储库,这是一个免费和开源的社区维护的软件存储库,这将为您提供apt-transport-https的访问权限,这是一种允许 Ubuntu 包管理器 APT 通过 HTTPS 传输的依赖。

1sudo add-apt-repository universe
2sudo apt install apt-transport-https

接下来,更新可用的下载:

1sudo apt update

最后,安装.NET SDK 的 当前版本

1sudo apt install dotnet-sdk-2.2

现在你已经安装了.NET SDK,可以快速检查一切是否顺利的是尝试.NET Core 命令行接口 (CLI),一旦 SDK 下载和安装,它将在壳中可用。

1dotnet --info

当您首次运行dotnet命令时,如下所示,会显示一个文本部分:

 1[secondary_label Output]
 2Welcome to .NET Core!
 3---------------------
 4Learn more about .NET Core: https://aka.ms/dotnet-docs
 5Use 'dotnet --help' to see available commands or visit: https://aka.ms/dotnet-cli-docs
 6
 7Telemetry
 8---------
 9The .NET Core tools collect usage data in order to help us improve your experience. The data is anonymous and doesn't include command-line arguments. The data is collected by Microsoft and shared with the community. You can opt-out of telemetry by setting the DOTNET_CLI_TELEMETRY_OPTOUT environment variable to '1' or 'true' using your favorite shell.
10
11Read more about .NET Core CLI Tools telemetry: https://aka.ms/dotnet-cli-telemetry
12...

此通知涉及收集的数据,并解释了一些.NET CLI 命令将向 Microsoft 发送使用信息. 您将在一瞬间禁用此功能;目前,请查看dotnet --info的输出。

过了一会儿,终端会列出有关您的.NET 安装的信息:

 1[secondary_label Output]
 2.NET Core SDK (reflecting any global.json):
 3 Version:   2.2.101
 4 Commit:    236713b0b7
 5
 6Runtime Environment:
 7 OS Name:     ubuntu
 8 OS Version:  18.04
 9 OS Platform: Linux
10 RID:         ubuntu.18.04-x64
11 Base Path:   /usr/share/dotnet/sdk/2.2.101/
12
13Host (useful for support):
14  Version: 2.2.0
15  Commit:  1249f08fed
16
17.NET Core SDKs installed:
18  2.2.101 [/usr/share/dotnet/sdk]
19
20.NET Core runtimes installed:
21  Microsoft.AspNetCore.All 2.2.0 [/usr/share/dotnet/shared/Microsoft.AspNetCore.All]
22  Microsoft.AspNetCore.App 2.2.0 [/usr/share/dotnet/shared/Microsoft.AspNetCore.App]
23  Microsoft.NETCore.App 2.2.0 [/usr/share/dotnet/shared/Microsoft.NETCore.App]
24
25To install additional .NET Core runtimes or SDKs:
26  https://aka.ms/dotnet-download

取决于 SDK 版本,输出可能略有不同,但这证实.NET Core 已准备好使用。

如前所述,远程测量功能允许某些.NET CLI 命令向 Microsoft 发送使用信息. 它默认启用,并可以通过将DOTNET\_CLI\_TELEMETRY_OPTOUT环境变量设置为1来禁用。

1nano ~/.profile

将下列行添加到.profile的末尾:

1[label ~/.profile]
2. . .
3export DOTNET_CLI_TELEMETRY_OPTOUT=1

输出nanoCTRLX键,当被要求保存文件时,按Y,然后按ENTER

您可以使用命令激活新配置:

1source ~/.profile

从现在开始,远程测量将被关闭在启动。

在此时,您已安装了.NET Core 运行时间、语言支持和库,允许您运行和构建某些.NET 应用程序。dotnet CLI 也可用于管理.NET 源代码和二进制。

为了解决这个问题,在下一步,您将重新安装F# ,但这次使用Mono。

步骤 2 — 使用 Mono 安装 F#

您可以使用 Mono 来填补.NET Core 所剩余的能力差距. Mono 和.NET Core 都是基于相同的标准库,并且都支持.NET 语言,但这就是相似性结束的地方。

一个版本的Mono在Ubuntu存储库中可用,但这可能已经过时了。 相反,请将官方的Mono包存储库添加到您的包管理器:

1sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF
2echo "deb https://download.mono-project.com/repo/ubuntu stable-bionic main" | sudo tee /etc/apt/sources.list.d/mono-official-stable.list

在之前的命令中,您使用apt-key来获取从官方Mono存储库转移的安全包的密钥,然后将Mono包源添加到您的存储库列表中。

添加了新的 APT 源列表,更新您的存储库:

1sudo apt update

接下来,下载 Mono 工具. 与.NET Core 不同, Mono 不包含 F# 工具,所以您将将其下载为单独的包。

1sudo apt install mono-complete fsharp

<$>[注] 注: 由于此下载的大小,安装过程可能需要一段时间。

一旦完成,你将有编译器fsharpc和一个名为fsharpi或简单地FSI的交互式壳。FSI是一个环境,壳内,它接收用户的输入作为一个表达式,评估它,然后输出结果,等待另一个输入。

使用以下命令激活 FSI:

1fsharpi

这将启动交互式会话,并用fsharpi提示取代您的常规提示:

1[secondary_label Output]
2Microsoft (R) F# Interactive version 4.1
3Copyright (c) Microsoft Corporation. All Rights Reserved.
4
5For help type #help;;
6
7>

您可以通过运行# quit;返回默认壳,在fsharpi中,每个命令行都以双半字符结束。

让我们尝试使用printfn函数进行一个简单的操作,以使作为参数传递的消息:

1printfn "Hello World!";;

您将获得以下输出:

1[secondary_label Output]
2Hello World!
3val it : unit = ()
4
5>

从之前的交互中, fsharpi 将表达式评估为 unity 类型值,然后执行代码,并以其类型打印结果。

fsharpi也可以运行包含 F# 代码的文件. 该脚本必须以 .fsx 扩展命名,并从壳中执行命令:

1fsharpi some_script.fsx

现在你知道 F# 安装工作了,请将壳留下:

1> #quit;;

有了安装的 Mono 和.NET Core,您现在已经准备好编写任何类型的 F# 程序。 FSI 将允许您测试您的代码并在需要时运行一些脚本,但执行将是缓慢的。

步骤 3 – 使用.NET Core 编写和编译 F# 程序

在此步骤中,您将通过带有.NET Core 的命令行编译器编译 F# 源代码,从而使您的应用程序更快,并为特定系统生产预设可执行的包,从而使您的程序更容易分发。

Compiling 是将源代码转换为二进制文件的转换过程. 实现此转换的软件称为编译器..NET Core 依赖dotnet CLI 来执行编译。

dotnet CLI 提供了完整的应用程序构建工具链. 一般来说,一个命令和一个dotnet驱动程序的关联在壳中用于完成一个任务。

  • dotnet new 将创建一个 project
  • dotnet build 将创建一个项目,其所有依赖性
  • dotnet add package 将添加一个包引用到项目文件

接下来将创建一个名为FSharpHello的新控制台项目. -lang 选项将设置您将使用的编程语言,而 -o 选项将创建一个目录,以便将输出放置在其中。

1dotnet new console -lang F# -o FSharpHello

一旦完成,导航到您新创建的项目目录:

1cd FSharpHello

该目录包含了FSharpHello.fsproj项目配置文件和用于存储临时对象文件的obj文件夹。还有你的默认源代码存在的Program.fs文件。

1nano Program.fs

该文件已自动填写一个 Hello World 程序:

1[label Program.fs]
2// Learn more about F# at http://fsharp.org
3
4open System
5
6[<EntryPoint>]
7let main argv =
8    printfn "Hello World from F#!"
9    0 // return an integer exit code

在此代码中,您开始导入系统模块打开系统,然后定义程序的输入点,即从壳开始程序的位置。

离开文件。

要编译和运行此代码,请从项目目录中使用以下内容 ~/FSharpHello:

1dotnet run

该程序将运行,在屏幕上打印以下输出:

1[secondary_label Output]
2Hello World from F#!

请注意,这个程序运行需要一段时间,就像FSI一样. 正如我们之前提到的,通过生成可执行的,即可以直接由操作系统运行的二进制文件来运行这个更快。

1dotnet publish -c release -r linux-x64

这会产生可执行的 bin/release/netcoreapp2.2/linux-x64/publish/FSharpHello.dll 文件. 这是一个在 64 位 Linux 架构上运行的共享库。 为了向 macOS 系统导出通用可执行的文件,你会用 osx-x64 代替 linux-x64 运行时间标识符(RID)。

现在用以下命令执行文件:

1dotnet bin/release/netcoreapp2.2/linux-x64/publish/FSharpHello.dll

这一次,您将更快地收到输出,因为该程序已经被翻译成二进制。

现在你已经知道如何在.NET Core 中编译,让我们看看 Mono 如何用专用的fsharpc命令编译程序。

步骤 4 – 使用 Mono 编写和编译 F# 程序

Mono 的编译过程类似于.NET Core 的编译过程,但这次有一个特定的命令用于编译该程序。

这一次,创建一个hello.fs文件,然后写一些F# 代码。

1cd

接下来,打开一个名为hello.fs的新文件:

1nano hello.fs

将以下行添加到文件中:

1[label hello.fs]
2open System

如前所述,这将导入系统模块或名称空间,让您可以访问内置的系统功能和对象,如控制台

现在,添加一些更多的代码行:

1[label hello.fs]
2open System
3
4let hello() =
5    printf "Who are you? "
6    let name = Console.ReadLine()
7    printfn "Oh, Hello %s!\nI'm F#." name

这些新行定义了hello()函数,用于阅读用户输入并打印反馈消息。

现在你可以添加最后的行:

 1[label hello.fs]
 2open System
 3
 4let hello() =
 5    printf "Who are you? "
 6    let name = Console.ReadLine()
 7    printfn "Oh, Hello %s!\nI'm F#." name
 8
 9hello()
10Console.ReadKey() |> ignore

在这里,您正在调用函数 hello(),然后使用 ReadKey() 方法以最后按键结束程序。

保存和退出文件。

现在用fsharpc命令,使用-o旗定义输出文件名,并编译您的hello.fs源代码如下:

1fsharpc hello.fs -o hello

上面的命令会生成一个Hello可执行的文件,您可以使用mono命令运行:

1mono hello

这为您提供以下输出,并等待用户输入:

1[secondary_label Output]
2Who are you?

如果你输入Sammy,你会得到以下内容。

1[secondary_label Output]
2Oh, Hello Sammy!
3I'm F#.

按下最后一个键,然后程序将结束。

恭喜您!您已经编写并编译了您的第一个 F# 程序,使用 Mono 和.NET Core。

结论

在本教程中,您安装了用于 F# 编程的工具,涵盖了.NET Core 和 Mono 环境,您还测试了 F# 代码的示例和构建的执行。

接下来的步骤可能是 学习 语言并与 社区联系。随着项目变得越来越复杂,您可能需要更有效地管理代码和资源。

Published At
Categories with 技术
comments powered by Disqus