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

  • 0
    いいね
  • 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

    最後に

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