窓を作っては壊していた人のブログ

この謎のブログタイトルの由来を知るものはもういないだろう

VSCodeでの.NETアプリ開発の知見(随時追加

問題 - ローカル環境変数設定 - エディタ周り

状況

プログラム内で環境変数が欲しい時があって,そのプロジェクトのデバッグの時とか使う時のみで設定したい. VSCode内のTaskでsourceとかしてもデバッガ起動する時の設定のlaunch.jsonを実行するshellは別物だから環境変数が引き継がれないという問題に直面.

解決策

${workspaceRoot}/.vscode以下にsettings.jsonを追加する.そこに目的の環境変数を入れ込む.

{
 "WEB.TOKEN": "hoge",
 "WEB.KEY": "fuga"
}

launch.jsonからは

...
"env": {
 "TOKEN": "${config.WEB.TOKEN}",
 "KEY": "${config.WEB.KEY}"
},
...

問題 - tasks.jsonで色々コマンド使いたい - エディタ周り

状況

.NET のプロジェクトを読み込んで自動的に作られたtasks.jsonでbuild以外のコマンドをしたくて,buildのargs内に ; で区切ってシェルコマンドを入れたけどダメだった.

解決策

そもそもトップにあるコマンドが "command": "dotnet"だからってこと.ここをMac/Linuxユーザは"sh"とかに変えておけばいい感じだった. そしてコマンドを実行するために,その下にあるargsを "args": [ "-c" ]に変更. これで万事解決かと思いきやそうではなく,tasksの要素にsuppressTaskNameが含まれていないもしくはfalseになっている場合task名が第一引数として渡される.

 "command": "dotnet",
 "args", [],
 "tasks" : [
 {
  "taskName": "build",
  "args": [
   "${workspaceRoot}/project.json"
  ]
}

みたいになっていると,dotnet build ${workspaceRoot}/project.jsonとして実行されるということ. コマンド名と関係ないtask名をつけるのであれば,"suppressTaskName": trueとして設定するといい.

結局こんな形になった(上の環境変数を設定しようとしてダメだったやつが含まれてる)

{
    "version": "0.1.0",
    "command": "sh",
    "isShellCommand": true,
    "showOutput": "always",
    "args": [ "-c" ],
    "tasks": [
        {
            "taskName": "build",
            "suppressTaskName": true,
            "args": [
                "dotnet build ${workspaceRoot}/project.json"
            ],
            "isBuildCommand": true,
            "problemMatcher": "$msCompile"
        },
        {
            "taskName": "set-env",
            "suppressTaskName": true,
            "args": [
                "source ${workspaceRoot}/.token_env"
            ]
        }
    ]
}

問題 - yo aspnetで作られたDockerfileを使ってみたけどrestoreでこける - 開発周り

状況

2016/12/3現在yo aspnetで作られるDockerfileは以下のとおり

FROM microsoft/dotnet:latest

COPY . /app

WORKDIR /app

RUN ["dotnet", "restore"]

RUN ["dotnet", "build"]

EXPOSE 5000/tcp

CMD ["dotnet", "run", "--server.urls", "http://*:5000"]

テンプレートで吐き出されるのはバージョンが1.0.1のものだけれども,今のlatestは1.1.0なのでそのあたりでも怒られる.

解決策(正しいかは別

諦めた

FROM microsoft/aspnetcore:1.0.1

COPY ./out/ /app

WORKDIR /app

EXPOSE 80

ENTRYPOINT ["dotnet", "アプリ名.dll"]

で,このDockerfileでイメージをbuildする前にdotnet publish -c Release -o outって感じで${ProjectRoot}/out 以下に吐き出す. これでデプロイできた. Dockerとかコピペでcompose叩いてたからコマンドほとんど分からなくて疲れた

なにか詰まったら随時追加していきます.

WebSharpを触ってみた(導入編

Xamarinの強い人たちのツイートを眺めていたらこんな記述がありました.(会話の内容は省略)

なにこの見るからに面白そうなもの…ということで実際にサンプルだけでも触ってみることにしました.

そこそこ詳しくこっちに書いたのでこちらも併せてごらんください. qiita.com

追記に追記(2017年2月20日) 追記(2017年1月27日)

さて,現在開発をmacで行っているのですが,dotnet core のバージョンが 1.0.0-rc4-004616 こんな感じといいますか, project.jsonでプロジェクトを管理するのではなくcsprojで管理し始めたものになると,binding.gypとかを書き換える必要が出てきます. ちょっとdiffを用意し忘れましたが,見ればすぐわかります(雑

ちなみにそれでビルドは全部通ったのですが,スタックオーバーフロー起こしてElectronで起動できませんでした,現在原因調べてます.

予想はついてはいましたが,1.0.0-preview2-1-003177とかに戻すと動きますね…dotnet coreの最新のrc4のものをリネームしてpreview2を指すようにするという対処法で行っていますが, あまり良い方法ではないですね…

edge.jsのプロジェクトにglobal.jsonを加えてビルドするようにしたら問題ないですね.自分のフォークしたリポジトリに入れたのでそれを見ていただければと…

導入

GitHub - xamarin/WebSharp: Support for running C# on the web browser.

からリポジトリをクローンしてきて,その中のExampleをとりあえず眺めてみることに.

Pre-requisitesとして挙げられているものを確認してみると

  • Node.js
  • Native Abstractions for Node.js
  • PepperPlugin

の3つ.Electron触ったことある人ならNode.jsは入ってるだろうし問題無し.

nanはネイティブライブラリをラップしたりしてたことのある人ならば入っているだろうけど,入っていなかったらnpm i nanでインストール

最後のPepperPluginだけれども,この名前を聞くとChromeのあれかな…と勘違いしてしまう.あ,流行ってる(?)PPAPでもないです.ということで,このPepperPluginのインストールについて触れてみることにする.

リンク先に飛んでみると,

If you have never setup WebSharp before, use the make setup makefile target, this will download the dependencies for the build: Pepper SDK and NuGet:

make setup

と言われてるので大人しくmake setupを叩いてみると make: *** No rule to make target `setup'. Stop.

おいREADME!!!!!!!となるのですが,文章を見て察しろということなんでしょうね,WebSharpを一度もsetupしたことがないのであれば,と言っているので,リポジトリのルートディレクトリに行ってmake buildを叩くと無事に関連物がポンポンダウンロードされます.あとは言われた通りにmake buildを叩けば準備完了…と行きたいところですが, 私が以前に書いた Visual Studio for Macをインストールしてmono4.8+が無いと怒られた時の対処法 - Qiita を実践し,monoが4.8.0になっていた場合, mono/utils/mono-dl.hがないとか言われて怒られます.

なのでその時は

sudo ln -nfs /Library/Frameworks/Mono.framework/Versions/4.6.2 /Library/Frameworks/Mono.framework/Versions/Current

みたいにして以前のバージョンに戻してください.(この辺り.zshrcとかに関数用意しておこうかなあ…)

追記(2017年2月20日)

上記のリンクに載せたQiitaの記事に色々と対策やら考察やら書きました. とりあえずPKG_CONFIG_PATHを設定すればln -sとかをしなくて良さそうです.あとはmono 4.8.0 のバージョンを新しめの物にかえれば問題なく動作しそうですね.

あとは言われた通りに写経すれば動くはずです.動かないなーっていう人は,使われてるElectronが自分でglobalに入れたものでバージョンがあっていないとかその辺の問題だと思いますので,node_modules/.bin/electronあたりのものを使って起動しましょう.

とPepperPlugin必要なのかーという感じではありますが,機能を限れば不要でした.

というのもDotNetSamplesのサンプルを試した時はPepperPluginのインストールをしない状態で始めた時に動作していたからです. 詳しい理由とかは調べるのが めんどう たいへんなので,誰か詳しい方お願いします.

触ってみた感想としてはcsxみたいなものかーという感想です. 私はjs書くのが非常に苦手だったので,C# で書けるのはだいぶ負担が減って良いと思います(jsじゃなくてtsという選択肢もあってそっちも使ってたけど,やっぱりC# の方がいい).

すぐ試したいことはネイティブライブラリをラップしたやつでも容易に呼び出すことができるか,またReactの中に埋め込んでごにょごにょ出来るかって感じですかね.

ViewをReactで書いてモデル部をC# で書くとかごった煮感あってすごい楽しみ…Electronで使えるから,GUIアプリケーションもある意味C# で書ける環境が作られつつあるって考えてもいいんですよねやったーーー