以下の内容はhttps://tech.guitarrapc.com/entry/2016/05/04/150011より取得しました。


Azure Functions C#のRoslynコード評価環境を構築しよう

C# を書く環境として、Visual StudioやLinqPad、Visual Studio Codeが良く話題になります。特にサクッとコード片を試す、インタラクティブにトライアンドエラーをしたいとなると、LinqPad (特にPremium) が素晴らしいです。

LinqPadに関しては、素晴らしいブログ記事があるのでぜひとも目を通されるといいでしょう。

https://takeshik.org/blog/2014/12/06/try-linqpad/

https://takeshik.org/blog/2016/02/12/linqpad-interactive-rx/

https://takeshik.org/blog/2016/02/12/linqpad-unirx/

https://takeshik.org/blog/2016/04/30/rx-visualization/

チャットでやり取りしているとLinqPadなど他ツールを立ち上げること自体が億劫になります。ツールを切り替えるのは非常にコストが高く、コード片を試したい・共有したい、あるいはチャット上でコードを実行したいとき、チャット上でボットにお願いして評価させると楽です。そんな時に利用できるのが、Roslyn の Scripting API + AzureFunctionsです。

とはいえ、SlackでOutgoing Webhooksを使ったチャットのコード評価ボットに関する素晴らしい記事がすでにあります。

https://qiita.com/nk9k/items/41c6cb6a09c8f7cb53a2

今回はこの素晴らしい知見を基に、Lineや他チャットなど汎用的なWebhookをJSON経由で評価できるようにしてみましょう。

Roslyn Scripting API の分離

Slack Outgoing Webhookと汎用JSON Webhookの両方でC# Scriptingを使うので、評価部分だけCSharpScripting.csxとしてコードを分離します。利用したいrun.csxは、#loadコマンドで呼び出せるようになり二重管理から解放されます。

https://tech.guitarrapc.com/entry/2016/04/15/032827

元記事に加えて、外部を叩いたりできるように参照をごそっと追加します。

https://gist.github.com/guitarrapc/fab39b7ce0534a17c5c11de521313c7e

これで、評価したいコードをstringとして渡せばRoslynが実行してくれるようになりました。

Webhook 用にFunction を作成する

続いて、application/json形式で入力されたWebhookを受け入れるAzure FunctionsとしてCSharpCompilerWebhookCSharpを作成します。

https://gist.github.com/guitarrapc/27aeb3cf04b98df394d3b570d14e4c85

function.jsonに注意です。SlackのslashcommandやOutgoing Webhookと違い、GenericJsonとしてください。

Roslynコード評価を外に出したので、run.csxがとてもシンプルになりました。

検証

サンプルとして、Azure Functions画面上でテストしてみます。google.comページのソース文字数を数えてみましょう。

https://gist.github.com/guitarrapc/87ab95a0e965a7e184772f8e3ac64275

うまくいきましたね。

new System.Net.Http.HttpClient().GetStringAsync("https://google.com").Result.Length

Slack Outgoing Webhook も修正してみる

とはいっても元記事そのままで、C# コード評価部分だけ外を参照するだけです。ただし、0.2に上げた場合は、以下の設定に変わります。

https://gist.github.com/guitarrapc/4bb29bdb9f18310da5a2d4da458c2a60

こちらも問題なく実行されましたね。

@C#: Enumerable.Range(10, 20).Aggregate((x, y) => x + y)

まとめ

今回のものも、GitHubに載せておきました。

https://github.com/guitarrapc/AzureFunctionsIntroduction

Roslyn ScriptingによるC#コード評価は非常に簡単ですが、既存の何かに載せるにはサンドボックスだったり色々考慮が必要です。

こういった環境を気にしないといけないものこそAzureFunctionsに寄せると、不用意なリークも防げるため安全がある程度担保されます。

素晴らしい記事の数々に感謝です。

グラニはC#怖い人によって数年前からすでにChatwork上でコード実行が出来ているのですが、Azure Functionsに実行基盤を移譲できそうでよかったです。




以上の内容はhttps://tech.guitarrapc.com/entry/2016/05/04/150011より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14