• 作成:
  • 更新:

GentooとEmacsでC#(Unity)開発

  • omnisharp-emacsはデフォルトでomnisharpをダウンロードする
    • しかし最新版を手で指定してやらないと動作しない模様
  • dotnetコマンドを使えばslnファイルは作れる
    • Gentooだとdev-dotnet/dotnetcore-sdk-bin
  • OmniSharpがシンタックスエラーは表示しますが型エラーが表示されない
  • 何故か動くようになりました

EmacsでC#(Unity)のプログラムを書く

Gentooにunity-editorをインストールしたいなら今はdidactic-duckを使う - ncaq

OmniSharp/omnisharp-emacs: Troll coworkers - use Emacs at work for csharp! をインストールします. omnisharp-emacsにはGitHubからomnisharpのサーバプログラムをダウンロードする機能がついているので, 自前でビルドしてインストールする必要はありません. ~/.emacs.d/.cacheにインストールするのでgit管理している人は除外しておきましょう.

バージョンをカスタム変数に手動で指定すれば最新バージョンもインストール出来ます.

しかしこれを起動しようとしてもslnファイルを要求されます.

Unity 2018はslnファイルを新規プロジェクト作成時に作ってくれないようです.

Unity 2018はmonodevelopを同梱しなくなったようなのでmonodevelopを別途インストールしてみます.

公式リポジトリからはmonodevelopが消滅したようなのでdotnetオーバーレイをインストールします.

sudo emerge monodevelop

xspとgnome-sharpのビルドに失敗します.

見てみると生成コードが壊れていたりするので最新版だと直ってそうだと判断してunmaskします.

package.keywordsに書きます.

=dev-dotnet/gnome-sharp-9999 **
=www-servers/xsp-9999 **

monodevelopをインストールしてもUnityがslnを作らないようなので, とりあえずslnファイルが存在すればomnisharpが動くか試してみようと思いました. monodevelopでHello Worldするコンソールプロジェクトを作りました.

しかし動きません.

[19:45:22] Starting OmniSharpServer using project folder/solution file: /home/ncaq/Projects/foo/foo.sln
[19:45:22] Using server binary on /home/ncaq/.emacs.d/.cache/omnisharp/server/v1.32.5/run
[19:45:22] INFORMATION: OmniSharp.Stdio.Host, Starting OmniSharp on gentoo 0.0 (x64)
[19:45:22] INFORMATION: OmniSharp.Services.DotNetCliService, DotNetPath set to dotnet
[19:45:23] INFORMATION: OmniSharp.MSBuild.Discovery.MSBuildLocator, Located 1 MSBuild instance(s)
            1: StandAlone 15.0 - "/home/ncaq/.emacs.d/.cache/omnisharp/server/v1.32.5/omnisharp/msbuild/15.0/Bin"
[19:45:23] INFORMATION: OmniSharp.MSBuild.Discovery.MSBuildLocator, MSBUILD_EXE_PATH environment variable set to '/home/ncaq/.emacs.d/.cache/omnisharp/server/v1.32.5/omnisharp/msbuild/15.0/Bin/MSBuild.dll'
[19:45:23] INFORMATION: OmniSharp.MSBuild.Discovery.MSBuildLocator, Registered MSBuild instance: StandAlone 15.0 - "/home/ncaq/.emacs.d/.cache/omnisharp/server/v1.32.5/omnisharp/msbuild/15.0/Bin"
            MSBuildExtensionsPath = /usr/lib/mono/xbuild
            BypassFrameworkInstallChecks = true
            CscToolPath = /home/ncaq/.emacs.d/.cache/omnisharp/server/v1.32.5/omnisharp/msbuild/15.0/Bin/Roslyn
            CscToolExe = csc.exe
            MSBuildToolsPath = /home/ncaq/.emacs.d/.cache/omnisharp/server/v1.32.5/omnisharp/msbuild/15.0/Bin
            TargetFrameworkRootPath = /usr/lib/mono/xbuild-frameworks
[19:45:23] INFORMATION: OmniSharp.Cake.CakeProjectSystem, Detecting Cake files in '/home/ncaq/Projects/foo'.
[19:45:23] INFORMATION: OmniSharp.Cake.CakeProjectSystem, Could not find any Cake files
[19:45:23] INFORMATION: OmniSharp.WorkspaceInitializer, Project system 'OmniSharp.DotNet.DotNetProjectSystem' is disabled in the configuration.
[19:45:23] INFORMATION: OmniSharp.MSBuild.ProjectSystem, Detecting projects in '/home/ncaq/Projects/foo/foo.sln'.
[19:45:23] INFORMATION: OmniSharp.MSBuild.ProjectManager, Queue project update for '/home/ncaq/Projects/foo/foo/foo.csproj'
[19:45:23] INFORMATION: OmniSharp.Script.ScriptProjectSystem, Detecting CSX files in '/home/ncaq/Projects/foo'.
[19:45:23] INFORMATION: OmniSharp.Script.ScriptProjectSystem, Could not find any CSX files
[19:45:23] INFORMATION: OmniSharp.WorkspaceInitializer, Invoking Workspace Options Provider: OmniSharp.Roslyn.CSharp.Services.CSharpWorkspaceOptionsProvider
[19:45:23] INFORMATION: OmniSharp.WorkspaceInitializer, Configuration finished.
[19:45:23] INFORMATION: OmniSharp.Stdio.Host, Omnisharp server running using Stdio at location '/home/ncaq/Projects/foo' on host -1.
[19:45:23] INFORMATION: OmniSharp.MSBuild.ProjectManager, Loading project: /home/ncaq/Projects/foo/foo/foo.csproj
[19:45:24] WARNING: OmniSharp.MSBuild.ProjectLoader, Unable to create directory "/x86/Debug/". Access to the path "/x86" is denied.
[19:45:24] WARNING: OmniSharp.MSBuild.ProjectLoader, Could not write state file "/x86/Debug/foo.csprojAssemblyReference.cache". Could not find a part of the path "/x86/Debug/foo.csprojAssemblyReference.cache".
[19:45:24] ERROR: OmniSharp.MSBuild.ProjectLoader, Could not write lines to file "/x86/Debug/foo.csproj.CoreCompileInputs.cache". Could not find a part of the path "/x86/Debug/foo.csproj.CoreCompileInputs.cache".
[19:45:24] WARNING: OmniSharp.MSBuild.ProjectManager, Failed to load project file '/home/ncaq/Projects/foo/foo/foo.csproj'.
[19:45:24] ERROR: OmniSharp.MSBuild.ProjectManager, Attemped to update project that is not loaded: /home/ncaq/Projects/foo/foo/foo.csproj

Unable to create directory "/Debug/". Access to the path "/Debug/" is denied. · Issue #1168 · OmniSharp/omnisharp-roslyn

によるとmsbuildをインストールすれば治るらしいのですがこちらでは治りません. Archのmsbuildのバージョンが15.8でこちらは15.3なのが悪いのでしょうか?

USEフラグが不足しているのでしょうか.

debug以外の全てのUSEフラグを有効にしてみます.

変わりませんね知ってました.

sln生成をするにはdotnet new sln

OmniSharpが読み込めないのはほっておいて, とりあえずslnファイルを作ることにしました

Visual Studio Codeを使う(失敗)

出来ないことを唸っていたらVSCodeを使って生成することを教えてもらいました.

diary/08.md at master · yuya373/diary

Visual Studio Codeを使ってUnityプロジェクトのslnを作ってみます.

visual-studio-codeは何故かGentooの公式リポジトリに入ってませんが, miramirオーバーレイとか導入すれば普通にインストールできます.

しかし参考資料と異なりOpen C# ProjectでVSCodeで開いてもプロジェクトファイルは生成されませんね.

リンク先をみたらC#エクステンションをインストールしろと書いてありますね.

VSCodeを開いてからC#ソースコードを開いてみたらomnisharpがダウンロードされて, dotnet SDKをインストールしろと言われました. dev-dotnet/dotnetcore-sdkで良いのかな…?

lldbが依存関係にあって時間がかかるから家に帰ってインストール作業します.

インストールに失敗したのでビルドしないバージョンの dev-dotnet/dotnetcore-sdk-bin をインストールしてみます.

ダメですね. 変わらずsln生成もomnisharpのエラー修正もできません.

dotnet CLIで生成

command line interface - How to create Solution file with dotnet core CLI - Stack Overflow

によるとdotnet new slnでslnが生成されるらしいです.

プロジェクトルートに移動して

dotnet new sln

でslnが生成できました.

それによって生成されたslnを読み込むと, omnisharpがシンタックスエラーを報告してくれます.

companyもちゃんと型に応じた補完を行ってくれます.

何故かEmacsではうまく行ってVSCodeではうまく行かないのですが.

VSCodeの設定全部消してやり直しましたがエラーは表示されないままですね.

と思ったらEmacsでも動かなくなった. 何故だ…?

(custom-set-variables '(omnisharp-expected-server-version "1.32.5"))

しないと動かないようです.

古いバージョンが何かに未対応なようですね.

Emacsのcsharpの設定

;; -*- lexical-binding: t -*-

(custom-set-variables '(omnisharp-expected-server-version "1.32.5"))

(add-hook 'csharp-mode-hook 'omnisharp-mode)

(with-eval-after-load 'company
  (add-to-list 'company-backends 'company-omnisharp))

(defun omnisharp-setup-ncaq ()
  (define-key omnisharp-mode-map (kbd "C-c C-a") 'omnisharp-run-code-action-refactoring)
  (define-key omnisharp-mode-map (kbd "C-c C-c") 'omnisharp-build-in-emacs)
  (define-key omnisharp-mode-map (kbd "C-c C-r") 'omnisharp-rename)
  (define-key omnisharp-mode-map (kbd "C-c C-s") 'omnisharp-start-omnisharp-server)
  (define-key omnisharp-mode-map (kbd "M-.") 'omnisharp-go-to-definition)
  )

(add-hook 'omnisharp-mode-hook 'omnisharp-setup-ncaq)

OmniSharpが型エラーを表示してくれない

OmniSharpによりエラー報告がされるようになったのは良いのですが, OmniSharpが報告してくれるのはシンタックスエラーだけで, 型エラーは表示してくれないようです.

型エラーをUnity側だけでビルドする時にチェックするだけだと流石にだるいです.

仕方がないのでWindowsでやります

unity-editorが再生するとクラッシュするので諦めが出てきました. Linux版はまだベータ未満だということなのでしょう.

問題はLinuxかどうかではなくEmacsかどうかなので, さほど問題になりません.

Windowsに全く手を付けてませんでしたがセットアップすることにします.

MSYS2あたりで整えれば良いでしょう.

Windows版でも型エラーは表示されない

WindowsでNTEmacsを使って簡単にGNU/Linux版の環境をほぼ再現しました.

helm-locateでesコマンドを使うのに少し手間取りました. esコマンドを使うにはEverythingを起動して, esコマンドラインを別にダウンロードしてパスの通った場所に置く必要があるのですね.

日本語入力を確定する時C-mを使うと漢字がコマンドとして認識されてうまく入力されませんが, まあとりあえずは良いでしょう.

しかしWindowsでomnisharpを使ってもシンタックスエラーは表示されますが, 型エラーはやはり表示されないのですね.

しかもVisual Studio Codeを使うとシンタックスエラーすら表示されません. どうもOmniSharpが有効になっていないようなのですが, 有効にする方法がわかりません.

OmniSharpは型チェックしないのかと思いましたがネット情報では別にそんなことはないようです.

Unity で Sublime Text3 を使う (Unity + SublimeText + OmniSharp) - Qiita

静的なチェック (関数の引数の型間違い,数間違い,存在しない変数名のエラー) 4. その他便利機能(定義に飛んだり)

というかmonodevelopで開いてみましたが型エラー表示されません. どうなってるんですかこれ.

しかも

dotnet build

してもエラーにならず,

dotnet run

したら初めて変数が存在しないエラーが表示されます.

これじゃ動的型付け言語と変わらないじゃないですかーやだー.

もしかして

/opt/dotnet_core/sdk/2.1.302/NuGet.targets(114,5): warning : Unable to find a project to restore! [/home/ncaq/Downloads/myApp/myApp.sln]

と表示されるのって目的のソースコードがプロジェクトに存在しないって意味なんですかね?

正常なソースコードにしてdotnet runしたら標準出力が行われるので, 認識していないとは思えないのですが…

試しに全部消してみて

dotnet new console -o myApp

して存在しない変数を参照してみたら

dotnet build

でエラー表示するようにはなりました. OmniSharpはエラー表示してくれないままのようですが.

dotnet new sln

でslnを生成したらまた

/opt/dotnet_core/sdk/2.1.302/NuGet.targets(114,5): warning : Unable to find a project to restore! [/home/ncaq/Downloads/myApp/myApp.sln]

と出してくるようになりました.

型チェックを行う方法が全くわからない

OmniSharpで型チェックを行う方法が全くわかりません. Emacsがダメなのかと思ってVSCodeも試しましたが, VSCodeはもっと酷くシンタックスチェックすら行ってくれません.

リアルタイムチェックを行ってくれない静的型付け言語なんて, きあいのタスキを持っていないデオキシスみたいなものです.

誰か行う方法を教えてくれませんか, 切に困っています.

2年前ぐらいにF#を試してみようとしてインストールが難しすぎて諦めましたが, あのころから変わらず.NET言語はVisual Studio以外に厳しいということなのでしょうか. MS謹製のVisual Studio Codeにも厳しいとは思ってもいませんでした.

追記

そのあとWindowsとUnityで開発したら普通に型チェックも表示されましたし, メソッドのオムニ補完も行われました. 当初動かなかったのは何だったんでしょう. 謎です.