からめもぶろぐ。

SharePoint が得意なフレンズなんだね!すごーい!

PowerApps PowerShell についてフィードバックを出してみた

ということで PowerApps 用の PowerShell があることを教えていただいたので、ちょっと試してみて困ったところなどをフィードバックしてみました。

powerusers.microsoft.com

Add-PowerAppsAccount でログインするときに IdToken のパターンによってエラーになるケースがあったので。

powerusers.microsoft.com

現状スクリプトを直接ダウンロードなんですが、早く PowerShell Gallery に公開してほしい。そのためには現状モジュールの設計もいまいちっぽいので見直しが必要そうだけど。

powerusers.microsoft.com

EnvironmentName ってパラメーターなのに GUID なのおかしくない?という話。

スクリプトなのでソース見られるんだけど GitHub で公開してないのかな。全体的にまだまだなのでオープンソースにしたほうがいい気がします。

SharePoint Framework 1.5 がリリースされました

2018/06/05 に SharePoint Framework 1.5 がリリースされました。

Office Dev Center - Announcing SharePoint Framework version 1.5: new tools and a beta preview

機能追加としては、パッケージ マネージャーとして npm のほかに pnpm と Yarn が使えるようになりました。これによりプロジェクトを作成するときの時間と容量を節約することができるようになりました。軽くベンチマークをとったところ以下のような感じでした。

npm pnpm Yarn
処理時間 (1 回目) 238,031 ミリ秒 192,647 ミリ秒 240,827 ミリ秒
処理時間 (2 回目) 207,439 ミリ秒 95,366 ミリ秒 129,975 ミリ秒
処理時間 (3 回目) 212,534 ミリ秒 103,512 ミリ秒 141,791 ミリ秒
使用容量 338 MB 314 MB 365 MB

Yarn は msi または chocolatey によるインストールが必要ですが、pnpm は npm からインストールできます。お手軽さを考えると pnpm ですかね。

また、プレビュー機能を評価するための plusbeta オプションが追加されました。これにより、通常はプレビュー機能は含まれず、yo で plusbeta オプションを指定した場合のみ利用できるようになります。ただし、これまでプレビューとして公開されている機能 (MSGraphClient など) を使う場合は plusbeta オプションは必要ありません。

そして、プレビュー機能として Dynamic Data が追加されました。これはクラシックの Web パーツ接続に相当するもので、Web パーツ同士でのインタラクティブなデータのやり取りを行うことができます。サンプルとしてリスト アイテムを選択するとリスト アイテムの詳細情報と地図を連動して表示する Web パーツが取り上げられています。

github.com

PowerShell 実践ガイドブック 書籍レビュー

tech.guitarrapc.com

気になったので応募したところ当選してしまいました!ぎたぱそ氏 (@) およびマイナビ出版の方にはこの場を借りてお礼申し上げます。ということで書籍レビューです。


PowerShell との思い出

もともと SharePoint をやってきたので、PowerShell は基本的に SharePoint の管理のためにお世話になっています。SharePoint では 2010 からこれまでの stsadm.exe に代わってサーバー サイドの管理ツールとして SharePoint 管理シェルとして導入されました。*1 最近では SharePoint Online Management Shell だとか PnP-PowerShell だとか、クライアント サイドでの管理ツールも増えてきました。とはいえまだ PowerShell Core には対応されていないので、Windows PowerShell を使っている感じです。*2

SharePoint 以外でも Active Directory の管理だとか Exchange の管理だとか、マイクロソフト製品を使っている限りは PowerShell にはお世話になります。かつては ASP.NET から System.Management.Automation.dll を使ってリモートの Exhange に接続して New-MailBox を呼び出すとか無茶なことをしたこともありました。

客先で借り受けた PC に開発環境がなにも入ってなくて、やむなく標準で入っている PowerShell でゴリゴリやったとりか、最悪 .NET が使えるコンパイラ不要な言語として扱えるのでとてもお世話になりました。

Git の CUI としても活躍してますね。posh-git と GitPad の組み合わせがいい感じです。

前置きが長くなったので肝心のレビューをしたいと思います。

よかったところ

動作環境は PowerShell Core が前提です。かなりクロス プラットフォームが意識されており、特にコマンド プロンプトや bash との比較が多かったのが印象的でした。Windows ユーザーはコマンド プロンプトの後継製品としての PowerShell は理解しているはずが、Linux や Mac OS のユーザーにはまだ PowerShell への意識はそんなに高くないと思います。bash との比較があることで、これまでやってきたことやこれからやりたいことが、具体的にイメージできるのではないかと感じました。

PowerShell Core 限定というよりは PowerShell 全般にかかわる内容も多いため、まだ Windows PowerShell を触っている方 (おそらくこっちのほうが大多数のはず) でも役立つ内容がたくさんあります。私は PowerShell を Hey, Scripting Guy! とか個人ブログとか (もちろんぎたぱそ氏のブログも!) を見ながら勉強してきました。やりたいことを満たすための習得にはそれで十分なのですが、それだとやはり知識が偏ってしまうので、網羅的に学習するためにはとてもよい教材だと思います。トランスクリプトとか正直知りませんでした…。知ってたらもっと効率化できたのに!と悔しい思いをしています。

また、経験に裏打ちされたベスト プラクティスが随所に記載されています。個人的には、結果を Write-Output に流さないための書き方のベンチマークは参考になりました。なんとなく PowerShell っぽい書き方で Out-Null を使っていたのですが、パイプラインは時間かかるんですね。これからはほかのやり方で書くことにします。こういったテクニックは第 5 章にまとまっているので、ある程度 PowerShell を知っていて、全部読むのが大変という方は、第 5 章だけでも読むのをお勧めします。

気になったところ

よかったところと相反する形になってしまうかもしれませんが、ほかのスクリプト言語と比較するときにコマンド プロンプトや bash が適当だったかというと、疑問の余地があります。確かに PowerShell は対話型のシェルとして使えるのですが、コマンド プロンプトや bash よりは高級言語の感があるので、比較するなら、Windows であれば VBScript、Linux であれば awk, sed, Perl あたりが比較対象なのかなと。特に VBScript や VBA はパワー ユーザー向けの言語であり、PowerShell への移行が向いているので、これら言語へのサポートがあると、より PowerShell の普及に役立つのではないかと思いました。

細かいところですが、配列のところで固定長の配列を宣言する書き方が言及されていなかったような。特にバイナリの処理でたまに使うので、書いてあると手厚いかなと感じました。

$buffer = New-Object byte[] 1024

誤字がちょっと目立ったのは初版だから仕方ないかなという感じ。改版されることがあれば修正に期待します。

これはもともと本書に期待することではないかもしれませんが、C# との相互運用をもっといろいろ書いて欲しかったです。本書でも C# でコマンドレットを書く方法はありますが、C# から RunSpace を作って PowerShell のコマンドレットを呼び出したりとかできるので、今後そのあたりの本を出してほしいですね!

*1:ちなみにそんな経緯もあって SharePoint 2016 でも管理シェルはモジュール化されておらずスナップインのままです。

*2:PowerShell Core で SharePoint の管理をしたい場合は SPClientCore を使ってね!

SharePoint Online Management Shell がインストールする CSOM がイケてない件について

発端は Japan SharePoint Support Team Blog の記事です。

PowerShell で SharePoint CSOM を使用する際の Tips – Japan SharePoint Support Team Blog

SharePoint Online Management Shell をインストールすることで、CSOM のモジュールもインストールされます。

はい、確かに SharePoint Online Management Shell をインストールすると、CSOM が使えるようになります。ただし、SharePoint Online Management Shell が入れる CSOM はかなりイケてないので、個人的にはまったところを含めて紹介したいと思います。なお、以下はすべて 2018/03/29 時点の情報であり、今後変更される可能性があります。

モジュールが不完全

SharePoint Online Management Shell に含まれる CSOM の dll は以下の通りです。

  • Microsoft.Online.SharePoint.Client.Tenant.dll
  • Microsoft.SharePoint.Client.dll
  • Microsoft.SharePoint.Client.Runtime.dll

一方、CSOM の NuGet パッケージ (Microsoft.SharePointOnline.CSOM の .NET 4.5 版) に含まれる dll は以下の通りです。

  • Microsoft.Office.Client.Policy.dll
  • Microsoft.Office.Client.TranslationServices.dll
  • Microsoft.Office.SharePoint.Tools.dll
  • Microsoft.Online.SharePoint.Client.Tenant.dll
  • Microsoft.ProjectServer.Client.dll
  • Microsoft.SharePoint.Client.dll
  • Microsoft.SharePoint.Client.DocumentManagement.dll
  • Microsoft.SharePoint.Client.Publishing.dll
  • Microsoft.SharePoint.Client.Runtime.dll
  • Microsoft.SharePoint.Client.Runtime.Windows.dll
  • Microsoft.SharePoint.Client.Search.Applications.dll
  • Microsoft.SharePoint.Client.Search.dll
  • Microsoft.SharePoint.Client.Taxonomy.dll
  • Microsoft.SharePoint.Client.UserProfiles.dll
  • Microsoft.SharePoint.Client.WorkflowServices.dll

明らかに足りない。確かに Microsoft.SharePoint.Client.dll と Microsoft.SharePoint.Client.Runtime.dll がコア機能をすべて持っているので、だいたいのことは事足りてしまうのですが、検索やソーシャル、管理されたメタデータといった機能が入っていないので、突然困ることになります。

謎のバージョンを GAC に突っ込む

SharePoint Online Management Shell の CSOM のアセンブリ バージョンは 16.0.7414.1200 です。そして、NuGet の CSOM のバージョンは 16.1.7414.1200 です。これだけならまだ困らないのですが、SharePoint Online Management Shell はなんと 16.0.7414.1200 の dll を GAC に入れてしまいます。そうすると、NuGet の CSOM でしか存在しない dll を読み込んだときに、アセンブリ バージョンの不整合が起こり、予期しないエラーが発生します。具体的には Assembly.LoadWithPartialName で dll を読み込んだときなどに発生します。*1
前掲の記事でも以下のコメントがあるのは、こういう状況が発生することを認識しているためと思われます。

なお、SharePoint Online Management Shell と SharePoint Online Client Components SDK などを同時にインストールした場合エラーが発生する可能性があるため、いずれかのみのインストールとしてください。

ともあれ、不完全に GAC に突っ込む動作はかなりいけてないので、何らかの改善を望みたいところです。せめてアセンブリ バージョンを合わせてほしい…。

*1:Assembly.LoadWithPartialName は obsolete なので使うなって話なのですが。