C# REPL GUI Shell, Mono gsharp を Ubuntu に入れようとすると発生するエラーを回避する

Pocket

.NET Core の登場で大分影が薄くなったものの、 まだまだ Xamarin でガンガン使われている Mono。
この Mono には, gsharp という C# GUI Shell が存在する。

CUI 版の Shell と比べると、 グラフがプロットできるとか、 画像が手軽に表示できるといったメリットしかないが、タブ補完も効くし、まぁ便利っちゃ便利なツールだ。

しかし Windows で gsharp を動かしたくても、 Windwos 用の Mono インストーラには gsharp が入っていないため、そのままでは gsharp を使えない。
このため、 WSL の Ubuntu に gsharp をインストールして、 VcXsrv などの X Server を使って動かすのが手っ取り早い。

以下の記事が詳しい。

ところが、 この gsharp などを含む、 Mono 拡張 GUI ツールを、 WSL を含む Ubuntu ベースのディストリビューションにインストールしようとすると、エラーになってしまう。

今回は、 その暫定的な回避策について。

TL;DR

早く mono/mono#16322 の不具合直した Mono パッケージを出してくれ。

Ubuntu に mono-tools-gui をインストールしようとすると、依存関係エラー

基本的に、 WSL だろうと ピュアな Ubuntu だろうと、インストール手順は変わらない。

前述の Mono Project の記事では、 GUI ツールは mono-tools というパッケージでインストールすると記載されているが、 Ubuntu では mono-tools-gui というパッケージ名で登録されている。

Download - Stable | Mono / Ubuntu の案内に従ってインストールしようとすると、以下のような依存関係エラーが発生する。

$ sudo apt install gnupg ca-certificates
$ sudo apt-key adv --keyserver hkp://keyserver.ubuntu.com:80 --recv-keys 3FA7E0328081BFF6A14DA29AA6A19B38D3D831EF
$ echo "deb https://download.mono-project.com/repo/ubuntu stable-bionic main" | sudo tee /etc/apt/sources.list.d/mono-official-stable.list
$ sudo apt update
$ sudo apt install mono-devel mono-tools-gui

Some packages could not be installed. This may mean that you have
requested an impossible situation or if you are using the unstable
distribution that some required packages have not yet been created
or been moved out of Incoming.
The following information may help to resolve the situation:

The following packages have unmet dependencies:
 mono-tools-gui : Depends: libmono-cecil-private-cil (< 6.4.0.171) but 6.4.0.198-0xamarin3+ubuntu1804b1 is to be installed
E: Unable to correct problems, you have held broken packages.

2019-10-25 時点の mono-tools-gui のパッケージの依存関係を見てみると、

$ apt depends mono-tools-gui
mono-tools-gui
[...]
  Depends: libmono-cecil-private-cil (>= 6.4.0.170)
  Depends: libmono-cecil-private-cil (<< 6.4.0.171)

6.4.0.170 のピンポイントの依存関係が書かれているのだが、 そんなバージョン存在しないため、 エラーになっているようだ。
依存関係の ">=" とか "<<" の意味は Debian Policy Manual / 7. Declaring relationships between packages に書いてある。

何故 =6.4.0.170 と書かないのか。 << 6.4.0 としてバグフィックスバージョンが上がるのを許容しようとしていた?
うーん、 依存関係定義のバグっぽい。

調べてみると、 Mono 6.0 系 も同じバグ (>= 6.0.0.313, << 6.0.0.314 の依存関係が定義されているのに、 存在するのは 6.0.0.319 以降のバージョン) がある。

過去のバージョンのスナップショット を確認してみたところ、 Mono 5.18 系 まで遡れば不具合なくインストールできるようなので、 mono-tools-gui は 5.18系で、 Mono 自体は最新版でインストールしてみよう。

バージョンを指定してパッケージをインストールしたい

Ubuntu や Debian 用の Mono のリポジトリでは、 各パッケージの最新 のみ が載っているリストがリリース毎に用意され、 その最新のリストのシンボリックリンクを参照する構造になっている。
(何故そのような仕組みなのかはよく知らないが…)

例えば、 Ubuntu 18.04 向けに登録している Mono のパッケージソースは
deb https://download.mono-project.com/repo/ubuntu stable-bionic main
となっているが、 これは 2019年10月 現在、
deb https://download.mono-project.com/repo/ubuntu stable-bionic/snapshots/6.4.0.198 main
への参照となっている。

このため、 インストール手順に書かれたリポジトリ設定では、 mono-tools-gui の 5.18系 のバージョンを探そうにも、そのようなバージョンはみつからない。

これを解消するためは、以下のように 5.18系 のリストを書き足してやればよい。

$ echo -e "deb https://download.mono-project.com/repo/ubuntu stable-bionic/snapshots/5.18 main\ndeb https://download.mono-project.com/repo/ubuntu stable-bionic main" | sudo tee /etc/apt/sources.list.d/mono-official-stable.list
$ sudo apt update

上記は Ubuntu 18.04 の場合だが、 例えば 16.04 であれば bionic の部分をを xenial に読み替えるなど、 他の Ubuntu / Debian / Raspbian ディストリビューションの場合は適度に読み替えてくれ。

次に、 apt list -a で 5.18 のスナップショットに登録されている mono-tools-gui のバージョンを確認する。

$ apt list -a mono-tools-gui
Listing... Done
mono-tools-gui/stable-bionic 4.2-3xamarin3+ubuntu1804b1 all
mono-tools-gui/bionic 4.2-2.2 all
mono-tools-gui/bionic/snapshots/5.18.1.3 4.2-2xamarin12+ubuntu1804b1 all

4.2-2xamarin12+ubuntu1804b1 というバージョンだということがわかった。
(これも、ディストリビューションが異ればバージョンの名前も異なるので、適宜読み替えてくれ)

最後に apt install で バージョン指定した mono-tools-gui と、 最新の mono-devel をインストールすれば、無事 gsharp がインストールされる。

sudo apt install mono-tools-gui=4.2-2xamarin12+ubuntu1804b1 mono-devel

原因

この問題に関する Issue は、すでに mono/mono#16322 に立っている。
Ubuntu のパッケージの依存バージョンを Debian のものにしてしまうと言う、 Mono Project 内のビルドツールによるものらしい。

Issue はクローズされているが、 その後にリリースされた 6.4.0.198 でも不具合が残っている。

さっさと直して欲しい。。。

コメントを残す

メールアドレスが公開されることはありません。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください