Ubuntu Weekly Topicsの2022年8月19日号でも紹介されているように、Microsoftが提供するクロスプラットフォームな開発フレームワークである
実は前から存在した.NETパッケージ
「.NET」
.NET Frameworkのオープンソース実装としては昔からMonoが存在しました。Monoはモバイルアプリも含めたクロスプラットフォームなフレームワークであるXamarinで採用され、
話を元に戻すと、もともと.NET Coreの時点でオープンソース化されていますし、MicrosoftはUbuntu向けの独自リポジトリを作って、そこから.NET SDKや.NETランタイムをaptコマンドでインストールできるようにしていました[3]。ユーザーや開発者は必要に応じてMicrosoftが提供するリポジトリを追加するだけで、Ubuntuでも.NET環境を構築できたのです[4]。
ここまでの話をまとめると、今回の
- MicrosoftはWSLに続いて.NETに関してもCanonicalと協力する
- .NETのSDKやランタイムを、Canonicalがパッケージングし公式リポジトリから提供する
- Canonicalは.NETのSDKやランタイムのセキュリティアップデートに対応する
- .NETランタイムが入った小さなDockerイメージを提供する
一般的なユーザーにとっては、
開発ユーザーにとっては、開発環境の構築が
たとえば第435回の
もうひとつは、サーバーアプリケーションフレームワークであるASP.
.NETパッケージのインストールとサンプルプログラムの作成
今回Ubuntu 22.
- dotnet6:.NET 6のSDK。.NETアプリケーションの開発時にインストールする。
- dotnet-runtine-6.
0 :.NET 6のアプリケーションを実行するために必要なランタイム。任意の.NETバイナリを実行だけしたい場合にインストールする。 - apsnetcore-runtime-6.
0 :APS.NET 6のサーバーソフトウェアを実行するために必要なランタイム。サーバー用のライブラリが追加されている。
ビルドする際はdotnet6をインストールし、実行するだけなら用途に応じてdotnet-runtime-6.
では、さっそくdotnet6パッケージをインストールして、.NETアプリケーションをビルドしてみましょう。
$ sudo apt install dotnet6
アプリケーションの作成する際は
$ dotnet new console -o MyApp -f net6.0 Welcome to .NET 6.0! --------------------- SDK Version: 6.0.108 ---------------- Installed an ASP.NET Core HTTPS development certificate. To trust the certificate run 'dotnet dev-certs https --trust' (Windows and macOS only). Learn about HTTPS: https://aka.ms/dotnet-https ---------------- Write your first app: https://aka.ms/dotnet-hello-world Find out what's new: https://aka.ms/dotnet-whats-new Explore documentation: https://aka.ms/dotnet-docs Report issues and find source on GitHub: https://github.com/dotnet/core Use 'dotnet --help' to see available commands or visit: https://aka.ms/dotnet-cli -------------------------------------------------------------------------------------- The template "Console App" was created successfully. Processing post-creation actions... Running 'dotnet restore' on /home/ubuntu/temp/dotnet/MyApp/MyApp.csproj... Determining projects to restore... Restored /home/ubuntu/temp/dotnet/MyApp/MyApp.csproj (in 48 ms). Restore succeeded.
テンプレートについては、SDKのドキュメントを参照してください。また、dotnet new --list
」
$ dotnet new --list These templates matched your input: Template Name Short Name Language Tags -------------------------------------------- -------------- ---------- -------------------------- ASP.NET Core Empty web [C#],F# Web/Empty ASP.NET Core gRPC Service grpc [C#] Web/gRPC ASP.NET Core Web API webapi [C#],F# Web/WebAPI ASP.NET Core Web App webapp,razor [C#] Web/MVC/Razor Pages ASP.NET Core Web App (Model-View-Controller) mvc [C#],F# Web/MVC ASP.NET Core with Angular angular [C#] Web/MVC/SPA ASP.NET Core with React.js react [C#] Web/MVC/SPA Blazor Server App blazorserver [C#] Web/Blazor Blazor WebAssembly App blazorwasm [C#] Web/Blazor/WebAssembly/PWA Class Library classlib [C#],F#,VB Common/Library Console App console [C#],F#,VB Common/Console dotnet gitignore file gitignore Config Dotnet local tool manifest file tool-manifest Config EditorConfig file editorconfig Config global.json file globaljson Config MSTest Test Project mstest [C#],F#,VB Test/MSTest MVC ViewImports viewimports [C#] Web/ASP.NET MVC ViewStart viewstart [C#] Web/ASP.NET NuGet Config nugetconfig Config NUnit 3 Test Item nunit-test [C#],F#,VB Test/NUnit NUnit 3 Test Project nunit [C#],F#,VB Test/NUnit Protocol Buffer File proto Web/gRPC Razor Class Library razorclasslib [C#] Web/Razor/Library Razor Component razorcomponent [C#] Web/ASP.NET Razor Page page [C#] Web/ASP.NET Solution File sln Solution Web Config webconfig Config Worker Service worker [C#],F# Common/Worker/Web xUnit Test Project xunit [C#],F#,VB Test/xUnit
今回はconsoleテンプレートを
$ cd MyApp/ $ find -type f ./obj/MyApp.csproj.nuget.g.targets ./obj/MyApp.csproj.nuget.g.props ./obj/project.nuget.cache ./obj/MyApp.csproj.nuget.dgspec.json ./obj/project.assets.json ./MyApp.csproj ./Program.cs $ cat Program.cs // See https://aka.ms/new-console-template for more information Console.WriteLine("Hello, World!");
単にHello, World!
」dotnet run
」
$ dotnet run Hello, World!
試しに生成されたバイナリを確認してみましょう。
$ file bin/Debug/net6.0/MyApp* bin/Debug/net6.0/MyApp: ELF 64-bit LSB pie executable, x86-64, version 1 (SYSV), dynamically linked, (略) bin/Debug/net6.0/MyApp.deps.json: JSON data bin/Debug/net6.0/MyApp.dll: PE32 executable (console) Intel 80386 Mono/.Net assembly, for MS Windows bin/Debug/net6.0/MyApp.pdb: Microsoft Roslyn C# debugging symbols version 1.0 bin/Debug/net6.0/MyApp.runtimeconfig.json: JSON data $ ldd ./bin/Debug/net6.0/MyApp linux-vdso.so.1 (0x00007ffc1ddfb000) libstdc++.so.6 => /lib/x86_64-linux-gnu/libstdc++.so.6 (0x00007f0ef5035000) libm.so.6 => /lib/x86_64-linux-gnu/libm.so.6 (0x00007f0ef4f4e000) libgcc_s.so.1 => /lib/x86_64-linux-gnu/libgcc_s.so.1 (0x00007f0ef4f2e000) libc.so.6 => /lib/x86_64-linux-gnu/libc.so.6 (0x00007f0ef4d06000) /lib64/ld-linux-x86-64.so.2 (0x00007f0ef527d000)
「bin/
」
次に同じソースコードを
$ dotnet build --self-contained true -r win-x64 Microsoft (R) Build Engine version 17.0.0+c9eb9dd64 for .NET Copyright (C) Microsoft Corporation. All rights reserved. Determining projects to restore... All projects are up-to-date for restore. MyApp -> /home/ubuntu/temp/dotnet/MyApp/bin/Debug/net6.0/win-x64/MyApp.dll Build succeeded. 0 Warning(s) 0 Error(s) Time Elapsed 00:00:00.54 $ file bin/Debug/net6.0/win-x64/MyApp.exe bin/Debug/net6.0/win-x64/MyApp.exe: PE32+ executable (console) x86-64, for MS Windows
クロスプラットフォームなビルドを行うためには、dotnet build
に-r
」
ランタイム識別子を指定する場合は、--self-contained
」
.NETは複数のプラットフォームのクロスビルドをサポートしています。つまり、.NET SDKをインストールしたUbuntuのコンテナイメージをひとつ用意しておけば、CIを使って簡単にすべてのプラットフォーム向けのバイナリを自動生成できるというわけです。
シングルバイナリの生成方法
もうひとつ、.NET関連のランタイムをシングルバイナリにまとめる方法も紹介しておきましょう。まず、.NETでは最終的な成果物はdotnet publish
」
$ dotnet publish Microsoft (R) Build Engine version 17.0.0+c9eb9dd64 for .NET Copyright (C) Microsoft Corporation. All rights reserved. Determining projects to restore... All projects are up-to-date for restore. MyApp -> /home/ubuntu/temp/dotnet/MyApp/bin/Debug/net6.0/MyApp.dll MyApp -> /home/ubuntu/temp/dotnet/MyApp/bin/Debug/net6.0/publish/ $ ls -lh bin/Debug/net6.0/publish/MyApp -rwxr-xr-x 1 ubuntu ubuntu 76K Aug 27 14:47 bin/Debug/net6.0/publish/MyApp
このときの.NETバイナリPublishSingleFile
」
$ dotnet publish -r linux-x64 --self-contained false /p:PublishSingleFile=true $ ls -lh bin/Debug/net6.0/linux-x64/MyApp -rwxr-xr-x 1 ubuntu ubuntu 140K Aug 27 14:48 bin/Debug/net6.0/linux-x64/MyApp
「PublishSingleFile
」-r
」--self-contained
」--self-contained false
」
次に--self-contained true
」
$ dotnet publish -r linux-x64 --self-contained true /p:PublishSingleFile=true $ ls -lh bin/Debug/net6.0/linux-x64/publish/MyApp -rwxr-xr-x 1 ubuntu ubuntu 62M Aug 27 14:58 bin/Debug/net6.0/linux-x64/publish/MyApp
ファイルサイズが一気に大きくなりましたね。つまり、必要な.NETランタイムもバイナリの中に同梱されたことになります。このバイナリはPublishSingleFile
」
Webアプリケーションの作成
CLIアプリケーションとして、Webアプリケーションのテンプレートも使ってみましょう。
$ dotnet new webapp -o MyService The template "ASP.NET Core Web App" was created successfully. This template contains technologies from parties other than Microsoft, see https://aka.ms/aspnetcore/6.0-third-party-notices for details. Processing post-creation actions... Running 'dotnet restore' on /home/ubuntu/temp/dotnet/MyService/MyService.csproj... Determining projects to restore... Restored /home/ubuntu/temp/dotnet/MyService/MyService.csproj (in 47 ms). Restore succeeded.
テンプレートに
$ cd MyService/ $ cat Program.cs var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.AddRazorPages(); var app = builder.Build(); // Configure the HTTP request pipeline. if (!app.Environment.IsDevelopment()) { app.UseExceptionHandler("/Error"); // The default HSTS value is 30 days. You may want to change this for production scenarios, see https://aka.ms/aspnetcore-hsts. app.UseHsts(); } app.UseHttpsRedirection(); app.UseStaticFiles(); app.UseRouting(); app.UseAuthorization(); app.MapRazorPages(); app.Run();
コードがHello, World!
」
$ dotnet run Building... warn: Microsoft.AspNetCore.DataProtection.KeyManagement.XmlKeyManager[35] No XML encryptor configured. Key {7e1b3662-a4c1-4fd9-a0b1-8c0f277bb029} may be persisted to storage in unencrypted form. info: Microsoft.Hosting.Lifetime[14] Now listening on: https://localhost:7039 info: Microsoft.Hosting.Lifetime[14] Now listening on: http://localhost:5183 info: Microsoft.Hosting.Lifetime[0] Application started. Press Ctrl+C to shut down. info: Microsoft.Hosting.Lifetime[0] Hosting environment: Development info: Microsoft.Hosting.Lifetime[0] Content root path: /home/ubuntu/temp/dotnet/MyService/
今回はプロセスが残り続けています。HTTPSとしてhttps://
」http://
」
$ curl -kL https://localhost:7039 <!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Home page - MyService</title> <link rel="stylesheet" href="/lib/bootstrap/dist/css/bootstrap.min.css" /> <link rel="stylesheet" href="/css/site.css?v=ZJg29BfKMfPQ1nmIkdqg6iWhTGRNJx2HnD4FfdtVCcU" /> <link rel="stylesheet" href="/MyService.styles.css?v=xMx8ooszZup4_uOEasJFRYBupwgLrjVIrzpyi2dW8Ws" /> </head> <body> (後略)
無事にコンテンツが表示されました。
最小コンテナの構築ツールである「Chisel」
「ASP.
このChiselは現在開発中のGo言語のコマンドで、
- ubuntu/
dotnet-deps (mcr. microsoft. com/ dotnet/ nightly/ runtime-deps:6. 0-jammy-chiseled):12. 9MB - ubuntu/
dotnet-runtime (mcr. microsoft. com/ dotnet/ nightly/ runtime:6. 0-jammy-chiseled):117MB - ubuntu/
dotnet-aspnet (mcr. microsoft. com/ dotnet/ nightly/ apsnet:6. 0-jammy-chiseled):140MB
丸括弧の中はMicrosoftのレジストリ上のイメージ名です。dotnet-despは、
それに対してdotnet-runtimeとdotnet-apsnetは、それぞれのランタイムライブラリがインストール済みのイメージとなります。よってビルドした.NETバイナリのみをコンテナに取り込めば完成です。
これらのイメージは、aptコマンドはもちろんのこと、bashなどのシェルコマンドも同梱されていません。rootアカウントも存在せず、UIDとGIDがそれぞれ101のユーザーで実行することになります。よって実際のDockerイメージを作るには、マルチステージビルドを用いて取り込むことになります。このあたりは、上記に記載した個々のコンテナイメージのDocker HubのURLでも解説されているため、まずはそちらを参照すると良いでしょう[5]。
このようにUbuntuでも、CLIアプリケーションやWebアプリケーションであれば、十分に本格的な.NETプログラミングが可能になっています。VisualStudio Codeと組み合わせれば開発手法もWindowsのそれに近くなってきます。まだGUI部分のサポートがないものの、WindowsとUbuntuの両方で動くCLI/
お知らせ:UbuCon Asia 2022の発表者を募集しています
2022年11月26日・
セミナーは会場に訪れての発表だけでなく、リアルタイムのオンライン発表も可能です。また、発表の言語や資料が英語である必要はありません。もちろん各国から参加される以上、英語のほうが伝わりやすいですが、資料は英語で発表は日本語のような組み合わせも可能です。
募集期限は9月14日までです。その後、9月27日まで審査を行い、10月5日までにはその結果を通知し、発表の意志の確認を行うことになるようです。昨年度の内容から、発表の難易度はかなり多種多様なものが許容されるようです。ぜひ日本からもふるってご応募ください。
また、オフライン開催に伴う旅費補助も検討中で、そのためのスポンサーも随時募集中のようです。Ubuntuにお世話になっている企業の皆様は、ぜひスポンサーのご検討もよろしくお願いいたします。