App CenterでのXamarin.FormsのUWPアプリのビルド~暫定的な回避策

Posted by 技術ブログ by Strawhat.net on Saturday, January 20, 2018

TOC

JXUGC #24 春の App Center 祭りに参加してきました。 これまで、VSTS+App CenterでKumalica vNextのビルドと配布(アルファ版・ベータ版)をしようと思って少しずつ触ってはいましたが、 これを機にXamarin.FormsのAndroidアプリとUWPアプリをビルドして配布する方法をしっかりと調べています。

App CenterでのXamarin.FormsなUWPアプリのビルドの問題

実際にApp CenterでXamarin.Formsアプリをビルドして問題になったのが、Xamarin.FormsのUWP部分のビルドです。

まず、OSをAndroid、PlatformをXamarinと指定してアプリを定義すると、Xamarin.Formsのリポジトリを参照させて作成したビルド定義では、Project欄がAndroidのcsprojファイルに設定されて、Androidアプリだけをビルドできます。

  
2018-01-20_19-56-25.png { width=300 }{ target="_blank" }2018-01-20_19-55-11.png { width=300 }{ target="_blank" }

しかし、OSをWindowsと指定すると、PlatformはUWPしか選択できず、Xamarin.Formsのリポジトリを参照させて作成したビルド定義では、Project欄がソリューションファイル(.sln)に設定されます。

  
2018-01-20_19-56-00.png { width=300 }{ target="_blank" }2018-01-20_19-47-16.png { width=300 }{ target="_blank" }

この状態でビルドを実行すると、BUILD OUTPUTに

Project "d:\a\1\s\AppCenterSample.sln" (1) is building "d:\a\1\s\AppCenterSample\AppCenterSample.Android\AppCenterSample.Android.csproj" (2) on node 1 (default targets).

と表示されることからわかるように、UWPアプリだけでなく、Androidアプリもビルドされます。

原因と暫定的な回避策

App CenterのWindows/UWPを指定したアプリで、Xamarin.FormsアプリのAndroid部分もビルドされるのは、 ビルド定義が参照するslnファイルで、ビルド構成がそのように定義されているからです。 つまり、DebugとReleaseの両方で、UWPとAndroidの両方がビルド・配置されるように定義されていることが原因です。

2018-01-20_19-43-35.png { width=300 }{ target="_blank" }

根本的には、App CenterでWindows/Xamarinのアプリを定義できて、そしてビルド定義ではUWP部分のcsprojファイルを参照するように改善されるしかないのですが、 暫定的な回避策として、Xamarin.Formsアプリのビルド定義で対応する方法があります。

まず、Visual Studioのメニューから、ビルド>構成マネージャーを選択して、アクティブソリューション構成欄から新規作成を選択します。

  
2018-01-20_19-32-22.png { width=300 }{ target="_blank" }2018-01-20_19-43-56.png { width=300 }{ target="_blank" }

表示された新しいソリューション構成ダイアログで、名前を「Release-UWP」、設定のコピー元を「Release」、新しいプロジェクト構成を作成するにチェックを入れて、OKを押します。さらに、構成マネージャーで、Release-UWPのARM・x86・x64に対して、Androidのビルド・配置のチェックを外します。

  
2018-01-20_19-44-16.png { width=300 }{ target="_blank" }2018-01-20_19-44-40.png { width=300 }{ target="_blank" }
  
2018-01-20_19-44-56.png { width=300 }{ target="_blank" }2018-01-20_19-45-08.png { width=300 }{ target="_blank" }

これをGitリポジトリにプッシュすると、App Centerのビルド定義でRelease-UWPが選択できるようになるので、これでビルドしてみます。

2018-01-20_20-14-40.png { width=300 }{ target="_blank" }

BUILD OUTPUTのログをみると、今度はAndroidプロジェクトはビルドされずに、UWPアプリだけがビルドされているはずです。

2018-01-20_20-31-14.png { width=300 }{ target="_blank" }

まとめ

この暫定的な回避策は、将来にWindowsのXamarinアプリがサポートされたときに(現状ではOS・Platformの変更ができないので)AnalyticsやCrashesの情報を引き継げない問題があります。しかし、現状では、Xamarin.FormsアプリのUWP部分を適切にビルドするためは、この回避策しかないのかなと思います。もし、他に良い方法があったらご教授ください。