macでdotnetのSDKやmonoのバージョンをシステムレベルで変えたいときにやったこと

  • 2
    いいね
  • 0
    コメント

正しいやり方ではおそらくないです
以下の方法を実行し起こったいかなる問題,損害に対して私は一切の責任を負いません

外部のビルドスクリプトで dotnet コマンドや, mono を参照したり mcs コマンドを実行するライブラリを導入することがあった時,
そのライブラリのビルドはこのバージョンじゃないとエラーになるみたいなことがありました.
そのためどのようにシステムで指し示すバージョンを変えるかを調べてみました.

dotnet の sdk の場合

dotnet の sdk をあるバージョンに固定したり,指定したりする場合はプロジェクトのルートディレクトリに global.json を置いて

{ 
  "sdk": {
    "version": "1.0.0-preview2-003121"
  }
}

のようにすることでそのプロジェクトで使用するバージョンを固定したりすることができますが,ライブラリ側がそういった対応をしていなければシステムの sdk のバージョンを変えるのが一番手っ取り早いです.

mac ユーザで配布されているインストーラを使用してインストールいているのであれば, /usr/local/share/dotnet/ 以下に dotnet 関連のあれこれがインストールされていると思います.
そのディレクトリの sdk というディレクトリを見ると,今までにインストールした各 sdk が以下のような状態で格納されています.

drwxr-xr-x  127 root  wheel   4.2K  1 25 12:06 1.0.0-rc4-004616
drwxr-xr-x   50 root  wheel   1.7K  6 22  2016 1.0.0-preview2-003121
drwxr-xr-x   50 root  wheel   1.7K 10 18 06:04 1.0.0-preview2-003148
drwxr-xr-x   50 root  wheel   1.7K 12  1 07:14 1.0.0-preview2-003156
drwxr-xr-x   51 root  wheel   1.7K 11 11 10:09 1.0.0-preview2-1-003177

この状態で dotnet のバージョンなどを調べるために dotnet --info を実行してみると

.NET Command Line Tools (1.0.0-rc4-004616)

Product Information:
 Version:            1.0.0-rc4-004616
 Commit SHA-1 hash:  56d8071361

Runtime Environment:
 OS Name:     Mac OS X
 OS Version:  10.11
 OS Platform: Darwin
 RID:         osx.10.11-x64
 Base Path:   /usr/local/share/dotnet/sdk/1.0.0-rc4-004616

最新の 1.0.0-rc4-004616 が読まれているようです.
この最新バージョンをどのようにして取得しているのかはまだ調べていませんが,このバージョンは先頭に何かしら文字列を加えてしまえば無効なものとみなされ無視されることがわかりました.

そのため少し前のバージョンである 1.0.0-preview2-1-003177 を使いたいという場合は,それよりもバージョンが上である 1.0.0-rc4-004616 をリネームしてしまえばいいのです.
私は 1.0.0-rc4-004616 -> _1.0.0-rc4-004616のように,先頭にアンダースコアを入れる形で対策しています.

この状態で dotnet --info を実行すると

.NET Command Line Tools (1.0.0-preview2-1-003177)

Product Information:
 Version:            1.0.0-preview2-1-003177
 Commit SHA-1 hash:  a2df9c2576

Runtime Environment:
 OS Name:     Mac OS X
 OS Version:  10.11
 OS Platform: Darwin
 RID:         osx.10.11-x64

と目的のものに変えることができました.

ですが,さらに古いバージョンにしたいとなるといくつも上のバージョンをリネームする必要があって非常に面倒です.
というわけで簡単な変更スクリプトを書いたのでこれを使えばいいんじゃないかなと思います.
https://gist.github.com/yamachu/3cce558ee49e40a8c8ff7fd7da2793c7
要Python3.6 以上なのですが,3.6で導入された f'1 + 1 = {1+1}'みたいなフォーマット指定のものに使っているだけなので, そこを書き換えてPython3.5 以上であれば動作すると思います.

動作としてはこんな感じです.
dotnet_switch.gif

mono のバージョンに関して

以前 Visual Studio for Macをインストールしてmono4.8+が無いと怒られた時の対処法という記事で使った対処法と同じで,
/Library/Frameworks/Mono.framework/Versions/Currentの指す先を変えてしまえばひとまずは問題なさそうだったので,この方法を採用しています.
[追記]
本当の正しいやり方はこれのようです
Parallel Mono Environments

これも面倒だったので上記と同じようなスクリプトにしました.
https://gist.github.com/yamachu/faec9bbe5bbe21ab814f1ad59e8cbb84

以下動作例
mono_switch.gif

最後に

正しいやり方があれば教えていただけると幸いです.