CLOVER🍀

That was when it all began.

Ubuntu Linux 20.04 LTSに、.NET 5.0/.NET Core 3.1をインストールしてみる

これは、なにをしたくて書いたもの?

Ubuntu Linuxに、.NET Coreをインストールしてみようかなと。

.NET Core

.NET自体の説明は、こちら。

.NET の概要 | Microsoft Docs

そして、.NET Coreについて。

2014 年に、Microsoft によって、.NET Frameworkクロスプラットフォームオープンソースの後継版の作成が開始されました。 この .NET の新しい実装には、バージョン 3.1 に達するまで .NET Core という名前が付けられていました。 .NET Core 3.1 以降の次のバージョンは .NET 5.0 であり、現在プレビュー段階です。

.NET の概要 / .NET Core と .NET 5

.NET Coreというのは、バージョン3.1までの名前ですが、クロスプラットフォームオープンソース実装のことを指すようです。
.NET 5以降は、"Core"とは呼ばなくなるようですね。

で、.NET 5はプレビュー段階と上記のページに書いていますが、実際には2020年11月にリリースされているようなので…。

Announcing .NET 5.0 | .NET Blog

[速報]マイクロソフト「.NET 5」正式リリース。1つのフレームワークでWindows/Mac/Linuxのデスクトップ、サーバアプリ、Webアプリなどが開発可能に - Publickey

Microsoftが .NET 5 をリリース

今回は、.NET 5.0と.NET Core 3.1をインストールしてみたいと思います。

環境

今回の環境は、こちらです。

$ lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description:    Ubuntu 20.04.2 LTS
Release:    20.04
Codename:   focal


$ uname -srvmpio
Linux 5.4.0-70-generic #78-Ubuntu SMP Fri Mar 19 13:29:52 UTC 2021 x86_64 x86_64 x86_64 GNU/Linux

Ubuntu Linux 20.04 LTSです。

Ubuntu Linuxに.NET 5.0をインストールする

Linuxへの.NETのインストールに関するドキュメントは、こちら。

Linux ディストリビューションに .NET をインストールする | Microsoft Docs

Ubuntu Linuxと.NETのサポートマトリクス。

Linux に .NET をインストールする / Ubuntu

インストール方法はLinuxディストリビューションごとにドキュメントがあり、Ubuntu Linuxについてはこちらです。

Ubuntu に .NET をインストールする - .NET | Microsoft Docs

サポートバージョンについても再度記載があります。

では、まずは.NET 5.0をインストールしてみます。

パッケージ署名キーの追加。

$ curl -O -L -s https://packages.microsoft.com/config/ubuntu/20.04/packages-microsoft-prod.deb
$ sudo dpkg -i packages-microsoft-prod.deb

リポジトリ情報の更新と、必要なパッケージのインストール。

$ sudo apt update && sudo apt install -y apt-transport-https

インストール可能なパッケージに、.NETが含まれるようになっています。こちらはSDKです。

$ apt search dotnet-sdk
ソート中... 完了
全文検索... 完了  
dotnet-sdk-2.1/groovy 2.1.814-1 amd64
  Microsoft .NET Core SDK 2.1.814

dotnet-sdk-3.1/groovy 3.1.407-1 amd64
  Microsoft .NET Core SDK 3.1.407

dotnet-sdk-5.0/groovy 5.0.201-1 amd64
  Microsoft .NET SDK 5.0.201

ランタイムのみ。

$ apt search aspnetcore-runtime.*
ソート中... 完了
全文検索... 完了  
aspnetcore-runtime-2.1/focal 2.1.26-1 amd64
  Microsoft ASP.NET Core 2.1.26 Shared Framework

aspnetcore-runtime-3.1/focal 3.1.13-1 amd64
  Shared Framework for hosting of Microsoft ASP.NET Core applications. It is open source, cross-platform and is supported by Microsoft. We hope you enjoy using it! If you do, please consider joining the active community of developers that are contributing to the project on GitHub (https://github.com/aspnet/AspNetCore). We happily accept issues and PRs.

aspnetcore-runtime-5.0/focal 5.0.4-1 amd64
  Shared Framework for hosting of Microsoft ASP.NET Core applications. It is open source, cross-platform and is supported by Microsoft. We hope you enjoy using it! If you do, please consider joining the active community of developers that are contributing to the project on GitHub (https://github.com/dotnet/aspnetcore). We happily accept issues and PRs.

では、.NET 5.0のSDKをインストール。
※ランタイムのみのインストールも可能なようです

$ sudo apt install dotnet-sdk-5.0

インストールされました。

$ dotnet --version
5.0.201

--list-sdksでインストールされたSDKの一覧を、--list-runtimesでインストールされたランタイムの一覧を見ることが
できます。

$ dotnet --list-sdks
5.0.201 [/usr/share/dotnet/sdk]


$ dotnet --list-runtimes
Microsoft.AspNetCore.App 5.0.4 [/usr/share/dotnet/shared/Microsoft.AspNetCore.App]
Microsoft.NETCore.App 5.0.4 [/usr/share/dotnet/shared/Microsoft.NETCore.App]

.NET Core 3.1をインストールする

続いて、.NET Core 3.1をインストールしてみます。

$ sudo apt install dotnet-sdk-3.1

.NET 5.0を先にインストールしているので、dotnetコマンドが示すバージョンは5.0となっています。

$ dotnet --version
5.0.201

ですが、SDKやランタイムとしては認識されています。

$ dotnet --list-sdks
3.1.407 [/usr/share/dotnet/sdk]
5.0.201 [/usr/share/dotnet/sdk]


$ dotnet --list-runtimes
Microsoft.AspNetCore.App 3.1.13 [/usr/share/dotnet/shared/Microsoft.AspNetCore.App]
Microsoft.AspNetCore.App 5.0.4 [/usr/share/dotnet/shared/Microsoft.AspNetCore.App]
Microsoft.NETCore.App 3.1.13 [/usr/share/dotnet/shared/Microsoft.NETCore.App]
Microsoft.NETCore.App 5.0.4 [/usr/share/dotnet/shared/Microsoft.NETCore.App]

これで、.NET 5.0と.NET Core 3.1の両方がインストールされたことになります。

そして、この状態だとデフォルトは.NET 5.0が使われそうですね。

使ってみる

dotnetコマンドのヘルプを見てみましょう。

$ dotnet --help
.NET SDK (5.0.201)
使用法: dotnet [runtime-options] [path-to-application] [arguments]

.NET アプリケーションを実行します。

runtime-options:
  --additionalprobingpath <path>   調査ポリシーと調査対象アセンブリを含むパス。
  --additional-deps <path>         追加の deps.json ファイルへのパス。
  --depsfile                       <application>.deps.json ファイルへのパス。
  --fx-version <version>           アプリケーションを実行するために使用するインストール済み Shared Framework のバージョン。
  --roll-forward <setting>         フレームワーク バージョン (LatestPatch、Minor、LatestMinor、Major、LatestMajor、Disable) にロールフォワードします。
  --runtimeconfig                  <application>.runtimeconfig.json ファイルへのパス。

path-to-application:
  実行するアプリケーション .dll ファイルへのパス。

使用法: dotnet [sdk-options] [command] [command-options] [arguments]

.NET SDK コマンドを実行します。

sdk-options:
  -d|--diagnostics  診断出力を有効にします。
  -h|--help         コマンド ラインのヘルプを表示します。
  --info            .NET 情報を表示します。
  --list-runtimes   インストール済みランタイムを表示します。
  --list-sdks       インストール済み SDK を表示します。
  --version         使用中の .NET SDK バージョンを表示します。

SDK コマンド:
  add               .NET プロジェクトにパッケージまたは参照を追加します。
  build             .NET プロジェクトをビルドします。
  build-server      ビルドによって開始されたサーバーとやり取りします。
  clean             .NET プロジェクトのビルド出力をクリーンします。
  help              コマンド ラインのヘルプを表示します。
  list              .NET プロジェクトのプロジェクト参照を一覧表示します。
  msbuild           Microsoft Build Engine (MSBuild) コマンドを実行します。
  new               新しい .NET プロジェクトまたはファイルを作成します。
  nuget             追加の NuGet コマンドを提供します。
  pack              NuGet パッケージを作成します。
  publish           .NET プロジェクトを配置のために公開します。
  remove            .NET プロジェクトからパッケージまたは参照を削除します。
  restore           .NET プロジェクトに指定されている依存関係を復元します。
  run               .NET プロジェクトの出力をビルドして実行します。
  sln               Visual Studio ソリューション ファイルを変更します。
  store             指定されたアセンブリをランタイム パッケージ ストアに格納します。
  test              .NET プロジェクトに指定されているテスト ランナーを使用して、単体テストを実行します。
  tool              .NET のエクスペリエンスを向上するツールをインストールまたは管理します。
  vstest            Microsoft Test Engine (VSTest) コマンドを実行します。

バンドルされたツールからの追加コマンド:
  dev-certs         開発証明書を作成し、管理します。
  fsi               F# Interactive を開始するか、F# スクリプトを実行します。
  sql-cache         SQL Server キャッシュ コマンドライン ツール。
  user-secrets      開発ユーザーのシークレットを管理します。
  watch             ファイルが変更されたときにコマンドを実行するファイル ウォッチャーを起動します。

コマンドに関する詳細情報については、'dotnet [command] --help' を実行します。

ビルドなどは、このコマンドでできそうですね。

では、こちらのドキュメントに沿ってコンソールアプリケーション用のプロジェクトを作ってみたいと思います。

チュートリアル: .NET ツールを作成する - .NET CLI | Microsoft Docs

プロジェクトを作成するdotnet newコマンドを実行してみると、作成できるプロジェクトテンプレートが表示されるようです。

$ dotnet new
Templates                                     Short Name           Language    Tags                  
--------------------------------------------  -------------------  ----------  ----------------------
Console Application                           console              [C#],F#,VB  Common/Console        
Class library                                 classlib             [C#],F#,VB  Common/Library        
WPF Application                               wpf                  [C#]        Common/WPF            
WPF Class library                             wpflib               [C#]        Common/WPF            
WPF Custom Control Library                    wpfcustomcontrollib  [C#]        Common/WPF            
WPF User Control Library                      wpfusercontrollib    [C#]        Common/WPF            
Windows Forms (WinForms) Application          winforms             [C#]        Common/WinForms       
Windows Forms (WinForms) Class library        winformslib          [C#]        Common/WinForms       
Worker Service                                worker               [C#],F#     Common/Worker/Web     
Unit Test Project                             mstest               [C#],F#,VB  Test/MSTest           
NUnit 3 Test Project                          nunit                [C#],F#,VB  Test/NUnit            
NUnit 3 Test Item                             nunit-test           [C#],F#,VB  Test/NUnit            
xUnit Test Project                            xunit                [C#],F#,VB  Test/xUnit            
Razor Component                               razorcomponent       [C#]        Web/ASP.NET           
Razor Page                                    page                 [C#]        Web/ASP.NET           
MVC ViewImports                               viewimports          [C#]        Web/ASP.NET           
MVC ViewStart                                 viewstart            [C#]        Web/ASP.NET           
Blazor Server App                             blazorserver         [C#]        Web/Blazor            
Blazor WebAssembly App                        blazorwasm           [C#]        Web/Blazor/WebAssembly
ASP.NET Core Empty                            web                  [C#],F#     Web/Empty             
ASP.NET Core Web App (Model-View-Controller)  mvc                  [C#],F#     Web/MVC               
ASP.NET Core Web App                          webapp               [C#]        Web/MVC/Razor Pages   
ASP.NET Core with Angular                     angular              [C#]        Web/MVC/SPA           
ASP.NET Core with React.js                    react                [C#]        Web/MVC/SPA           
ASP.NET Core with React.js and Redux          reactredux           [C#]        Web/MVC/SPA           
Razor Class Library                           razorclasslib        [C#]        Web/Razor/Library     
ASP.NET Core Web API                          webapi               [C#],F#     Web/WebAPI            
ASP.NET Core gRPC Service                     grpc                 [C#]        Web/gRPC              
dotnet gitignore file                         gitignore                        Config                
global.json file                              globaljson                       Config                
NuGet Config                                  nugetconfig                      Config                
Dotnet local tool manifest file               tool-manifest                    Config                
Web Config                                    webconfig                        Config                
Solution File                                 sln                              Solution              
Protocol Buffer File                          proto                            Web/gRPC              

Examples:
    dotnet new mvc --auth Individual
    dotnet new xunit 
    dotnet new --help
    dotnet new classlib --help

consoleがコンソールアプリケーションのテンプレートです。

さらにヘルプを見てみます。

$ dotnet new console --help
使用法: new [options]

オプション:
  -h, --help          Displays help for this command.
  -l, --list          Lists templates containing the specified template name. If no name is specified, lists all templates.
  -n, --name          The name for the output being created. If no name is specified, the name of the output directory is used.
  -o, --output        Location to place the generated output.
  -i, --install       Installs a source or a template pack.
  -u, --uninstall     Uninstalls a source or a template pack.
  --interactive       Allows the internal dotnet restore command to stop and wait for user input or action (for example to complete authentication).
  --nuget-source      Specifies a NuGet source to use during install.
  --type              Filters templates based on available types. Predefined values are "project" and "item".
  --dry-run           Displays a summary of what would happen if the given command line were run if it would result in a template creation.
  --force             Forces content to be generated even if it would change existing files.
  -lang, --language   Filters templates based on language and specifies the language of the template to create.
  --update-check      Check the currently installed template packs for updates.
  --update-apply      Check the currently installed template packs for update, and install the updates.


Console Application (C#)
Author: Microsoft
Description: A project for creating a command-line application that can run on .NET Core on Windows, Linux and macOS
Options:                                                                             
  -f|--framework  The target framework for the project.                              
                      net5.0           - Target net5.0                               
                      netcoreapp3.1    - Target netcoreapp3.1                        
                  Default: net5.0                                                    

  --langVersion   Sets the LangVersion property in the created project file          
                  text - Optional                                                    

  --no-restore    If specified, skips the automatic restore of the project on create.
                  bool - Optional                                                    
                  Default: false                                                     

オプションを見てみると、作成するプロジェクトで使う.NETのバージョンなども指定できそうですね。

では、プロジェクトを作成します。

$ dotnet new console -n my-console-project
The template "Console Application" was created successfully.

Processing post-creation actions...
Running 'dotnet restore' on my-console-project/my-console-project.csproj...
  復元対象のプロジェクトを決定しています...
  path/to/my-console-project/my-console-project.csproj を復元しました (71 ms)。
Restore succeeded.

--nameまたは-nオプションでプロジェクト名を指定すると、指定された名前のディレクトリ内に必要なファイルが
作成されます。プロジェクト名を指定しない場合は、カレントディレクトリにファイルが生成されるようです。

プロジェクト内に移動。

$ cd my-console-project

作成されたプロジェクトファイル。

my-console-project.csproj

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFramework>net5.0</TargetFramework>
    <RootNamespace>my_console_project</RootNamespace>
  </PropertyGroup>

</Project>

生成されたプログラム。

Program.cs

using System;

namespace my_console_project
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello World!");
        }
    }
}

.NETのバージョンを出力するように、内容を変更してみましょう。

Program.cs

using System;

namespace my_console_project
{
    class Program
    {
        static void Main(string[] args)
        {
            Console.WriteLine("Hello .NET Core {0}!", Environment.Version.ToString());
        }
    }
}

実行。

$ dotnet run
Hello .NET Core 5.0.4!

動作しました。

今度は、ビルドして実行可能ファイルを作成してみましょう。

$ dotnet build
.NET 向け Microsoft (R) Build Engine バージョン 16.9.0+57a23d249
Copyright (C) Microsoft Corporation.All rights reserved.

  復元対象のプロジェクトを決定しています...
  復元対象のすべてのプロジェクトは最新です。
  my-console-project -> /path/to/my-console-project/bin/Debug/net5.0/my-console-project.dll

ビルドに成功しました。
    0 個の警告
    0 エラー

経過時間 00:00:01.01

作成されたようなので、実行。

$ bin/Debug/net5.0/my-console-project
Hello .NET Core 5.0.4!

OKですね。

次は、使用する.NETのバージョンを変更してみようかなと思います。

使用する .NET のバージョンを選択する - .NET | Microsoft Docs

こちらを見ると、プロジェクトファイルを変更してもよさそうですね。しかも、複数バージョン指定できそうです。

チュートリアル: .NET CLI を使用して .NET ツールを作成する / プロジェクトを作成する

今回は、2つの.NETバージョンを指定するようにしてみましょう。変更前のプロジェクトファイルはこちら。

my-console-project.csproj

<Project Sdk="Microsoft.NET.Sdk">

  <PropertyGroup>
    <OutputType>Exe</OutputType>
    <TargetFrameworks>net5.0;netcoreapp3.1</TargetFrameworks>
    <RootNamespace>my_console_project</RootNamespace>
  </PropertyGroup>

</Project>

TargetFrameworkの部分を

    <TargetFramework>net5.0</TargetFramework>

TargetFrameworks(複数形)に変更して、使用する.NETのバージョンを;区切りで追加します。

    <TargetFrameworks>net5.0;netcoreapp3.1</TargetFrameworks>

ここで指定する名前は、こちらのページの「ターゲット フレームワーク モニカー(TFM)」で表現される名前の
ようですね。

SDK スタイル プロジェクトでのターゲット フレームワーク - .NET | Microsoft Docs

ビルド。

$ dotnet build
.NET 向け Microsoft (R) Build Engine バージョン 16.9.0+57a23d249
Copyright (C) Microsoft Corporation.All rights reserved.

  復元対象のプロジェクトを決定しています...
  /path/to/my-console-project/my-console-project.csproj を復元しました (83 ms)。
  my-console-project -> /path/to/my-console-project/bin/Debug/netcoreapp3.1/my-console-project.dll
  my-console-project -> /path/to/my-console-project/bin/Debug/net5.0/my-console-project.dll

ビルドに成功しました。
    0 個の警告
    0 エラー

経過時間 00:00:01.64

各.NETバージョン向けの実行可能ファイルが生成されました。

確認。

$ bin/Debug/net5.0/my-console-project
Hello .NET Core 5.0.4!


$ bin/Debug/netcoreapp3.1/my-console-project
Hello .NET Core 3.1.13!

それぞれの.NETのバージョンで、ビルドできたようです。

ちなみに、このようにTargetFrameworksで複数の.NETのSDKを指定した状態だと、dotnet runだけでは実行できなくなります。

$ dotnet run
プロジェクトを実行できません
プロジェクトは複数のフレームワークを対象としています。'--framework' を使用して、実行するフレームワークを指定してください。

使用する.NETのバージョンを指定する必要があるようです。メッセージにあるように--frameworkまたは-fオプションで
実行する.NETを指定します。

$ dotnet run -f net5.0
Hello .NET Core 5.0.4!


$ dotnet run -f netcoreapp3.1
Hello .NET Core 3.1.13!

とりあえずは、複数バージョンの.NETをUbuntu Linuxにインストールして、実行できました、と。