銀の光と碧い空

クラウドなインフラとC#なアプリ開発の狭間にいるエンジニアの日々

PowerShell on Linux ふりかえり

PowerShell Advent Calendar 2日目のエントリです。

qiita.com

今年は.NET Core on RHELを追っかけた一年だったので、その関連でPowerShell on Linuxの現状というか簡単な振り返りをしてみたいと思います。事の始まりはPowerShell のOSS化とLinuxへの対応が発表されたこのブログでした。

blogs.msdn.microsoft.com

PowerShell v6 のα版というステータスでLinuxを含め各種OS向けのバイナリが1月に1回くらいのペースでリリースされています。

github.com

今のところ、CentOS系はrpmをダウンロードしてyum installを実行する形式になっています。CentOS系だからFedoraでもいけるのでは...?とも思われますが、内部で参照している.NET Coreのランタイムが古いせいか、Preview版のFedora24向け.NET Coreをインストールしていても、powershellは起動に失敗します。

$ powershell 
Failed to initialize CoreCLR, HRESULT: 0x80131500

ということなので、CentOS系ではCentOSもしくはRHELで楽しみましょう。さて、LinuxのShell上でpowershellコマンドを実行するとPowerShellのShellに変わりますが、これがなかなか補完が効いたり、色がついたりして使い勝手がよいです*1

これは最後の$_.の間で補完候補を表示した結果です。 f:id:tanaka733:20161201224736p:plain

シンタックスハイライトの様子。 f:id:tanaka733:20161201224932p:plain f:id:tanaka733:20161201225130p:plain f:id:tanaka733:20161201233328p:plain

さて、現状PowerShell v6のαで使えるコマンドは350個ほどしかなく、モジュールを追加したいところですが、そこにも問題があります。

PS /root> @(Get-Command).Count                                                                                                 
349

既存のモジュールの中にはC#などで書いたコードをコンパイルしたdllを参照しているものもありますが、.NET Framework版でビルドしたdllはWindows版でしか動きません。その一つがAzure PowerShellになります。こちらは、PowerShell on Linuxが公開されてかなり早い段階で.NET Core版のバイナリもPreview扱いでリリースしましたが、まだPreview扱いのままのようです... tech.tanaka733.net

さて、PowerShell on Linuxの今後ですが、まだすぐに普及するというステータスではないように思われます。コマンドなりモジュールがLinuxのコマンドにも対応してくれるとうれしいですね。なんといってもPowerShellのメリットはオブジェクトの集合がパイプで流れてきて、オブジェクトのまま*2処理できることにあると思っているので、Linuxの管理系コマンドの結果がオブジェクトでとれると使い勝手もよくなります。

また、DSCの動向ですが、例えば、Azure上でLinuxを動かす場合、Azure VMやVNETまわりのリソースはARMテンプレートで管理し、起動したLinuxより上のレイヤー(OSインストール後の設定、ミドルウェア製品のインストールやセットアップ)はAnsibleで行うというのが一つの形としてあります。例えばLinux中心の環境で一部Windows Serverを動かしたいとなれば、AnsibleでWindowsを管理しAnsibleの標準コマンドで管理しづらいようなWindowsの機能はPowerShell DSCでセットアップするということが考えられます。一方、Windows中心の環境で一部Linuxを使いたいとなれば、PowerShell DSC中心に置いて、PowerShell DSC for LinuxでLinuxを管理する方法がとれるかもしれません。AnsibleのModuleをPowerShell DSCから呼び出すという試みをしている人もいるので、この辺は何がメジャーになるのかまだわからないなあという感想を持っています。

github.com

なにはともあれ、なかなか面白いものが出て来たので、来年も引き続きさわっていきたいと期待している、というのが個人の感想です。

*1:普通のLinuxのコマンドと比べてどうかといわれると微妙だが、補完のきかないdotnetやいまいちなazure cliにくらべるとかなりよい

*2:単なる文字列ではなくという意味

ASP.NET Core on Linux でも SignalR が使いたい

ASP.NET Core Advent Calendar一日目です。内容は直前で変えたのですが、Sessionまわりの話は空いている日のネタとして投下したいと思います。

qiita.com

SignalR もASP.NET Core対応が進んでいます。

github.com

ので現時点で動作するアプリをASP.NET Coreで作れるは作れるのですが、必要なライブラリは正式版としてnuget.orgには公開されてはいません。というところが今回のお話です。

続きを読む

MVP Summit のハッカソンで.NET Core CLIの拡張を作りました

MVP Global Summit 2016に参加して来たのですが、今年は木曜に行われるハッカソンまで参加してきました。ツアーで行くと木曜の朝出発するスケジュールなのでずっと参加できなあったのですが、今年は自分で予約したので参加できました。10個くらいのテーマがあって、その中から好きなものを選んでハッカソンする形式で、だれがどんなものを作ったかがブログにまとまっています。

blogs.msdn.microsoft.com

集合写真は最後に取ったらしく、日のあるうちにその日の宿のシアトル市内まで帰りたっかた私はちょっと早く帰ったので写っていません。ハッカソンは16時過ぎまであったのですが、16時にMicrosoft本社の構内にあるバス停から路線バスに乗って1時間弱でシアトル市内に着きます。日の入りが16時半ごろなのでつく頃にはかなり暗くなっていました*1

私が選んだテーマは.NET Core CLIの拡張だったのですが、これを選んだのは私だけのようで、ボッチハッカソンになりました。ほかのテーマでは、やはり人気はXamarinでした。作成したのは、.NET Core CLIを拡張した"dotnet add" コマンドです。使い方はリンク先のGIF画像でどうぞ。csproj対応の.NET Core 1.0 preview 3以降のCLIが必要です。

github.com

Visual Studioで開発していると気づきづらいのですが、Visual Studio Codeで開発しているとクラスファイル一つ追加するにも空ファイルを追加してusingやらnamespaceやらクラス宣言やらを手入力する必要があります。yo generator aspnet を使えばいいのですが、わざわざnodejsセットアップするのもねえということで作ってみました。とはいえ、CLI拡張のPoC的な意味合いが強く、本来であればオレオレ拡張というよりSDK本家に組み込んでほしい機能です。

github.com

.NET Core CLIの拡張そのものについては、このリポジトリのフォーク元のリポジトリを見ると解説してあります。

github.com

こちらのリポジトリではMSBuildのタスクを拡張して、CLIから呼べるようにする拡張のサンプルもあります。注意点としては、CLI拡張はNuGetパッケージとして作成し、参照する側のプロジェクトでそのNuGetパッケージを追加するのですが、用意されたスクリプトだとビルドしなおしても古いバージョンがキャッシュに参照されたまま更新されないので、キャッシュを消す必要があります。

rm ./nupkgs/*
rm $env:USERPROFILE\".nuget\packages\dotnet-add"

また作っていてどうすればいいかまだ分かっていないこととしては、

  • 拡張そのものがNuGetライブラリを参照する場合の追加の仕方
  • Workspace情報の参照の仕方(add拡張の例でいえば、namespaceをプロジェクトのdefaultNamespace+相対フォルダで自動生成したいが、defaultNamespaceをどうやって取得するか)

あたりになります。

余談ですが、お昼ごはんは「ハッカソンらしく、Unhealthy なピザだぜー(意訳)*2」ということでピザだったのですが、なんとピザ窯が敷地の外にやってきて焼きたてを食べることができました。写真を取り忘れたので、ほかの方のツイートをはっておきます。

*1:本社のあるレドモンド郊外からシアトル市内まで$2.75。シアトル市内から空港まではLinkで$3

*2:別に他のものがHealthyというわけでもない