Open196

[WIP] .NET MAUI で Linux 向けにビルドしたい!

Lemon73Lemon73

.NET MAUI とは

.NET MAUI は C# と XAML により GUI クロスプラットフォームアプリケーションを開発できるフレームワークです。

Linux 版

しかし、登場した当時は Linux 版はコミュニティーによる開発扱いで、現在はもはや Linux の存在は公式ドキュメントから削除されています。

現在のコミュニティーによる開発は、ほとんど停滞しており、その開発の情報はほとんど存在しません。

この資料の目的

この資料は .NET MAUI を Linux でなんとか利用できないか試み、情報をある程度まとめたものです。

Lemon73Lemon73

参考になるページ

リポジトリ

下2つは、#66などで maui-linux にマージしています。このリポジトリの保持者である jsuarezruiz さんも今はあんまり MAUI Linux の開発に関与していないようです。

コミュニティー

本家の wiki でも強い要望があるにも関わらず、MS やコミュニティーによる開発はあまり進んでいません。(というか、興味がある人は多いけど、開発資料が少なすぎて途中参入が難しいんだとおもう)

(まじで情報がない)

Lemon73Lemon73

ビルドとかの方針

これは指針であり、まだ成功はしていません。

A 案

Windows や macOS 上でのビルドと同様に行う (多分無理)

-> Linux 上では maui-android 以外使えないので、ビルドエラーが大量に出る

B 案

CI/CD を参考にする

-> gtk のワークロードがインストールできない

C 案

CI/CD をそのまま動かす (一番希望がある)

-> GitHub Actions をローカルで動かせる act でできるかも (現状若干エラーが出てるけど頑張れば行けるか?)
-> B 案と同じで、gtk のワークロードのインストールができない

D 案

自作する (無理)

-> Qt (Qt.NET (古い)) で作るとか (ライセンス的 (GPL/LGPL) に微妙な気がする)

結論

とりあえず C 案で進めます。B 案でもほぼ同じな気がしますが… (資料作るときは B 案のほうが act とか入れなくてもいいので、簡単になりそう)

Lemon73Lemon73

雑に URL を貼る

CI/CD はバージョンがかなり古いので、すべて v4 に上げるのを推奨するよ

Lemon73Lemon73

ぶっちゃけ、あと gtkのワークロードさえインストールできれば動きそうな雰囲気ある

あと、多分これ (GTK ランタイム) は必要かも

sudo apt install libgtk-3-dev
sudo apt install libgtk-3-0
Lemon73Lemon73

一応 act の使い方をちょっと書いておく

  1. gh (GitHub CLI) をインストール
# 参考: https://github.com/cli/cli/blob/trunk/docs/install_linux.md
(type -p wget >/dev/null || (sudo apt update && sudo apt-get install wget -y)) \
	&& sudo mkdir -p -m 755 /etc/apt/keyrings \
	&& wget -qO- https://cli.github.com/packages/githubcli-archive-keyring.gpg | sudo tee /etc/apt/keyrings/githubcli-archive-keyring.gpg > /dev/null \
	&& sudo chmod go+r /etc/apt/keyrings/githubcli-archive-keyring.gpg \
	&& echo "deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" | sudo tee /etc/apt/sources.list.d/github-cli.list > /dev/null \
	&& sudo apt update \
	&& sudo apt install gh -y
  1. act をインストール
# 参考: https://nektosact.com/installation/gh.html
gh extension install https://github.com/nektos/gh-act
  1. Docker をインストール (よくわからないけど apt で全部入れた (?) 多分 docker.io があればいいのかな?)
  2. Docker 起動
sudo systemctl start docker
  1. ユーザーを docker グループに追加 (docker はスーパーユーザーが必要)
sudo usermod -aG docker $USER
newgrp docker # 変更を適応
  1. リポジトリをクローンして、その中に移動する
git clone <リポジトリの URL>
cd <クローンしたディレクトリ>
  1. 動かす
# 場所は、リポジトリのルートで実行 (ルートじゃなくても動くかも?)
gh act push
# または gh act pull_request かな?
Lemon73Lemon73
# 参考: https://github.com/HavenDV/Gtk
curl -sSL https://raw.githubusercontent.com/HavenDV/Gtk/main/scripts/workload-install.sh | sudo bash

これやって、0.2.0はありません的なエラーが出たから、他の方法を試した。
(インストールできてないから dotnet workload list には入らないけど、dotnet workload search には入る)

# 参考: https://matrix.to/#/!secXICyMCTWkttVBVC:matrix.org/$uX3kcJ_AITkkFvqne3wkFJUL4_77o_FpfpGos6RphzI?via=matrix.org
git clone https://github.com/GtkSharp/GtkSharp.git
cd GtkSharp
sudo dotnet tool restore
sudo dotnet cake --BuildTarget=InstallWorkload 

これやって、

# (これは元からインストールしてたっぽいから関係ない気がするけど)
sudo apt-get install libgtk-3-0

これやった後に、もう一度 sudo dotnet workload install gtk したら、なぜかインストールできた

$ dotnet workload list

インストール済みワークロードの ID      マニフェストのバージョン        インストール ソース 
-------------------------------------------------------
gtk                     0.2.0/8.0.400       SDK 8.0.400
maui-android            8.0.82/8.0.100      SDK 8.0.400
wasi-experimental       8.0.8/8.0.100       SDK 8.0.400

`dotnet workload search` を使用して追加ワークロードを検出し、インストールします。
Lemon73Lemon73

(なんか gtk が入った後も、結構苦難している)

Lemon73Lemon73

色んな方法を試しすぎてて、再現性が低くなりそう (あとでちゃんとした資料を書くつもり (これが本来の目的だし))

Lemon73Lemon73
# 参考: https://github.com/jsuarezruiz/maui-linux/issues/92#issuecomment-2311842074
dotnet cake --target=dotnet-pack --workloads=global --gtk
dotnet new install ./artifacts/*.nupkg

を試して、

# (Nuget.config)
- <!-- <add key="local" value="artifacts" /> -->
+ <add key="local" value="artifacts" />

にした。

この後にビルドをすると、Gtk あたりのエラーは解消されたっぽい。

だけど、次のエラーが発生した。

Lemon73Lemon73

System.Text.Json 8.0.0 が致命的な脆弱性があるというエラーが発生するので、バージョンを上げる。

eng/Versions.props
# $(MicrosoftNETCoreAppRefPackageVersion) は8.0.0になってる
- <SystemTextJsonPackageVersion>$(MicrosoftNETCoreAppRefPackageVersion)</SystemTextJsonPackageVersion>
+ <SystemTextJsonPackageVersion>8.0.4</SystemTextJsonPackageVersion>

ついでに、ビルドターゲットの出力形式を変更する

Maui.Controls.Sample.csproj
- <!-- <OutputType Condition="$(TargetFramework.Contains('-'))">Exe</OutputType> -->
+ <OutputType>Exe</OutputType>
Lemon73Lemon73

規定に関しても設定しなきゃいけないらしい

launchSettings.json
{
  "profiles": {
    "Windows Machine": {
      "commandName": "MsixPackage",
      "nativeDebugging": true
+   },
+   "Linux Machne": {
+     "commandName": "Project",
+     "nativeDebugging": true
    }
  }
}

あと、Main() が必要らしい (Windows とかは /Platforms/Windows/App.xaml.cs とかを参照にしてるっぽい)

MauiProgram.cs
public static void Main()
{
  CreateMauiApp();
}
Lemon73Lemon73
dotnet run --project src/Controls/samples/Controls.Sample/Maui.Controls.Sample.csproj --framework net8.0

まだエラーは続く…

Unhandled exception. Microsoft.Maui.ApplicationModel.NotImplementedInReferenceAssemblyException: This functionality is not implemented in the portable version of this assembly. You should reference the NuGet package from your main application project in order to reference the platform-specific implementation.
   at Microsoft.Maui.ApplicationModel.AppInfoImplementation.get_PackagingModel() in /home/lemon73/Downloads/maui-linux/src/Essentials/src/AppInfo/AppInfo.netstandard.cs:line 19
   at Microsoft.Maui.ApplicationModel.AppInfo.get_PackagingModel() in /home/lemon73/Downloads/maui-linux/src/Essentials/src/AppInfo/AppInfo.shared.cs:line 106
   at Maui.Controls.Sample.MauiProgram.<>c.<CreateMauiApp>b__4_3(IEssentialsBuilder essentials) in /home/lemon73/Downloads/maui-linux/src/Controls/samples/Controls.Sample/MauiProgram.cs:line 191
   at Microsoft.Maui.Hosting.EssentialsExtensions.EssentialsRegistration.RegisterEssentialsOptions(IEssentialsBuilder essentials) in /home/lemon73/Downloads/maui-linux/src/Core/src/Hosting/EssentialsMauiAppBuilderExtensions.cs:line 110
   at Microsoft.Maui.Hosting.EssentialsExtensions.EssentialsInitializer.Initialize(IServiceProvider services) in /home/lemon73/Downloads/maui-linux/src/Core/src/Hosting/EssentialsMauiAppBuilderExtensions.cs:line 131
   at Microsoft.Maui.MauiContextExtensions.InitializeAppServices(MauiApp mauiApp) in /home/lemon73/Downloads/maui-linux/src/Core/src/MauiContextExtensions.cs:line 84
   at Microsoft.Maui.Hosting.MauiAppBuilder.Build() in /home/lemon73/Downloads/maui-linux/src/Core/src/Hosting/MauiAppBuilder.cs:line 159
   at Maui.Controls.Sample.MauiProgram.CreateMauiApp() in /home/lemon73/Downloads/maui-linux/src/Controls/samples/Controls.Sample/MauiProgram.cs:line 304
   at Maui.Controls.Sample.MauiProgram.Main() in /home/lemon73/Downloads/maui-linux/src/Controls/samples/Controls.Sample/MauiProgram.cs:line 48

Essentials でエラーが発生してるっぽいけど…なにこれ…

Lemon73Lemon73

よくわからないので、一旦 Microsoft.Maui-vscode.sln のビルドを目指すことに。

Lemon73Lemon73

iOS でエラーになるので、.sln から削除する。

Lemon73Lemon73
$ dotnet run --project  Microsoft.Maui-vscode.sln 
# (エラー文)
/usr/share/dotnet/sdk/8.0.401/NuGet.targets(174,5): error : 無効なフレームワーク識別子 ''。 [/home/lemon73/Downloads/maui-linux/Microsoft.Maui-vscode.sln]

ビルドに失敗しました。ビルド エラーを修正して、もう一度実行してください。
Lemon73Lemon73

global.json

{
  "sdk": {
    "version": "8.0.401"
  }
}

を追加するも、特に効果はなし。

Lemon73Lemon73

調節したら、別のエラーになった…
結局よくわからない

困難を極める

Lemon73Lemon73

ついに動きました。詳しくは後で書きます。

おそらく、src/Controls/samples/Controls.Sample.Gtk/Controls.Sample.Gtk.csproj は動くので、

dotnet run --project src/Controls/samples/Controls.Sample.Gtk/Controls.Sample.Gtk.csproj --framework net8.0-gtk にします。

(画像の調整の必要あり (後で書く予定))

でも、UI が崩壊しているね… (おそらく仕様)

Lemon73Lemon73

UI が崩壊しているのは、自分の Linux (KDE neon) 内で規定している GTK のテーマカラーが影響しているんじゃないかと思い、テーマカラーを上書きする設定にしたら、予想通り直った。

GTK_THEME=Adwaita:light dotnet run --project src/Controls/samples/Controls.Sample.Gtk/Controls.Sample.Gtk.csproj --framework net8.0-gtk

(GTK_THEME=Adwaita:light を追加)

これで、一通り開発できるわね。既存のアプリケーションへの適応はできなさそうだけど、あとで試してみるかも。(Essential あたりがほぼ実装されてない気がする)

Lemon73Lemon73

xaml での記述は無理かも?だけど、C# ではなんとか記述できるかも

とりあえず、コードの簡略化を進めますよん

Lemon73Lemon73

現状 Mali で作業しているけど、maui-linux のほうが新しいデータが入ってていいかも

Lemon73Lemon73

なんか、maui-linux でビルドしようとすると Graphics とか Essential でエラーが出るねぇ
あと、ios のワークロードが必要的な (Visual Studio なら動かせる?)

やっぱり Mali で動かすことにしよう。(ちょっと古いけど)

Lemon73Lemon73

とりあえず Nuget (追記: 一時的なアップロードだし、GitHub Packages のほうがいいか) にあげてみようかな。ライセンス (MIT License) 的には大丈夫だし。

Lemon73Lemon73

というか GitHub で現在の状況を公開したほうがいいか…?
面倒だからやってないけど

Lemon73Lemon73

とりあえず Nuget (追記: 一時的なアップロードだし、GitHub Packages のほうがいいか) にあげてみようかな。ライセンス (MIT License) 的には大丈夫だし。

ということで、とりあえず Core, Controls.Core, Compatibility の3つを以下のように編集しました。

.csproj
  <PropertyGroup>
    ...
-   <IsPackable>false</IsPackable>
+   <!-- <IsPackable>false</IsPackable> -->
    ...
+   <PackageId>Lemon73.Microsoft.Maui.Controls</PackageId>
+   <Version>0.0.1</Version>
+   <Authors>Lemon73 and others</Authors>
+   <Company>Lemon's Resting Area and others</Company>
  </PropertyGroup>

で Nuget 形式にパックする

dotnet pack src/Compatibility/Core/src/Compatibility.csproj
dotnet pack src/Core/src/Core.csproj
dotnet pack src/Controls/src/Core/Controls.Core.csproj

それを GitHub Packages で頒布

dotnet nuget push "artifacts/*.nupkg" --api-key (API キー) --source "github" --skip-duplicate

で頒布したのが以下のもの (あとで消すと思います。なので将来的にリンク切れするかも)

(なぜかバージョン指定がうまく行っていない気がする)


参考

Lemon73Lemon73

あとで、実際に利用できるか試してみます。

(なぜかバージョン指定がうまく行っていない気がする)

あと、なぜか .net6 になってるので、.net8 でビルドしたい

Lemon73Lemon73

あとで、実際に利用できるか試してみます。

依存関係的にこの3つだけでは動かないっぽい (もしかしたら全部ビルドする必要あるかも)

あと、なぜか .net6 になってるので、.net8 でビルドしたい

これは eng/Version.props を変えれば良さそう (-dev がついているのはよくわからない)

Lemon73Lemon73

やっぱり、Mali は基本的に .net6 ベースだから、.net8 ベースの maui-linux を動かしたいな

Lemon73Lemon73

とりあえず Nuget (追記: 一時的なアップロードだし、GitHub Packages のほうがいいか) にあげてみようかな。

やっぱり、Mali は基本的に .net6 ベースだから、.net8 ベースの maui-linux を動かしたいな

Related: https://github.com/jsuarezruiz/maui-linux/issues/94

この Issue の完了に目標を変更しよう

Lemon73Lemon73

とりあえず Nuget (追記: 一時的なアップロードだし、GitHub Packages のほうがいいか) にあげてみようかな。

やっぱり、Mali は基本的に .net6 ベースだから、.net8 ベースの maui-linux を動かしたいな

Related: https://github.com/jsuarezruiz/maui-linux/issues/94

この Issue の完了に目標を変更しよう

https://github.com/jsuarezruiz/maui-linux/blob/main-linux/eng/pipelines/common/pack.yml これ (Azure Devops 向け) を GitHub Actions 用に調節すれば Pack 部分ができる。あとは、我らが Alice Console (謎の自作構文) の https://github.com/AliceNovel/AliceConsole/blob/main/.github/workflows/nuget.yml を参考にして、Nuget.org にコミットごと+タグごとにリリースさせればいい。

Lemon73Lemon73

現状 Mali で作業しているけど、maui-linux のほうが新しいデータが入ってていいかも

というか GitHub で現在の状況を公開したほうがいいか…?
面倒だからやってないけど

とりあえず Nuget (追記: 一時的なアップロードだし、GitHub Packages のほうがいいか) にあげてみようかな。

やっぱり、Mali は基本的に .net6 ベースだから、.net8 ベースの maui-linux を動かしたいな

Related: https://github.com/jsuarezruiz/maui-linux/issues/94

この Issue の完了に目標を変更しよう

https://github.com/jsuarezruiz/maui-linux/blob/main-linux/eng/pipelines/common/pack.yml これ (Azure Devops 向け) を GitHub Actions 用に調節すれば Pack 部分ができる。あとは、我らが Alice Console (謎の自作構文) の https://github.com/AliceNovel/AliceConsole/blob/main/.github/workflows/nuget.yml を参考にして、Nuget.org にコミットごと+タグごとにリリースさせればいい。

ってことで、maui-linux (Lemon73 Fork) ですわ。

Lemon73Lemon73

やっぱこれか?

https://matrix.to/#/!secXICyMCTWkttVBVC:matrix.org/$uX3kcJ_AITkkFvqne3wkFJUL4_77o_FpfpGos6RphzI?via=matrix.org

# install dotnet 6
sudo apt-get update; \
sudo apt-get install -y apt-transport-https && \
sudo apt-get update && \
sudo apt-get install -y dotnet-sdk-6.0

# add keys
wget https://packages.microsoft.com/config/ubuntu/22.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb
sudo dpkg -i packages-microsoft-prod.deb
rm packages-microsoft-prod.deb

# install gtksharp with dotnet 6 support
git clone https://github.com/trungnt2910/GtkSharp.git
cd GtkSharp
sudo dotnet tool restore
sudo dotnet cake --BuildTarget=InstallWorkload 

# temporary hack for making the templates visible in dotnet new
sudo cp /usr/share/dotnet/template-packs/* /usr/share/dotnet/templates/6.0.5

# install gtk
sudo apt-get install libgtk-3-0

# test gtk template
cd ..
mkdir gtksharptest
cd gtksharptest
dotnet new gtk
dotnet run
Lemon73Lemon73

これを GitHub Actions 上で試してみるか。

git clone https://github.com/trungnt2910/GtkSharp.git
dotnet cake --BuildTarget=InstallWorkload

PowerShell 上で動いているっぽいので。

だめだー

Lemon73Lemon73

実機で動かしてみた感じ

  1. https://github.com/jsuarezruiz/maui-linux/blob/main/.github/workflows/build-gtk.yml (Linux 向けを Windows 向けに調整して動かす) -> だめ
  2. https://github.com/GtkSharp/GtkSharp/blob/develop/.github/workflows/main.yml (ビルドして動かす) -> だめ
  3. https://www.nuget.org/packages/Gtk.Sdk (スクリプト) -> だめ
  4. https://github.com/GtkSharp/GtkSharp/wiki/Installing-Gtk-on-Windows (msys2 使う) -> 未検証
  5. (https://www.nuget.org/packages/Gtk4DotNet -> Linux 専用?)

つまり、今までやっていたことは、CI/CD だからエラーになっているというわけではなく、実機でもだめっぽい。

可能なら、GitHub Actions の Windows 上で WSL を動かしたい。それなら Linux のコマンドが使えるから、1の方法ができるはず。(とはいえ、インストールに時間がかかって、CI/CD がかなり遅くなりそうだから非推奨かな…)

Lemon73Lemon73

可能なら、GitHub Actions の Windows 上で WSL を動かしたい。それなら Linux のコマンドが使えるから、1の方法ができるはず。(とはいえ、インストールに時間がかかって、CI/CD がかなり遅くなりそうだから非推奨かな…)

https://github.com/marketplace/actions/setup-wsl

あるじゃん!!

明日試してみる。WSL でも無理そうなら素直に MSYS2 頑張るか

Lemon73Lemon73

WSL 厳しそう。msys2 を実機でやって、ci にするか

Lemon73Lemon73

どうせ無理だと思うけど、gtk なしで一旦ビルドできるか試してみる?

最終目的はビルドして .nupkg を nuget.org に上げることなので、その過程については特にこだわりはないし

Lemon73Lemon73

何故かパスが通せない。から、逆に dotnet をコピーするか...?

でも、さすがに速度が遅くなりそう

Lemon73Lemon73

ちなみに、MAUI の開発で必須な Microsoft.Maui.ControlsMicrosoft.Maui.Controls.Compatibility の依存関係は以下

Lemon73Lemon73

どうやら Windows でもすべてのターゲット向けのコンパイルは厳しいらしい

https://github.com/jsuarezruiz/maui-linux/blob/c005e3aff8cf64c792f54f7b06b1f9e4ee310f78/.github/DEVELOPMENT.md#available-solutions

(.NET MAUI、クロスコンパイルが弱すぎる)

=> Linux でのビルドに切り替えてみる?

あと、dotnet build ./Microsoft.Maui.BuildTasks.slnf が必要かもしれない。

https://github.com/dotnet/maui/blob/ad6f752f70ce97846fc3e0e4becd0815153fcb1f/.github/DEVELOPMENT.md#building-the-build-tasks

Lemon73Lemon73

あとで、実際に利用できるか試してみます。

依存関係的にこの3つだけでは動かないっぽい (もしかしたら全部ビルドする必要あるかも)

あと、なぜか .net6 になってるので、.net8 でビルドしたい

これは eng/Version.props を変えれば良さそう (-dev がついているのはよくわからない)

-devDirectory.Build.props 内の <PackageVersion> で規定されているからっぽい。

(今の作業とは特に関係ないけど)

Lemon73Lemon73

現在のエラー:

/usr/share/dotnet/sdk/8.0.200/Sdks/NuGet.Build.Tasks.Pack/buildCrossTargeting/NuGet.Build.Tasks.Pack.targets(110,5):
error MSB4018:
System.ArgumentException:
PackageVersion string specified '8.0.40-ci.net8.+sha.59194fc-azdo.' is invalid.
[/home/runner/work/maui-linux/maui-linux/src/Compatibility/Core/src/Compatibility.csproj]

8.0.40-ci.net8 に関しては GitInfo.txt に記載がある。が、これがどこで利用されているのかがよくわからない。

Lemon73Lemon73

現在のエラー:

/usr/share/dotnet/sdk/8.0.200/Sdks/NuGet.Build.Tasks.Pack/buildCrossTargeting/NuGet.Build.Tasks.Pack.targets(110,5):
error MSB4018:
System.ArgumentException:
PackageVersion string specified '8.0.40-ci.net8.+sha.59194fc-azdo.' is invalid.
[/home/runner/work/maui-linux/maui-linux/src/Compatibility/Core/src/Compatibility.csproj]

見つけた

https://github.com/Lemon73-Computing/maui-linux/blob/c005e3aff8cf64c792f54f7b06b1f9e4ee310f78/eng/Versions.targets#L67-L68

$(BUILD_BUILDID) が指定されていないため文字が挿入されず、バージョンの末尾が azdo. のように . で終わってエラーになっている。

Lemon73Lemon73

あとは、maui-linux チームと連絡して調整ってかんじかな。

そういえば nuget package がちゃんと動くかわからないので、後で検証するか (github actions の artifacts にでも入れようかな?)

Lemon73Lemon73

kztao 氏の CI が洗練されているので、それを upstream に merge してもらうといいかも

kztao さんの内容を cherry pick して、自分の変更と合流させた。(これのせいで若干 commit が分かりづらい気がする…)

とりあえず PR: https://github.com/kztao/maui-linux/pull/1

文章とかがめちゃくちゃだけど、ご愛嬌…

返答をお待ちいたしますわ。多分 kztao さんも CI/CD が正常に動いていなくて困っていると思うから、情報共有したいのです。

Lemon73Lemon73

ということで、

@kztao さんからの PR (Nuget.org に、ベータ版の Packages をアップロードする CI/CD の追加)
https://github.com/jsuarezruiz/maui-linux/pull/95

@lemon73 (私) による PR (バージョンアップ)
https://github.com/jsuarezruiz/maui-linux/pull/96
(.NET 9 は STS なので、今回はバージョンアップしない。したほうがいい?[1])

が提出されましたわ。

Review を待ちます

脚注
  1. .NET 7 (STS) のときはバージョンアップされていたような気がする… ↩︎

Lemon73Lemon73

@lemon73 (私) による PR (バージョンアップ)

Review を待ちます

リポジトリの保持者に Review (Approve) されたのに Merge されない謎

Lemon73Lemon73

@kztao さんからの PR (Nuget.org に、ベータ版の Packages をアップロードする CI/CD の追加)

何故か Close する @kztao 氏

Lemon73Lemon73

@kztao さんからの PR (Nuget.org に、ベータ版の Packages をアップロードする CI/CD の追加)

何故か Close する @kztao 氏

再 Open してくれた。

@knocte 氏が担当していると思って Close したっぽい

(なお、Review と Merge してくれない @jsuarezruiz 氏 (maui-linux のリポジトリ管理者))

Lemon73Lemon73

実のところを言うと、ここ数日、maui-linux の開発が再燃しているっぽい (本流 (maui-linux) へのコミットや PR は殆どないが、Mali などの Fork にて)

GitHub 上

  1. @Lemon73 (私) が #94 (プレリリース・リリースを GitHub Actions を使って Nuget.org にリリースする) を対応しようとする
  2. なんか @kztao 氏がいい感じに途中までできているのを見つけ、上流 (maui-linux) に PR を作成してもらう
  3. (同時に @Lemon73 も Dependencies のバージョンアップの PR を作成する)
  4. @webwarrior-ws 氏による Mali への怒涛の PR が始まる (#28, #29, #31, #32)
    (ちなみに、ここは結構ややこしいのですが、@webwarrior-ws 氏のリポジトリ は @Iytico 氏の maui の Fork です。が、@knocte 氏の所持する @nblockchain (organization) の Mali に PR を作成しています。つまり下の図のような感じです)

Element (ウェブチャット) 上

  1. @Lemon73 が maui-linux を WSL2 上で動かす動画を発見し、共有する
  2. @thomiel 氏の要請により @Iytico 氏が mauil-linux の可能性についての Disscussion を開設する: https://github.com/lytico/maui/discussions/291
  3. @thomiel 氏が Docker を利用し、開発環境を簡単に整えられる作業を行う (GtkSharp, maui)

という感じ。(GitHub の4と Element の2-3はほぼ同時期 (今から1週間前くらい) です)

どう変わるか…?

Lemon73Lemon73

どう変わるか…?

何も変わりませんでした。

@jsuarezruiz 氏が Merge してくれません...

Lemon73Lemon73

@lemon73 (私) による PR (バージョンアップ)

Review を待ちます

リポジトリの保持者に Review (Approve) されたのに Merge されない謎

ということで、私の Fork は Merge されました。

CI/CD に関しては、@jsuarezruiz 氏が Nuget の Key をリポジトリに設定するの待ちって感じですね。

(@jsuarezruiz 氏の対応がやや遅めで、全体的に時間がかかってる気がする。メンテナーが1人しかいないから仕方ないけど、結構困るね)

Lemon73Lemon73

@lemon73 (私) による PR (バージョンアップ)

Review を待ちます

リポジトリの保持者に Review (Approve) されたのに Merge されない謎

ということで、私の Fork は Merge されました。

CI/CD に関しては、@jsuarezruiz 氏が Nuget の Key をリポジトリに設定するの待ちって感じですね。

(@jsuarezruiz 氏の対応がやや遅めで、全体的に時間がかかってる気がする。メンテナーが1人しかいないから仕方ないけど、結構困るね)

現状は、何待ち?状態。多分 Review 待ちだけど、うーん…

誰もコメントしていないし、年末で忙しいから取り組めていないだけかな?

Lemon73Lemon73

とりあえず、機能実装に関して検討を行います。

現状簡単そう (私の未熟な技術でもギリギリ開発できそう) なのは Clipboad の実装。

あとは、ListView とか TableViewRadioButton などは必要そう。

Map とかは優先度は低めかな

Lemon73Lemon73

https://github.com/Lemon73-Computing/maui-linux/actions/runs/12490194234/job/34854654286?pr=4

error NU1903: Warning As Error: Package 'System.Net.Http' 4.3.0 has a known high severity vulnerability, https://github.com/advisories/GHSA-7jgj-8wvc-jh57

System.Net.Http に脆弱性が見つかっており、バージョンアップする必要があるけど、どこでバージョン指定しているのかわからない…

System.Net.Http SystemNetHttp 4.3.0 で全文検索したけど、それらしいのはなさそう

Lemon73Lemon73

ちなみに、この Merge がうまく行くと、ベース (本流 .NET MAUI) バージョンが .NET MAUI (for Linux) 界隈で一番最新になる (どうでもいい)

Mali とかは未だに .NET6.0 ベースなので…

Lemon73Lemon73

System.Net.Http に脆弱性が見つかっており、バージョンアップする必要があるけど、どこでバージョン指定しているのかわからない…

System.Net.Http SystemNetHttp 4.3.0 で全文検索したけど、それらしいのはなさそう

っていうか、これは本流では変更されていないのか

Lemon73Lemon73

@lemon73 (私) による PR (バージョンアップ)

Review を待ちます

リポジトリの保持者に Review (Approve) されたのに Merge されない謎

ということで、私の Fork は Merge されました。

CI/CD に関しては、@jsuarezruiz 氏が Nuget の Key をリポジトリに設定するの待ちって感じですね。

(@jsuarezruiz 氏の対応がやや遅めで、全体的に時間がかかってる気がする。メンテナーが1人しかいないから仕方ないけど、結構困るね)

現状は、何待ち?状態。多分 Review 待ちだけど、うーん…

誰もコメントしていないし、年末で忙しいから取り組めていないだけかな?

された 🎉

https://github.com/jsuarezruiz/maui-linux/pull/99

Lemon73Lemon73

Thomas 氏が作成した Docker で作業を進めてみた。

けど、Gtk の表示エラーになるっぽい…

これが解決できれば開発できそう

いろいろ試して、1度成功したけど、再現できなかった…

どうしたら動くんだろうか

Lemon73Lemon73

WSLg のお陰で Windows11 + WSL2 では問題なく動くということはわかっているけど、Docker を使うと動かなくなってしまう。(Docker 外で動かそうとしたけど、それはやや面倒そうな)

Lemon73Lemon73

開発環境を整えること自体が難関すぎる

Lemon73Lemon73

Nix とかで自作環境作るほうがいいかな?

とりあえず、maui-linux の CI/CDDocker を参考に、Nix flake が作れないか試している。

経過段階 (workload の 'gtk' がダウンロードできていない):

{
  description = "MAUI Linux with GtkSharp and .NET 8 SDK";

  inputs = {
    nixpkgs.url = "github:nixos/nixpkgs?ref=nixos-unstable";
  };

  outputs = { self, nixpkgs }: 
    let
      system = "x86_64-linux";
      pkgs = import nixpkgs { inherit system; };
    in {
      devShells.${system}.default = pkgs.mkShell {
        name = "maui-linux-dotnet-sdk";

        buildInputs = [
          pkgs.git
          pkgs.dotnet-sdk_8
        ];

        shellHook = ''
          # Set environment variables for .NET SDK
          export GtkSharpVersion=3.24.24.117-develop
          export DotnetVersion=8.0.200
          # export DOTNET_ROOT=/usr/share/dotnet
          export DOTNET_ROOT=$(which dotnet)
          export DOTNET_DIR=/nix/store/iggzq5cbp9dxzihm2sg6jsg46044v8pr-dotnet-sdk-wrapped-8.0.407/share/dotnet
          # export WORKLOAD_MANIFEST_DIR=$DOTNET_ROOT/sdk-manifests/$DotnetVersion/gtksharp.net.sdk.gtk
          export WORKLOAD_MANIFEST_DIR=$DOTNET_DIR/sdk-manifests/8.0.100/gtksharp.net.sdk.gtk

          # Clone MAUI Linux repository
          echo "## Clone maui-linux repo ##"
          if [ ! -d "$HOME/maui-linux" ]; then
            git clone https://github.com/jsuarezruiz/maui-linux.git $HOME/maui-linux
          fi
          cd $HOME/maui-linux
          sed -i 's/_IncludeAndroid>true/_IncludeAndroid>/g' Directory.Build.Override.props

          echo "## Install Gtk Workload ##"
          dotnet nuget add source --name nuget.org "https://api.nuget.org/v3/index.json"
          wget https://www.nuget.org/api/v2/package/gtksharp.net.sdk.gtk.manifest-$DotnetVersion/$GtkSharpVersion -O gtksharp.net.sdk.gtk.manifest-$DotnetVersion.nupkg
          sudo mkdir -p $WORKLOAD_MANIFEST_DIR
          sudo apt install unzip
          sudo unzip -j gtksharp.net.sdk.gtk.manifest-$DotnetVersion.nupkg "data/*" -d $WORKLOAD_MANIFEST_DIR/
          sudo rm gtksharp.net.sdk.gtk.manifest-$DotnetVersion.nupkg
          sudo chmod 764 $WORKLOAD_MANIFEST_DIR/*
          dotnet workload search
          sudo dotnet workload install gtk --skip-manifest-update

          # dotnet build Microsoft.Maui.BuildTasks.slnf
          # dotnet build Microsoft.Maui.Gtk.slnf
        '';
      };
    };
}

Lemon73Lemon73

Nix とかで自作環境作るほうがいいかな?

とりあえず、maui-linux の CI/CD と Docker を参考に、Nix flake が作れないか試している。

とりあえず、進捗だけ

GtkSharp.Workloadhttps://youtu.be/s-clGkUbk84 を参考に、Nix を作成。

しかし、そこに待ち受けていたのは、昔見た数々のエラーだった!!

{
  description = "MAUI Linux with GtkSharp and .NET 8 SDK";

  inputs = {
    nixpkgs.url = "github:nixos/nixpkgs?ref=nixos-unstable";
  };

  outputs = { self, nixpkgs }: 
    let
      system = "x86_64-linux";
      pkgs = import nixpkgs { inherit system; };
    in {
      devShells.${system}.default = pkgs.mkShell {
        name = "maui-linux-dotnet-sdk";

        buildInputs = [
          pkgs.git
          pkgs.dotnet-sdk_8
          pkgs.gtk3
        ];

        shellHook = ''
          # Set environment variables for .NET SDK
          # export DOTNET_ROOT=/usr/share/dotnet
          # export DOTNET_ROOT=$(which dotnet)
          # export DOTNET_DIR=/nix/store/iggzq5cbp9dxzihm2sg6jsg46044v8pr-dotnet-sdk-wrapped-8.0.407/share/dotnet
          export DOTNET_DIR=$(dirname $(dirname $(which dotnet)))/share/dotnet

          echo "## Install Gtk Workload ##"
          curl -sSL https://raw.githubusercontent.com/HavenDV/Gtk/main/scripts/workload-install.sh | sudo bash /dev/stdin -d $DOTNET_DIR
          dotnet workload list

          # echo "## Install GtkSharp ##"
          # if [ ! -d "$HOME/GtkSharp" ]; then
          #   git clone https://github.com/GtkSharp/GtkSharp.git $HOME/GtkSharp
          # fi
          # cd $HOME/GtkSharp
          # sed -i 's/"8.0.100", "8.0.200"}/"8.0.100", "8.0.200", "8.0.300", "8.0.400"}/g' build.cake  # add missing version bands
          # dotnet tool restore
          # dotnet cake --verbosity=diagnostic --BuildTarget=InstallWorkload 
          # apt update
          apt install -y libgtk-3-dev libgtksourceview-4-0 
          # dotnet new install GtkSharp.Template.CSharp

          echo "## Clone maui-linux repo ##"
          if [ ! -d "$HOME/maui-linux" ]; then
            git clone https://github.com/jsuarezruiz/maui-linux.git $HOME/maui-linux
          fi
          cd $HOME/maui-linux
          sed -i 's/_IncludeAndroid>true/_IncludeAndroid>/g' Directory.Build.Override.props
          # optimize for Gtk
          sed -i 's/IncludeGtkTargetFrameworks Condition="'$(DotNetGtkWorkloadIsInstalled)' == 'true'">/IncludeGtkTargetFrameworks">/g' Directory.Build.props
          sed -i 's/TreatWarningsAsErrors>true/TreatWarningsAsErrors>false/g' Directory.Build.props
          sed -i '/<\/ItemGroup>/N; /<\/ItemGroup>\n  <ItemGroup Condition=.*TargetFramework.Contains(.*>/d' src/Graphics/src/Graphics.Gtk/Graphics.Gtk.csproj
          # build maui-linux
          dotnet build Microsoft.Maui.BuildTasks.slnf
          dotnet build Microsoft.Maui.Gtk.slnf

          # cd src/Controls/samples/Controls.Sample
          # dotnet run --framework net8.0-gtk
        '';
      };
    };
}
# 実行
nix develop
# エラー (抜粋)
/nix/store/6gp2czd71cb3n3d2bp7j6j9acifh4hx2-dotnet-sdk-8.0.407/share/dotnet/sdk/8.0.407/Microsoft.Common.CurrentVersion.targets(2176,5): warning : The referenced project '../../../Controls/src/Core/Controls.SourceGen.csproj' does not exist. [/home/lemon73/maui-linux/src/Controls/samples/Controls.Sample/Maui.Controls.Sample.csproj::TargetFramework=net8.0]
/nix/store/6gp2czd71cb3n3d2bp7j6j9acifh4hx2-dotnet-sdk-8.0.407/share/dotnet/sdk/8.0.407/Sdks/Microsoft.NET.Sdk/targets/Microsoft.NET.TargetFrameworkInference.targets(215,5): error NETSDK1135: SupportedOSPlatformVersion 3.24 cannot be higher than TargetPlatformVersion 1.0. [/home/lemon73/maui-linux/src/BlazorWebView/src/Gtk/Microsoft.AspNetCore.Components.WebView.Gtk.csproj::TargetFramework=net8.0-gtk]
/nix/store/6gp2czd71cb3n3d2bp7j6j9acifh4hx2-dotnet-sdk-8.0.407/share/dotnet/sdk/8.0.407/Sdks/Microsoft.NET.Sdk/targets/Microsoft.NET.TargetFrameworkInference.targets(215,5): error NETSDK1135: SupportedOSPlatformVersion 3.24 cannot be higher than TargetPlatformVersion 1.0. [/home/lemon73/maui-linux/src/BlazorWebView/samples/BlazorGtkApp/BlazorGtkApp.csproj::TargetFramework=net8.0-gtk]
/home/lemon73/maui-linux/src/Essentials/src/Clipboard/Clipboard.Gtk.cs(11,19): error CS0246: The type or namespace name 'Gdk' could not be found (are you missing a using directive or an assembly reference?) [/home/lemon73/maui-linux/src/Essentials/src/Essentials.csproj::TargetFramework=net8.0-gtk]
/home/lemon73/maui-linux/src/Essentials/src/DeviceDisplay/DeviceDisplay.Gtk.cs(42,17): error CS0246: The type or namespace name 'Gdk' could not be found (are you missing a using directive or an assembly reference?) [/home/lemon73/maui-linux/src/Essentials/src/Essentials.csproj::TargetFramework=net8.0-gtk]
/home/lemon73/maui-linux/src/Essentials/src/DeviceDisplay/DeviceDisplay.Gtk.cs(58,17): error CS0246: The type or namespace name 'Gdk' could not be found (are you missing a using directive or an assembly reference?) [/home/lemon73/maui-linux/src/Essentials/src/Essentials.csproj::TargetFramework=net8.0-gtk]
/home/lemon73/maui-linux/src/Essentials/src/DeviceDisplay/DeviceDisplay.Gtk.cs(71,17): error CS0246: The type or namespace name 'Gdk' could not be found (are you missing a using directive or an assembly reference?) [/home/lemon73/maui-linux/src/Essentials/src/Essentials.csproj::TargetFramework=net8.0-gtk]
/home/lemon73/maui-linux/src/Essentials/src/DeviceDisplay/DeviceDisplay.Gtk.cs(73,17): error CS0246: The type or namespace name 'Gdk' could not be found (are you missing a using directive or an assembly reference?) [/home/lemon73/maui-linux/src/Essentials/src/Essentials.csproj::TargetFramework=net8.0-gtk]
/home/lemon73/maui-linux/src/Essentials/src/DeviceDisplay/DeviceDisplay.Gtk.cs(75,17): error CS0246: The type or namespace name 'Gdk' could not be found (are you missing a using directive or an assembly reference?) [/home/lemon73/maui-linux/src/Essentials/src/Essentials.csproj::TargetFramework=net8.0-gtk]
/home/lemon73/maui-linux/src/Essentials/src/DeviceDisplay/DeviceDisplay.Gtk.cs(79,29): error CS0246: The type or namespace name 'Gdk' could not be found (are you missing a using directive or an assembly reference?) [/home/lemon73/maui-linux/src/Essentials/src/Essentials.csproj::TargetFramework=net8.0-gtk]
/home/lemon73/maui-linux/src/Essentials/src/Screenshot/Screenshot.shared.cs(103,40): error CS0246: The type or namespace name 'Gtk' could not be found (are you missing a using directive or an assembly reference?) [/home/lemon73/maui-linux/src/Essentials/src/Essentials.csproj::TargetFramework=net8.0-gtk]
/home/lemon73/maui-linux/src/Essentials/src/Screenshot/Screenshot.shared.cs(110,41): error CS0246: The type or namespace name 'Gtk' could not be found (are you missing a using directive or an assembly reference?) [/home/lemon73/maui-linux/src/Essentials/src/Essentials.csproj::TargetFramework=net8.0-gtk]
/home/lemon73/maui-linux/src/Essentials/src/Screenshot/Screenshot.shared.cs(289,83): error CS0246: The type or namespace name 'Gtk' could not be found (are you missing a using directive or an assembly reference?) [/home/lemon73/maui-linux/src/Essentials/src/Essentials.csproj::TargetFramework=net8.0-gtk]
/home/lemon73/maui-linux/src/Essentials/src/Screenshot/Screenshot.shared.cs(298,84): error CS0246: The type or namespace name 'Gtk' could not be found (are you missing a using directive or an assembly reference?) [/home/lemon73/maui-linux/src/Essentials/src/Essentials.csproj::TargetFramework=net8.0-gtk]
    1 Warning(s)
    13 Error(s)

Time Elapsed 00:00:13.70
Lemon73Lemon73

あと、この状態でビルドすると、以下のようになる

cd src/Controls/samples/Controls.Sample
dotnet run --framework net8.0-gtk
# エラー
The launch profile "(Default)" could not be applied.
A usable launch profile could not be located.
/home/lemon73/maui-linux/src/Essentials/src/DeviceDisplay/DeviceDisplay.Gtk.cs(42,17): error CS0246: The type or namespace name 'Gdk' could not be found (are you missing a using directive or an assembly reference?) [/home/lemon73/maui-linux/src/Essentials/src/Essentials.csproj::TargetFramework=net8.0-gtk]
/home/lemon73/maui-linux/src/Essentials/src/DeviceDisplay/DeviceDisplay.Gtk.cs(58,17): error CS0246: The type or namespace name 'Gdk' could not be found (are you missing a using directive or an assembly reference?) [/home/lemon73/maui-linux/src/Essentials/src/Essentials.csproj::TargetFramework=net8.0-gtk]
/home/lemon73/maui-linux/src/Essentials/src/DeviceDisplay/DeviceDisplay.Gtk.cs(71,17): error CS0246: The type or namespace name 'Gdk' could not be found (are you missing a using directive or an assembly reference?) [/home/lemon73/maui-linux/src/Essentials/src/Essentials.csproj::TargetFramework=net8.0-gtk]
/home/lemon73/maui-linux/src/Essentials/src/DeviceDisplay/DeviceDisplay.Gtk.cs(73,17): error CS0246: The type or namespace name 'Gdk' could not be found (are you missing a using directive or an assembly reference?) [/home/lemon73/maui-linux/src/Essentials/src/Essentials.csproj::TargetFramework=net8.0-gtk]
/home/lemon73/maui-linux/src/Essentials/src/DeviceDisplay/DeviceDisplay.Gtk.cs(75,17): error CS0246: The type or namespace name 'Gdk' could not be found (are you missing a using directive or an assembly reference?) [/home/lemon73/maui-linux/src/Essentials/src/Essentials.csproj::TargetFramework=net8.0-gtk]
/home/lemon73/maui-linux/src/Essentials/src/DeviceDisplay/DeviceDisplay.Gtk.cs(79,29): error CS0246: The type or namespace name 'Gdk' could not be found (are you missing a using directive or an assembly reference?) [/home/lemon73/maui-linux/src/Essentials/src/Essentials.csproj::TargetFramework=net8.0-gtk]
/home/lemon73/maui-linux/src/Essentials/src/Screenshot/Screenshot.shared.cs(103,40): error CS0246: The type or namespace name 'Gtk' could not be found (are you missing a using directive or an assembly reference?) [/home/lemon73/maui-linux/src/Essentials/src/Essentials.csproj::TargetFramework=net8.0-gtk]
/home/lemon73/maui-linux/src/Essentials/src/Clipboard/Clipboard.Gtk.cs(11,19): error CS0246: The type or namespace name 'Gdk' could not be found (are you missing a using directive or an assembly reference?) [/home/lemon73/maui-linux/src/Essentials/src/Essentials.csproj::TargetFramework=net8.0-gtk]
/home/lemon73/maui-linux/src/Essentials/src/Screenshot/Screenshot.shared.cs(110,41): error CS0246: The type or namespace name 'Gtk' could not be found (are you missing a using directive or an assembly reference?) [/home/lemon73/maui-linux/src/Essentials/src/Essentials.csproj::TargetFramework=net8.0-gtk]
/home/lemon73/maui-linux/src/Essentials/src/Screenshot/Screenshot.shared.cs(289,83): error CS0246: The type or namespace name 'Gtk' could not be found (are you missing a using directive or an assembly reference?) [/home/lemon73/maui-linux/src/Essentials/src/Essentials.csproj::TargetFramework=net8.0-gtk]
/home/lemon73/maui-linux/src/Essentials/src/Screenshot/Screenshot.shared.cs(298,84): error CS0246: The type or namespace name 'Gtk' could not be found (are you missing a using directive or an assembly reference?) [/home/lemon73/maui-linux/src/Essentials/src/Essentials.csproj::TargetFramework=net8.0-gtk]

The build failed. Fix the build errors and run again.
Lemon73Lemon73

問題がありそうな Essensial を置換しても変化はない、か。

sed -i 's/Include="..\..\..\Essentials\src\Essentials.csproj"/Include="GtkSharp.Maui.Essentials" Version="8.0.40--date20250228-1034.git-cd7b73d"/g' src/Controls/samples/Controls.Sample/Maui.Controls.Sample.csproj
Lemon73Lemon73
# add GtkSharp package
cd $HOME/maui-linux/src/Essentials/src
dotnet add package GtkSharp
cd $HOME/maui-linux/src/Core/src # こっちは特に関係ないかも
dotnet add package GtkSharp # こっちは特に関係ないかも

を追加することによって、エラーを減らすことに成功した。(まだ動かないが)

# エラー (抜粋)
/nix/store/6gp2czd71cb3n3d2bp7j6j9acifh4hx2-dotnet-sdk-8.0.407/share/dotnet/sdk/8.0.407/Microsoft.Common.CurrentVersion.targets(2176,5): warning : The referenced project '../../../Controls/src/Core/Controls.SourceGen.csproj' does not exist. [/home/lemon73/maui-linux/src/Controls/samples/Controls.Sample/Maui.Controls.Sample.csproj::TargetFramework=net8.0]
/nix/store/6gp2czd71cb3n3d2bp7j6j9acifh4hx2-dotnet-sdk-8.0.407/share/dotnet/sdk/8.0.407/Sdks/Microsoft.NET.Sdk/targets/Microsoft.NET.TargetFrameworkInference.targets(215,5): error NETSDK1135: SupportedOSPlatformVersion 3.24 cannot be higher than TargetPlatformVersion 1.0. [/home/lemon73/maui-linux/src/BlazorWebView/samples/BlazorGtkApp/BlazorGtkApp.csproj::TargetFramework=net8.0-gtk]
/nix/store/6gp2czd71cb3n3d2bp7j6j9acifh4hx2-dotnet-sdk-8.0.407/share/dotnet/sdk/8.0.407/Sdks/Microsoft.NET.Sdk/targets/Microsoft.NET.TargetFrameworkInference.targets(215,5): error NETSDK1135: SupportedOSPlatformVersion 3.24 cannot be higher than TargetPlatformVersion 1.0. [/home/lemon73/maui-linux/src/BlazorWebView/src/Gtk/Microsoft.AspNetCore.Components.WebView.Gtk.csproj::TargetFramework=net8.0-gtk]
/home/lemon73/maui-linux/src/Core/src/Platform/Gtk/WebviewExtensions.cs(2,7): error CS0246: The type or namespace name 'WebKit' could not be found (are you missing a using directive or an assembly reference?) [/home/lemon73/maui-linux/src/Core/src/Core.csproj::TargetFramework=net8.0-gtk]
/home/lemon73/maui-linux/src/Core/src/Platform/Gtk/MauiWebView.cs(5,28): error CS0246: The type or namespace name 'WebKit' could not be found (are you missing a using directive or an assembly reference?) [/home/lemon73/maui-linux/src/Core/src/Core.csproj::TargetFramework=net8.0-gtk]
/home/lemon73/maui-linux/src/Core/src/Handlers/WebView/WebViewHandler.cs(23,23): error CS0311: The type 'Microsoft.Maui.Platform.MauiWebView' cannot be used as type parameter 'TPlatformView' in the generic type or method 'ViewHandler<TVirtualView, TPlatformView>'. There is no implicit reference conversion from 'Microsoft.Maui.Platform.MauiWebView' to 'Gtk.Widget'. [/home/lemon73/maui-linux/src/Core/src/Core.csproj::TargetFramework=net8.0-gtk]
    1 Warning(s)
    5 Error(s)

Time Elapsed 00:00:10.30

なお、エラーの上3つはどうでも良い (目的である src/Controls/samples/Controls.Sample.Gtk/Controls.Sample.Gtk.csproj のビルド時に影響がない) ため、とりあえず無視する。

6番目のは、4、5番目のエラーによって、連鎖的に起こっている。つまり、4、5番のエラー解決を行う必要がある。

Lemon73Lemon73

というか using WebKit; って、Apple の webkit のことだよね…?

どういうこと?

(100コメント目 🎉)

Lemon73Lemon73

Nix のほうは、なんか違う方向に向かっていっている気がするので、一旦 Docker に戻るか

(Nix のほうは、置換をしまくっているけど、本来は置換せずに動くはずなので、間違えていると思う)

Lemon73Lemon73

なお、Docker も GUI を動かすことができないという

Lemon73Lemon73

WSLg の機能で画面を表示することができないから、昔ながらの X Server (X11) を使ってみることにした。(一応、一昨日か昨日から試しているが、再度試してみることに)

  1. VcXsrc を Windows 側で起動
  2. Wi-Fi の IP アドレスを取得 (設定ネットワークとインターネット>Wi-Fi><自分がつなげている Wi-Fi>Ipv4 アドレス (例: 192.168.11.7))
  3. Docker 内で export DISPLAY=<IP アドレス>:0.0 にする (例: 192.168.11.7:0.0)

(今回は sudo docker run -it -e DISPLAY=192.168.11.7:0.0 --rm maui-env bash を使った)

現状、GUI が表示できたというわけではないが、エラーが変わっているので、ほぼ成功だと思う。

# エラー
warn: Microsoft.Maui.FileImageSourceService[0]
      Unable to load image file 'header_background.png'.
      System.InvalidOperationException: Unable to load image file.
         at Microsoft.Maui.FileImageSourceService.GetImageAsync(IFileImageSource imageSource, Single scale, CancellationToken cancellationToken) in /mauienv/maui-linux/src/Core/src/ImageSources/FileImageSourceService/FileImageSourceService.Gtk.cs:line 63
OnCreated
Lemon73Lemon73

VcXsrc の起動設定は -wsl -nc を追加しているけど、必要かはわからない

Lemon73Lemon73

いや、だめだ。

# エラー
warn: Microsoft.Maui.FileImageSourceService[0]
      Unable to load image file 'header_background.png'.
      System.InvalidOperationException: Unable to load image file.
         at Microsoft.Maui.FileImageSourceService.GetImageAsync(IFileImageSource imageSource, Single scale, CancellationToken cancellationToken) in /mauienv/maui-linux/src/Core/src/ImageSources/FileImageSourceService/FileImageSourceService.Gtk.cs:line 63
OnCreated

このエラー自体は、SimpleSampleApp/ExamplePage.cs 内の .png の部分3つをコメントアウトすることで解決できた。

だが、肝心のアプリケーション表示に関しては、VcXsrc のウィンドウが消えただけで、アプリケーションの表示はできていない…

エラーが出ていないが、もはや振り出しだな。

Lemon73Lemon73

難しすぎるので、一旦中断。またやる気が出たらやります。(というか、確か Linux 実機では成功していなかったっけ? Windows11 + WSL2 + Docker の、特に Docker のせいな気がするけど…)

Lemon73Lemon73

Docker のバージョンを上げたら (入れ直したら) すぐに動くようになったんですけどwww

Lemon73Lemon73

参考: https://www.linux.digibeatrix.com/archives/1922

  1. 既存の Docker (docker.io) を削除
sudo apt remove docker docker-engine docker.io containerd runc
  1. Docker の公式リポジトリ (GPG キー) を追加
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
  1. 新しく Docker をインストール
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io
  1. (バージョンの確認)
docker --version
  1. 起動と常時有効化
sudo systemctl start docker
sudo systemctl enable docker
  1. (非 root ユーザーで Docker を使用可能にする)
sudo usermod -aG docker $USER

あとは、https://github.com/Thomas-Mielke-Software/maui-docker/blob/dbf2b9511b59e780a4ffcb1aa7811981bbf397b4/README.md これの通りに

  1. maui-docker のリポジトリを Git でクローン
    (略)
  2. Docker でビルド
sudo docker build -t maui-env .
  1. Docker 環境に入る
sudo docker run -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix --rm -it maui-env bash
  1. Docker 内で maui-linux をビルド
cd /mauienv/maui-linux/src/Controls/samples/Controls.Sample
dotnet run --framework net8.0-gtk
  1. 表示される
    (アプリケーション画面の一部しか表示されていないので、アプリケーション画面のサイズを大きくする)
Lemon73Lemon73

ちなみに、やり直したら、できなくなりました (???)

Lemon73Lemon73

エラー内容

今までのエラーと同じです。

dotnet run --framework net8.0-gtk
The launch profile "(Default)" could not be applied.
A usable launch profile could not be located.
/usr/share/dotnet/sdk/8.0.407/Microsoft.Common.CurrentVersion.targets(2176,5): warning : The referenced project '../../../Controls/src/Core/Controls.SourceGen.csproj' does not exist. [/mauienv/maui-linux/src/Controls/samples/Controls.Sample/Maui.Controls.Sample.csproj::TargetFramework=net8.0-gtk]

(Maui.Controls.Sample:753): Gtk-WARNING **: 06:08:01.745: cannot open display: :0

上の内容は警告なので、一番重要なのは一番下の cannot open display です。

問題解決の糸口

昨日は、成功しているはずなので、昨日の再現をすればよいはずです。

昨日やっていたことを .bash_history から読み取ったところ、以下の内容でした。

ll /tmp/.X11-unix/
x11docker x11docker/fvwm xterm &
ls
x11docker -h
sudo apt install nxagent xpra xephyr
sudo apt install nxagent
clear
x11docker x11docker/xfce xeyes &
sudo x11docker x11docker/fvwm xterm &
docker pull x11docker/fvwm
sudo docker pull x11docker/fvwm
sudo x11docker x11docker/fvwm xterm &
sudo apt install xdpyinfo
clear
x11docker --desktop --size 320x240 x11docker/lxde
sudo x11docker --desktop --size 320x240 x11docker/lxde
sudo apt install xinit
sudo x11docker --desktop --size 320x240 x11docker/lxde
sudo x11docker pull x11docker/lxde
sudo docker pull x11docker/lxde
sudo x11docker --desktop --size 320x240 x11docker/lxde
sudo x11docker 320x240 x11docker/lxde xedit &
sudo x11docker 320x240 x11docker/lxde xedit &
sudo x11docker 320x240 x11docker/lxde xedit
sudo x11docker --desktop --size 320x240 x11docker/lxde
clear
sudo x11docker x11docker/fvwm xterm
sudo x11docker x11docker/lxde xterm
sudo x11docker x11docker/xserver xterm
sudo x11docker x11docker/lxde -d xterm
sudo x11docker x11docker/lxde -d xterm &
sudo x11docker --desktop x11docker/lxde
ls
clear
apt list | grep "docker"
sudo apt remove docker.io docker-compose 
apt list | grep "docker"
sudo apt autoremove
apt list | grep "docker"
clear
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
sudo apt update
sudo apt full-upgrade
sudo apt install docker-ce ocker-ce-cli containerd.io
sudo apt install docker-ce docker-ce-cli containerd.io
docker --version
sudo systemctl start docker
sudo systemctl enable docker
sudo usermod -aG docker $USER
cd /mnt/d/Repo/maui-docker/
ls
docker run -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix --rm -it maui-env bash
sudo docker run -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix --rm -it maui-env bash
exit
jobs
sudo kill 1

昨日は、x11docker を利用して Docker の GUI ができないか試していましたが、無理そうで Docker の入れ直しをして、そちらで成功したという感じです。

コンソールを exit できず、そのさい jobs を確認したところ、x11docker のタスクが起動したままだったのを記憶しています。ここから推察するに、昨日成功していたのは、x11docker で X Window を Docker 向けに起動できていたから、ということになりますね。

ということで、再度起動を試してみます。

Lemon73Lemon73

ここから推察するに、昨日成功していたのは、x11docker で X Window を Docker 向けに起動できていたから、ということになりますね。

これっぽいな

Lemon73Lemon73

関係ないところを切り取ると、こんな感じかな:

ll /tmp/.X11-unix/
sudo apt install nxagent
sudo docker pull x11docker/fvwm
sudo x11docker x11docker/fvwm xterm &
sudo apt install xinit
sudo docker pull x11docker/lxde
sudo x11docker --desktop --size 320x240 x11docker/lxde
sudo x11docker x11docker/fvwm xterm
sudo x11docker x11docker/lxde xterm
sudo x11docker x11docker/lxde -d xterm
sudo x11docker x11docker/lxde -d xterm &
sudo x11docker --desktop x11docker/lxde
Lemon73Lemon73

Docker 使わずに普通の環境でやるか (WSL)

Lemon73Lemon73

無理なんですけど (というか、実機でだめだったから Docker を使っていたことを忘れていた)

Lemon73Lemon73

WSL では Docker on Ubuntu 24.04 (WSL2) on Windows11 とかいう複雑な構成になる (おそらく、これが原因でディスプレイが利用できていない) から、実機 Linux 使おうかな。

(実機 Linux だと問題が起こらないといいけど…)

(まあ、なぜ最初から実機を使わなかったかというと、引っ越しで KDE neon のパソコンが床に有り、ノートパソコンの Windows しか使えなかったという (つまり面倒だっただけ))

Lemon73Lemon73

結論

参考: https://www.linux.digibeatrix.com/archives/1922

(実機を利用する)

  1. 既存の Docker (docker.io) を削除
sudo apt remove docker docker-engine docker.io containerd runc
  1. Docker の公式リポジトリ (GPG キー) を追加
curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo gpg --dearmor -o /usr/share/keyrings/docker-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/docker-archive-keyring.gpg] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" | sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
  1. 新しく Docker をインストール
sudo apt update
sudo apt install -y docker-ce docker-ce-cli containerd.io
  1. (バージョンの確認)
docker --version
  1. 起動と常時有効化
sudo systemctl start docker
sudo systemctl enable docker
  1. (非 root ユーザーで Docker を使用可能にする)
sudo usermod -aG docker $USER

あとは、https://github.com/Thomas-Mielke-Software/maui-docker/blob/dbf2b9511b59e780a4ffcb1aa7811981bbf397b4/README.md これの通りに

  1. maui-docker のリポジトリを Git でクローン
    (略)
  2. Docker でビルド
sudo docker build -t maui-env .
  1. xhost に権限を付与する
xhost +
  1. Docker 環境に入る
sudo docker run -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix --rm -it maui-env bash
  1. Docker 内で maui-linux をビルド
cd /mauienv/maui-linux/src/Controls/samples/Controls.Sample
dotnet run --framework net8.0-gtk
  1. 表示される
    (アプリケーション画面の一部しか表示されていないので、アプリケーション画面のサイズを大きくする)
Lemon73Lemon73

(↑ちなみに、WSL で xhost + を実行しましたが、使えませんでした)

Lemon73Lemon73

なんか、実機 Linux 内の Docker の調子が悪いので、対処方を表示します:

エラー調査

sudo docker run ()
# エラー
docker: Cannot connect to the Docker daemon at unix:///var/run/docker.sock. Is the docker daemon running?

Run 'docker run --help' for more information

詳細

sudo dockerd
# エラー
INFO[2025-04-11T18:05:14.026075204+09:00] Starting up                                  
failed to start daemon, ensure docker is not running or delete /var/run/docker.pid: process with PID 119907 is still running

対処法

sudo rm /var/run/docker.pid /var/run/docker.sock 
systemctl restart docker
Lemon73Lemon73

?????

(Maui.Controls.Sample:388): Gtk-WARNING **: 09:12:19.548: cannot open display: :1

実機でも使えなくなったんですけど???

Lemon73Lemon73

Docker の代わりに podman 使ったらできた!!

Lemon73Lemon73

Root 権限が不要なことや、デーモンが必要ないことが関係してそう (詳しくはよくわからないけど)

Lemon73Lemon73

最終形:

# Podman をインストール
sudo apt install podman

# 任意
# sudo apt install podman-compose podman-docker
# ビルド
sudo podman build -t maui-env .

# 必要ないかも
# xhost +

# 実行
sudo podman run -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix --rm -it maui-env bash
# Podman 内
cd /mauienv/maui-linux/src/Controls/samples/Controls.Sample
dotnet run --framework net8.0-gtk
Lemon73Lemon73

開発の意義について

再確認ですが、最終的な目標としては"既存の MAUI のコードから Linux 向けにビルドできるようにする"ことです。

(望み薄ですが、可能であれば maui-linux を dotnet/maui に Merge してほしいです)

ベースについて

現在の maui-linux は GtkSharp (Gtk3) ベースです。可能であれば最新版である Gtk4 (Gir.core など) を利用すべきですが、換装に相当の時間がかかると思うので、そのまま開発を進めたほうが良いと思います。(そもそも Gir.core ベースにするには、Gir.core の workload を作成しなければならない (dotnet workload の作成方法についての公式ドキュメントはほぼない))

全く違うものをベースにするという案も挙げておきます。Skia とか Slik.NET とかでしょうか。または Qt とかでしょうか。それぞれを評価すると、Skia は現在の dotnet/maui でも Graphics で利用されています。また、Qt はほぼ C# バインディングがない (Qt.Net とかはメンテナンスがされていない) ので、厳しそうです。Slik.NET は描画がほとんどで、コントロールがないので、Gtk の代替とはならないでしょう。(どちらかというと、Skia の代替?)

とか考えると、妥協で GtkSharp で開発し続けるのが最短でしょうね。将来性を考えるなら Gir.core ですが、maui-linux の登場からあまりに時間が経っているので、そろそろ使えるようにしたいと思っていまして。

Lemon73Lemon73

Docker の代わりに podman 使ったらできた!!

最終形:

# Podman をインストール
sudo apt install podman

# 任意
# sudo apt install podman-compose podman-docker
# ビルド
sudo podman build -t maui-env .

# 必要ないかも
# xhost +

# 実行
sudo podman run -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix --rm -it maui-env bash
# Podman 内
cd /mauienv/maui-linux/src/Controls/samples/Controls.Sample
dotnet run --framework net8.0-gtk

ってことで、今までの成果を作成: maui-podman (maui-docker の fork)

Lemon73Lemon73

VSCode で開発するとき:

# Podman は Docker とは違い、標準では Socket が起動しないので、手動起動させる
systemctl --user enable --now podman.socket
export DOCKER_HOST=unix:///run/user/1000/podman/podman.sock

podman run -dit --name maui-env maui-env
podman exec -it maui-env bash
# (なんか DISPLAY とかの設定しなくても動いた)

VSCode

  1. F1 でコマンドパレットを開く
  2. Dev Containers: Attach to Running Container...
  3. maui-env を選択

(Dev Container を使ったら、Podman ではなく、純正 Docker でも行けるかも)

Lemon73Lemon73

現在の maui-linux は GtkSharp (Gtk3) ベースです。可能であれば最新版である Gtk4 (Gir.core など) を利用すべきですが、換装に相当の時間がかかると思うので、そのまま開発を進めたほうが良いと思います。(そもそも Gir.core ベースにするには、Gir.core の workload を作成しなければならない (dotnet workload の作成方法についての公式ドキュメントはほぼない))

(中略)

とか考えると、妥協で GtkSharp で開発し続けるのが最短でしょうね。将来性を考えるなら Gir.core ですが、maui-linux の登場からあまりに時間が経っているので、そろそろ使えるようにしたいと思っていまして。

  1. maui-linux の実装をしようとする
  2. gtk3 の実装を見てみる
  3. GtkSharp では実装が足りていない
  4. GtkSharp の最近の PR は小規模なものでも Merge されていない (つまり、開発が活発でないどころか、不可能)
  5. 無理

なので、gir.core でワークロードから作り直しですね。(マジか...)

(ちなみに、gir.core は半機械的に開発されているらしいので、実装がほとんどできているらしい)

Lemon73Lemon73

Maui のテンプレートに Gtk を導入することは可能なのか試してみる。

基本は dotnet new maui のテンプレートと同じ。.csprojPlatforms/Gtk/Main.cs (の代わりとして Program.cs) のみ以下のように変更・追加。

<!-- MauiTemplate.csproj -->
<Project Sdk="Microsoft.NET.Sdk">

	<PropertyGroup>
		<TargetFrameworks>net8.0-gtk</TargetFrameworks>
		<!--
		<TargetFrameworks>net9.0-android;net9.0-ios;net9.0-maccatalyst</TargetFrameworks>
		<TargetFrameworks Condition="$([MSBuild]::IsOSPlatform('windows'))">$(TargetFrameworks);net9.0-windows10.0.19041.0</TargetFrameworks>
		-->
		<!-- Uncomment to also build the tizen app. You will need to install tizen by following this: https://github.com/Samsung/Tizen.NET -->
		<!-- <TargetFrameworks>$(TargetFrameworks);net9.0-tizen</TargetFrameworks> -->

		<!-- Note for MacCatalyst:
		The default runtime is maccatalyst-x64, except in Release config, in which case the default is maccatalyst-x64;maccatalyst-arm64.
		When specifying both architectures, use the plural <RuntimeIdentifiers> instead of the singular <RuntimeIdentifier>.
		The Mac App Store will NOT accept apps with ONLY maccatalyst-arm64 indicated;
		either BOTH runtimes must be indicated or ONLY macatalyst-x64. -->
		<!-- For example: <RuntimeIdentifiers>maccatalyst-x64;maccatalyst-arm64</RuntimeIdentifiers> -->

		<OutputType>Exe</OutputType>
		<RootNamespace>MauiTemplate</RootNamespace>
		<UseMaui>true</UseMaui>
		<SingleProject>true</SingleProject>
		<ImplicitUsings>enable</ImplicitUsings>
		<Nullable>enable</Nullable>

		<!-- Display name -->
		<ApplicationTitle>MauiTemplate</ApplicationTitle>

		<!-- App Identifier -->
		<ApplicationId>com.companyname.mauitemplate</ApplicationId>

		<!-- Versions -->
		<ApplicationDisplayVersion>1.0</ApplicationDisplayVersion>
		<ApplicationVersion>1</ApplicationVersion>

		<!-- To develop, package, and publish an app to the Microsoft Store, see: https://aka.ms/MauiTemplateUnpackaged -->
		<WindowsPackageType>None</WindowsPackageType>

		<!--
		<SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'ios'">15.0</SupportedOSPlatformVersion>
		<SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'maccatalyst'">15.0</SupportedOSPlatformVersion>
		<SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'android'">21.0</SupportedOSPlatformVersion>
		<SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'windows'">10.0.17763.0</SupportedOSPlatformVersion>
		<TargetPlatformMinVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'windows'">10.0.17763.0</TargetPlatformMinVersion>
		<SupportedOSPlatformVersion Condition="$([MSBuild]::GetTargetPlatformIdentifier('$(TargetFramework)')) == 'tizen'">6.5</SupportedOSPlatformVersion>
		-->
	</PropertyGroup>

	<ItemGroup>
		<!-- App Icon -->
		<MauiIcon Include="Resources\AppIcon\appicon.svg" ForegroundFile="Resources\AppIcon\appiconfg.svg" Color="#512BD4" />

		<!-- Splash Screen -->
		<MauiSplashScreen Include="Resources\Splash\splash.svg" Color="#512BD4" BaseSize="128,128" />

		<!-- Images -->
		<MauiImage Include="Resources\Images\*" />
		<MauiImage Update="Resources\Images\dotnet_bot.png" Resize="True" BaseSize="300,185" />

		<!-- Custom Fonts -->
		<MauiFont Include="Resources\Fonts\*" />

		<!-- Raw Assets (also remove the "Resources\Raw" prefix) -->
		<MauiAsset Include="Resources\Raw\**" LogicalName="%(RecursiveDir)%(Filename)%(Extension)" />
	</ItemGroup>

	<ItemGroup>
		<PackageReference Include="GtkSharp" Version="3.24.24.117-develop" />
		<PackageReference Include="GtkSharp.Maui.Resizetizer" Version="8.0.40--date20250228-1034.git-cd7b73d" />
		<PackageReference Include="GtkSharp.Maui.Core" Version="8.0.40--date20250228-1034.git-cd7b73d" />
		<PackageReference Include="GtkSharp.Maui.Graphics" Version="8.0.40--date20250228-1034.git-cd7b73d" />
		<PackageReference Include="GtkSharp.Maui.Essentials" Version="8.0.40--date20250228-1034.git-cd7b73d" />
		<PackageReference Include="GtkSharp.Maui.Controls.Compatibility" Version="8.0.40--date20250228-1034.git-cd7b73d" />
		<PackageReference Include="GtkSharp.Maui.Controls.Xaml" Version="8.0.40--date20250228-1034.git-cd7b73d" />
		<PackageReference Include="GtkSharp.Maui.Controls.Core" Version="8.0.40--date20250228-1034.git-cd7b73d" />
		<PackageReference Include="GtkSharp.Maui.Graphics.Skia" Version="8.0.40--date20250228-1034.git-cd7b73d" />
		<PackageReference Include="GtkSharp.Maui.Graphics.Gtk" Version="8.0.40--date20250228-1034.git-cd7b73d" />
		<PackageReference Include="GtkSharp.Maui.Graphics.Text.Markdig" Version="8.0.40--date20250228-1034.git-cd7b73d" />
		<PackageReference Include="GtkSharp.Maui.Controls.Build.Tasks" Version="8.0.40--date20250228-1034.git-cd7b73d" />
		<PackageReference Include="GtkSharp.Maui.AspNetCore.Components.WebView" Version="8.0.40--date20250228-1034.git-cd7b73d" />
		<PackageReference Include="GtkSharp.Maui.AspNetCore.Components.WebView.Gtk" Version="8.0.40--date20250228-1034.git-cd7b73d" />
		<!--
		<PackageReference Include="Microsoft.Maui.Controls" Version="$(MauiVersion)" />
		-->
		<PackageReference Include="Microsoft.Extensions.Logging.Debug" Version="9.0.0" />
	</ItemGroup>

</Project>
// Platforms/Gtk/Main.cs の代わりの Program.cs
// 参考: https://github.com/jsuarezruiz/maui-linux/blob/cd7b73d839fcf59619ecd1ddc543d658534427ae/src/Controls/samples/Controls.Sample/Platforms/Gtk/Main.cs
using System;
using Microsoft.Maui;
using Microsoft.Maui.Hosting;

namespace MauiTemplate;

class Program : MauiGtkApplication
{
	protected override MauiApp CreateMauiApp() => MauiProgram.CreateMauiApp();

	static void Main(string[] args)
	{
		var app = new Program();
		app.Run(args);
	}
}

ビルド:

dotnet run -f=net8.0-gtk

エラー:

/home/lemon73/Repo/maui-linux/MauiTemplate/Program.cs(8,17): error CS0246: 型または名前空間の名前 'MauiGtkApplication' が見つかりませんでした (using ディレクティブまたはアセンブリ参照が指定されていることを確認してください) [/home/lemon73/Repo/maui-linux/MauiTemplate/MauiTemplate.csproj::TargetFramework=net8.0-gtk]

ビルドに失敗しました。ビルド エラーを修正して、もう一度実行してください。

エラーになっている、MauiGtkApplication は、Microsoft.Maui の Core (https://github.com/jsuarezruiz/maui-linux/blob/cd7b73d839fcf59619ecd1ddc543d658534427ae/src/Core/src/Platform/Gtk/MauiGtkApplication.cs#L10) に含まれている。が、これは <PackageReference Include="GtkSharp.Maui.Core" Version="8.0.40--date20250228-1034.git-cd7b73d" /> の宣言で、含まれているはずなので、エラーになるのは謎。

Lemon73Lemon73

(Platforms/Gtk/Main.cs にすると動かないが、Program.cs にしたら動くので、とりあえずこの際は無視する)

Lemon73Lemon73

ちなみに、<ProjectReference Include="../maui-linux/src/Core/src/Core.csproj" /> (maui-linux 本体のパッケージを利用) にしても、同じエラーですわね。

これは Issue に報告しましょうか。(最近動きがないので、影響があるかはわからないけど)

Lemon73Lemon73

ちなみに、これができたら、Template の開発ができそう (とか思ったり)

Lemon73Lemon73

これは Issue に報告しましょうか。(最近動きがないので、影響があるかはわからないけど)

https://github.com/jsuarezruiz/maui-linux/issues/103

https://github.com/jsuarezruiz/maui-linux/issues/102

今までは Issue にコメントや反応がついていたものの、ついにそれらもつかなくなりましたね…

もう、もはやこのプロジェクトは凍結したか…

とりあえず、何かしらの PR を作成し、Matrix の方でもコメントしてみましょうかね。

Lemon73Lemon73

とりあえず、何かしらの PR を作成し、Matrix の方でもコメントしてみましょうかね。

もし、本当に反応がなかったら…

Iytico 氏が長年注視し続けてきたこの計画も、もうもはやここまで、でしょうか…

(私が開発を続けられても、レビューやマージしれくれる人がいなかったら全く意味がないので)

Lemon73Lemon73

なかなかに時間かかりましたが、ここに私の技術力の全てが…

これで、PR 全くされなかったら草

Lemon73Lemon73

MauiGtkApplication (#103) でも研究するか

(とりあえず、これを完了して Gtk3 版の MVP (最低限実装) し、次 Gtk4 版の開発したい)

Lemon73Lemon73

とりあえず、何かしらの PR を作成し、Matrix の方でもコメントしてみましょうかね。

もし、本当に反応がなかったら…

Iytico 氏が長年注視し続けてきたこの計画も、もうもはやここまで、でしょうか…

なかなかに時間かかりましたが、ここに私の技術力の全てが…

これで、PR 全くされなかったら草

Review される気配がなくて草

Lemon73Lemon73

とりあえず、何かしらの PR を作成し、Matrix の方でもコメントしてみましょうかね。

もし、本当に反応がなかったら…

Iytico 氏が長年注視し続けてきたこの計画も、もうもはやここまで、でしょうか…

なかなかに時間かかりましたが、ここに私の技術力の全てが…

これで、PR 全くされなかったら草

Review される気配がなくて草

してくれました 🎉

ありがとう!!

修正しますわ。

Lemon73Lemon73

今日はあんまり時間がないから、明日進める予定です

Lemon73Lemon73

今日はあんまり時間がないから、明日進める予定です

すいません、今日思ったよりも忙しかったので、進められませんでした。

今、若干忙しいので、次の作業日がいつになるかは未定です…。

Lemon73Lemon73

今日はあんまり時間がないから、明日進める予定です

すいません、今日思ったよりも忙しかったので、進められませんでした。

今、若干忙しいので、次の作業日がいつになるかは未定です…。

https://github.com/jsuarezruiz/maui-linux/pull/106/commits/7386830459fa943735bb9a4f62bc1dfc6408352b

更新したけど、ちゃんと動いているのかよくわからん (サンプル内に UpdateBackground 使ってる実装なくね?)

テストコードってある?

Lemon73Lemon73

https://github.com/jsuarezruiz/maui-linux/pull/107

以前から気になっていた脆弱性問題を修正した。(けど、謎の要因により CI/CD が直らない)

ちなみに、これは本家 .NET MAUI でも修正されていなさそうなので、手がかりがない… (CI/CD を直さないと、Nuget が更新できないので困っているけど)

Lemon73Lemon73

今後の予定 (仮)

  • .NET 10 リリース (2025年11月) に合わせて Gtk3 版をリリースしたい
  • .NET 11/12 リリース (2026/27年11月) に合わせて Gtk4 (Gtk5) 版をリリースしたい

Qt を使う案

かなり前に調べたがダメそう。(再度調べ直したが、特に状況は変わっていなかった)

  • QML.NET - 死んでる (5年前から更新がない)
  • Qt.Sharp - 死んでる (同上)
  • qtdotnet - Qt 公式の試験的プロジェクトだが、おそらく C# 向けのバインディングではない

Gtk 実装

https://en.wikipedia.org/wiki/List_of_language_bindings_for_GTK

何故か Gtk4 以降の C# 用公式バインディングがない。(Gir.Core[1] に期待)

脚注
  1. https://github.com/uriegel/Gtk4DotNet/issues/1 これ見て、かなり熱心だと思った ↩︎

Lemon73Lemon73

https://github.com/jsuarezruiz/maui-linux/pull/107

以前から気になっていた脆弱性問題を修正した。(けど、謎の要因により CI/CD が直らない)

これは全体的な修正によって直した

MauiGtkApplication 謎に動かない

よくわからないので、名前を MauiApplication.cs にでもしてみようかしら

これは、試してみたけど意味なさそう

https://github.com/Lemon73-Computing/maui-linux/pull/18

他の方法を模索する必要がある (が、目星はついていない)

(関係ないが、おそらく Platform/Gtk/* を動かせないのは Resouces が実装されていないから。Workload の変更によって変わるかな…?)

Lemon73Lemon73

(なお、Jsuarezruiz 氏の Review が遅い気がするが…)

リアルが忙しいかもしれないが、CI/CD の方だけでも Merge してほしい…

Lemon73Lemon73

(なお、Jsuarezruiz 氏の Review が遅い気がするが…)

リアルが忙しいかもしれないが、CI/CD の方だけでも Merge してほしい…

とりあえず、Review/Merge 待ちかな。

MauiGtkApplication と maui-gtk workload については研究を続けよう

Lemon73Lemon73

そして、

https://github.com/MauiGtk

すべてのポータルとして GitHub Organization を作りましたと。(設立: Lemon73、メンバー: Thomiel、trungnt2910 (現状)

可能なら、maui-linux 関連の Repository をすべてここに移管したい

Lemon73Lemon73

メンバー

  • 🇯🇵 Lemon73 (@Lemon73-Computing)
  • 🇩🇪 Thomas Mielke (@thomiel)
  • 🇻🇳 Trung Nguyen (@trungnt2910)

招待中

  • 🇩🇪 Marcel Tiede (@badcel)
  • 🇪🇸 Javier Suárez (@jsuarezruiz)
  • (?) lytico (@lytico)
Lemon73Lemon73

(なお、Jsuarezruiz 氏の Review が遅い気がするが…)

リアルが忙しいかもしれないが、CI/CD の方だけでも Merge してほしい…

とりあえず、Review/Merge 待ちかな。

こんなに時間がかかると、Microsoft の非公開情報で、公式に対応する (完全別プロジェクトとして) ではと考えてしまう。(パッチが無意味になるので嬉しくない)

Lemon73Lemon73

メンバー

  • 🇯🇵 Lemon73 (@Lemon73-Computing)
  • 🇩🇪 Thomas Mielke (@thomiel)
  • 🇻🇳 Trung Nguyen (@trungnt2910)

招待中

  • 🇩🇪 Marcel Tiede (@badcel)
  • 🇪🇸 Javier Suárez (@jsuarezruiz)
  • (?) lytico (@lytico)

Javier 氏もさっき加入したっぽい

Lemon73Lemon73

メンバー

  • 🇯🇵 Lemon73 (@Lemon73-Computing)
  • 🇩🇪 Thomas Mielke (@thomiel)
  • 🇻🇳 Trung Nguyen (@trungnt2910)

招待中

  • 🇩🇪 Marcel Tiede (@badcel)
  • 🇪🇸 Javier Suárez (@jsuarezruiz)
  • (?) lytico (@lytico)

Javier 氏もさっき加入したっぽい

Marcel Tiede 氏も加盟してくれました。

lytico 氏は、そもそも GitHub の更新が少なく、あんまり使っていなさそうなので、招待されていること自体に気づいていなさそう。

Lemon73Lemon73

メモ

https://github.com/Thomas-Mielke-Software/maui-docker/pull/2#issuecomment-3069216982

One of the benefit is that we can use the environment without git clone. This is good for people who want to try sample application (gtk version).

# Uses Docker Images (podman) - This patch
$ time podman pull ghcr.io/lemon73-computing/maui-podman:lemon73-github-packages

real    5m18.713s
user    2m2.183s
sys     1m18.869s

$ time sudo podman run -it --rm -e
 DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix
 -t ghcr.io/lemon73-computing/maui-podman:lemon73-
github-packages dotnet run --framework net8.0-gtk

real    0m34.368s
user    0m0.007s
sys     0m0.001s
# Build from source (podman)
$ time podman build --no-cache -t maui-env .

real    7m1.856s
user    4m53.546s
sys     1m50.149s

$ time sudo podman run -it --rm -e DISPLAY=$DISPLAY -v /tmp/.X11-unix:/tmp/.X11-unix -t maui-env dotnet run --framework net8.0-gtk

real    0m39.274s
user    0m0.010s
sys     0m0.000s

<!--
Actually, I was thinking the way (Docker Packages) is faster than build from source, however my prediction was wrong. It is not fast.

これのメリットとしては、このリポジトリをクローンせずに利用できるということにある。クローンや docker での build の手順を減らせるので、サンプルアプリケーションだけを試しに動かしてみたい人には向いていると思って作成した。

Packages にすることでビルドにかかる時間を減らせると思っていたが、実際に試してみたらかなり時間がかかることがわかった。(多少 pull のほうが早いが、計測方法の微妙な違いによるものかもしれない。また、2回目以降はキャッシュされるため、全体にそれほど影響はないだろう)

なので、前半に説明した、クローンなしのメリットを取るなら Merge してほしいし、メンテナンスが大変だと思うなら Close して欲しい。

速度向上を期待していたが、残念ながら速度に関しては圧倒的な差は見られなかった。
-->

Lemon73Lemon73

このスレが作られてから、10ヶ月にもなるのか…

この10ヶ月という期間で、かなりコミュニティーが進歩したのではないかと感じています。

Lemon73Lemon73

現状確認/今後の指針 (Lemon73 視点)

2025年6月-現在

日付 人物 出来事
2025/6/6 Thomas 氏 maui-docker が実用段階に[1] (2024/11/22 に一応動いている[2])
2025/6/15 Lemon73 RadioButton の実装 (#106)[3]
2025/6/29 Lemon73/Thomas 氏/Marcel 氏 長期開発計画提案[4]
2025/7/3 Marcel 氏 Gir.Core メンテナー登場[5]
2025/7/8 Thomas 氏/Lemon73 CVE-2025-26646 問題/パッチ (#107)[6]
2025/7/11 Lemon73/Thomas 氏 GitHub Organization (MauiGtk) 設立提案/設立[7]
2025/7/16 Thomas 氏 maui-docker を MauiGtk へ移行[8]
2025/7/24 Lemon73 MauiGtk 独自の maui リポジトリ設置を提案[9]

今後の方針

  1. GtkSharp (GTK 3) + .NET 8 - 初の安定版
  2. GtkSharp (GTK 3) + .NET 10 - 新しい LTS に対応した安定版
  3. Gir.Core (GTK 4 or 5) + .NET 10 (or later) - GTK 3 のサポート終了を見越して + 新しいコントロールの利用

参照: https://matrix.to/#/!secXICyMCTWkttVBVC:matrix.org/$CrWKwd2oA92ZLk1KaBAIC4xSVdJw0NmiRYcbR9ttndE

リポジトリ

歴史/経緯

  1. 元々プロジェクトの分散を避けるため、Javier 氏の maui-linux リポジトリに新機能などを集中させるつもりだった。(元々は Thomas 氏で、私もその考えに同意していた)
  2. #106、#107、#108 などの PR を提出するもレビューが遅く、Merge を待っていたら開発が進まないと感じる。(あとは、CI/CD による Nuget のアップロード関係なども独自で行いたいと考えるようになった)
  3. Thomas 氏と相談し、MauiGtk コミュニティーに maui リポジトリを新設することに決定。(本家 maui をベースとし、新設しようと考えていた。が、Thomas 氏は私の maui-linux を MauiGtk に移管するのが良さそうと言っており、私はどちらでも良かったので、Thomas 氏の考えに賛同する)
  4. lytico 氏の maui を取り込むべきかなどを相談中。(Thomas 氏によると、lytico 氏の Fork は多少先行しているらしい)

結果

MauiGtk コミュニティーに設置 (Lemon73-Computing から移管) する maui-linux で開発をすることと決定した。

(maui-linux だと、Javier 氏のリポジトリとややこしいので、maui-gtk にしてもいいかも)

開発環境

主に Thomas 氏が担当。

dotnet cake[10] で動くようにしている?らしい。

Docker 作ってくれた Thomas 氏に感謝 🎉

脚注
  1. https://matrix.to/#/!secXICyMCTWkttVBVC:matrix.org/$HQTMKbT5QgZO1Vdc_6faBofJus6MN6248g5nqd2_ahU ↩︎

  2. ウィンドウ関係が難しく、私は podman を使うことで2025年5月頃に初めて動かせた記憶。https://matrix.to/#/!secXICyMCTWkttVBVC:matrix.org/$j62vPEUdCbHaZ8HGx7S5yBN5aY_Nxu-QOXHDyDZt5HU ↩︎

  3. https://matrix.to/#/!secXICyMCTWkttVBVC:matrix.org/$KViOj68RhdATpHxvZgV0z6kEB8sUCAW7rr04jTwahEw ↩︎

  4. https://matrix.to/#/!secXICyMCTWkttVBVC:matrix.org/$1G3Q0AtmpQxrFCTmYhCIchBmAFEJxhnKseA4mJMQ53M ↩︎

  5. https://matrix.to/#/!secXICyMCTWkttVBVC:matrix.org/$MUijbRAYNYv58cc9afuRSo98jG5gOOlAbjuZGiq0Ldw ↩︎

  6. https://matrix.to/#/!secXICyMCTWkttVBVC:matrix.org/$ARL0xmQua8DLch-eSmpuuRdlLpvAkGszgSVonOayp8I ↩︎

  7. https://matrix.to/#/!secXICyMCTWkttVBVC:matrix.org/$185qycm_tgwd5-S6Du0Ly6utWwBdPZKBibaDNa8gVu0 ↩︎

  8. https://matrix.to/#/!secXICyMCTWkttVBVC:matrix.org/$PvJKO3Avr1wwALjy4QgqgvBnnTiGXAPEGXgAwDHnyBw ↩︎

  9. https://matrix.to/#/!secXICyMCTWkttVBVC:matrix.org/$30A2gqtBbxzXmhl0f3wqIaUCb1hHHwGYjRu29ww-9HU ↩︎

  10. https://matrix.to/#/!secXICyMCTWkttVBVC:matrix.org/$UkkKKKdnM8ac7ovU0McWcB7X-I8dQq0P25cKcie1bwI ↩︎

Lemon73Lemon73

Javier 氏に対し、maui-linux を MauiGtk Community に移管してほしいと要望を出す予定です。(おそらく返答はないでしょうが、maui-linux リポジトリの Issue で)

[Draft] 内容

Title: (提案) Repository を MauiGtk Community に移管する

私達 MauiGtk Community は、maui-linux の完成を求めており、開発やコミュニティーの形成に力を注いでいます。主要なリポジトリは、主にこの maui-linux と、lytico 氏の maui です。しかし、両方ともアクティブな状態ではなく、私が作成した PR の Review や Merge は止まっています。

もともと、MauiGtk Community 独自に maui-gtk のリポジトリを作成することも考えていましたが、以下の理由から、移管してほしいと考えています。

  • リポジトリを新規に作成した場合、分散するから (maui-linux 関連のリポジトリが複数あると、開発者やユーザーが混乱する可能性が高く、それを避けたいため)
  • リポジトリの場所を統一したい (MauiGtk Community の GitHub Organization に統一することで、開発しやすくなる)
  • 活発化のため (先述の通り、このリポジトリでの開発が停滞しているため)
  • Nuget の統合 (仮のアイデア。Nuget の場所を統一できたらよさそう)
  • 知名度が高い (Star 数が多いので)
  • Issues がある

以上の目的とし、移管の検討を行ってほしいです。

もちろんあなたのリポジトリなので、移管しないのでも構いませんが、その場合はより活発な開発やレビューをお願いしたいです。

Lemon73Lemon73

(まあ、本来はこのような要求 (個人のリポジトリをコミュニティーに譲る) をすべきでないでしょうが、もともと Microsoft の実質 (事実上) 公認 (唯一) の"コミュニティー"のはずなので、活発な方に移動してもらったほうがいいと考えています)

Lemon73Lemon73

Lemon73:
あまり活発でないリポジトリの保持者に、移管を呼びかけることは問題あるでしょうか


ChatGPT:
ご質問ありがとうございます。
結論から申し上げますと、「礼儀と配慮を持って行えば、問題はありません」。ただし、いくつかの点に注意する必要があります。

🔹 目的と背景を明確にする

移管をお願いする理由を丁寧に説明しましょう。たとえば:

プロジェクトに関心があり、今後もメンテナンスを続けていきたい

IssueやPRが放置されており、利用者の不便が増している

コミュニティの関心が続いているにもかかわらず、更新が止まっている

このように、リポジトリの将来を前向きに考えているという姿勢を示すと、受け入れられやすくなります。

🔹 表現の仕方に注意する

強く迫るような言い方や、非難と受け取られるような言い回しは避けましょう。以下のような言い方が無難です:

「素晴らしいリポジトリを公開してくださり、ありがとうございます。最近更新が止まっているようでしたので、もしご都合がつかないようであれば、今後のメンテナンスを引き継がせていただけないかと思い、ご連絡差し上げました。」

🔹 相手の権利を尊重する

GitHubのリポジトリは基本的に作成者の所有物ですので、断られた場合はそれに従う必要があります。また、フォークして独自にメンテナンスするという選択肢もあります。これによりオリジナルを尊重しつつ、利用者のニーズに応えることが可能です。

🔹 GitHubのルールとの整合性

GitHubの利用規約には、アクティブでないプロジェクトの乗っ取り(takeover)を防ぐためのガイドラインがあります。ただし、正当なコミュニケーションを通じて同意を得る形で移管を依頼するのはルール違反ではありません。

Lemon73Lemon73

FYI

移管してほしい主要な理由

  • レビューに時間がかかっている (移管してくれたら、私自身や Thomiel 氏の判断で Merge できる)
  • リポジトリや情報の分散を避け、集中させられる (現在は MauiGtk Community で保持しているのは maui-docker のみで、本体の保持ができていない)

移管を断られた場合の妥協案

  1. 本家 maui を fork (maui-gtk とする)
  2. .NET8 のタグを checkout し、新しい branch を作成 (net8-gtk3 とする)
  3. net8-gtk3 に対し、maui-linux の最新版を PR、Merge する
  4. (必要なら) net8-gtk3 に対し、lytico/maui の最新版を PR、Merge する
  5. 私が作成した CI/CD 修正や RadioButton 追加を PR、Merge する
Lemon73Lemon73

時差…!!

(ドイツ勢 (Thomiel 氏/Marcel 氏) と時差があるので、やり取りに時間がかかってしまう。どうしようもないけど…!)

世界標準時 日本 ドイツ
+0:00 (UTC) +9:00 (JST) +1:00 (CET)
Lemon73Lemon73

再考します。

[Draft] GitHub Issue

Title

[Request] Repository を MauiGtk Community に移管する

Description

私達 MauiGtk Community は、.NET MAUI に GTK のコントロールを追加することで Linux などの OS 対応を増やすことを目的とし、開発やコミュニティーの形成に力を注いでいます。

現在このリポジトリ、maui-linux では Issue に対する PR が少なく、また PR の Review や Merge が遅れているように見受けられます。CI/CD はエラーとなっており、Nuget の更新も行われていません。私たち MauiGtk Community は開発継続を行いたいにもかかわらず、更新が止まっている状況です。

また、現在はリポジトリの場所が分散しています。本体である maui-linux はここに、環境構築を行える maui-docker は MauiGtk Community に場所が異なっています。

以上、

  • maui-linux の更新が止まっている
  • maui-linux 関係のリポジトリの場所がバラバラ

であることから、よろしければ、この maui-linux を MauiGtk Community に移管し、メンテナンスを引き継がせていただけないかと考えています。

(MauiGtk Community がこのリポジトリや本家 maui を fork することも考えましたが、リポジトリが分散し、開発者たちが混乱すること、すでに知名度が高いこと (Star 数) や Issue があることから、移管が最善だと考えました)

ご検討のほど、よろしくおねがいします。

Lemon73Lemon73

よろしくお願いします。

https://github.com/jsuarezruiz/maui-linux/issues/109

無反応か、断られるかもしれませんね。(私だったら、そうするかもしれません)

彼は元々 (2022年ごろは) GTK 対応には前向きだったため、少しですが、期待をしています。(Microsoft の内部でも GTK サポートの話をしていたらしいですが、その後良いニュースがないので、反発を受けたのではないかと思っています)

今までメンテナンスを続けてきてくれた彼に敬意を。

Lemon73Lemon73

Javier 氏に対し、maui-linux を MauiGtk Community に移管してほしいと要望を出す予定です。

よくよく考えると、大胆すぎる

Lemon73Lemon73

さあ、どうなるでしょうか。

今週はちょっとリアルのほうが忙しく、こちらの作業を進められないと思います。3日-1週間ほど経っても反応がなさそうだったら、諦めて Fork を作りましょうか。

Lemon73Lemon73

Javier 氏に対し、maui-linux を MauiGtk Community に移管してほしいと要望を出す予定です。

さあ、どうなるでしょうか。

今週はちょっとリアルのほうが忙しく、こちらの作業を進められないと思います。3日-1週間ほど経っても反応がなさそうだったら、諦めて Fork を作りましょうか。

1週間たち、2人 (mikelor 氏と、bronteq 氏 (知らない人)) から 👍 を頂きましたが、相変わらず本人からは反応はありませんでした。

1週間待っても反応がないので、流石に MauiGtk Community 独自でリポジトリを保持することに決めました。[1]

Thomiel 氏の要望通り、私が保持していた Lemon73-Computing/maui-linux のブランチを整理し、MauiGtk Community に移管することで、MauiGtk/maui-linux となりました。

残念ですが。

脚注
  1. Javier 氏は現在 maui 本体の開発を活発に行なっており、また MauiGtk のメンバーとしても参加しているため、通知を見れていないというわけでもなさそうです…。リポジトリの移管については彼の自由であり、移管しなかったとしても彼を批判するつもりはありませんが、反応くらいして欲しかったです。 ↩︎

Lemon73Lemon73

Thomiel 氏が (秘匿) を進めてくれているようなので、彼の活動を支援します。

Lemon73Lemon73

時差…!!

(ドイツ勢 (Thomiel 氏/Marcel 氏) と時差があるので、やり取りに時間がかかってしまう。どうしようもないけど…!)

世界標準時 日本 ドイツ
+0:00 (UTC) +9:00 (JST) +1:00 (CET)

Summer Time だと…!?

Lemon73Lemon73

英語が喋れないのが足かせになりそう (日本だと機会がないので仕方ない気もするが、世界的にはやばいかも)

Lemon73Lemon73

英語が喋れないのが足かせになりそう (日本だと機会がないので仕方ない気もするが、世界的にはやばいかも)

Lemon73、英語マスターしろ (?)

Lemon73Lemon73

内部情報なので詳細は隠しますが、Javier 氏、意外に前向きだな…!

(実は設立してすぐから MauiGtk に入ってくれているし、これは嘘ではなさそう)

Lemon73Lemon73

英語が喋れないのが足かせになりそう (日本だと機会がないので仕方ない気もするが、世界的にはやばいかも)

Lemon73、英語マスターしろ (?)

Thomiel 氏が「MauiGtk の開発者、全員英語ネイティブじゃないし、翻訳システムみたいの使おう!」と言ってくれているのでありがたい。

実際→

メンバー

  • 🇯🇵 Lemon73 (@Lemon73-Computing)
  • 🇩🇪 Thomas Mielke (@thomiel)
  • 🇻🇳 Trung Nguyen (@trungnt2910)
  • 🇩🇪 Marcel Tiede (@badcel)
  • 🇪🇸 Javier Suárez (@jsuarezruiz)
  • (?) lytico (@lytico)

なお、時差が7-9時間程度ある模様 (ミーティングの際に若干厄介な問題)

Lemon73Lemon73

内部情報なので詳細は隠しますが、Javier 氏、意外に前向きだな…!

個人的には、やっぱり maui-linux のリポジトリを MauiGtk に移管してほしい