21
今風なデスクトップアプリの モダンインストーラー開発 Kaoru Nakajima Cybozu Labs, Inc. 2015/12/19

今風なデスクトップアプリのモダンインストーラー開発

Embed Size (px)

Citation preview

Page 1: 今風なデスクトップアプリのモダンインストーラー開発

今風なデスクトップアプリのモダンインストーラー開発

Kaoru Nakajima

Cybozu Labs, Inc.

2015/12/19

Page 2: 今風なデスクトップアプリのモダンインストーラー開発

About @kaorun

▌Kaoru Nakajima

▌Cybozu Labs, Inc.

▌Software Design Engineer

Twitter: @kaorun

Hatena: id:kaorun

MetroHatenaRNatehaR.Express

Cybozu Livefor Windows Phone

食べログStreetWalker

Page 3: 今風なデスクトップアプリのモダンインストーラー開発

これまでのあらすじ

Page 4: 今風なデスクトップアプリのモダンインストーラー開発

Cybozu Desktop 2 for Windows #とは

Page 5: 今風なデスクトップアプリのモダンインストーラー開発

Cybozu Desktop 2 for Windows #とは

▌サイボウズ Office 10・サイボウズ ガルーン4以降をご利用中の方▌オンプレ版・Cybozu.com対応▌.NET Framework 4.5 + WPF + ClickOnceで開発▌主な機能

▌新着通知▌スケジュール通知▌マルチアカウント対応▌ジャンプリストからの新規アイテム作成

▌Mac版もあるよ!

「サイボウズデスクトップ」で検索!DOWNLOAD NOW !

http://cybozu.co.jp/info/desktop2/

Page 6: 今風なデスクトップアプリのモダンインストーラー開発

ClickOnceの光と闇

▌ClickOnceのイイトコロ▌インストール手続きいらずの1クリック導入

▌サーバーサイドの入れ替えだけで自動更新

▌VSのプロジェクトから発行するだけ

▌ClickOnceのアカントコロ▌実行中のアップグレード時に古いバイナリがどんどん残ってしまう

▌アンインストール時、アカウント設定などが削除できない

▌コード署名が大変

▌諸々制約多い…

▌メンテされているようないないような

Page 7: 今風なデスクトップアプリのモダンインストーラー開発

証明書更新事件勃発

▌新バージョン、お客さんのところでアップグレードに失敗します!

▌げげっ

▌そういえば、今回、コードサイン証明書更新したよね?

▌今年の証明書からSHA1→SHA256に変わってる?

▌実はちゃんと署名できてない?

▌証明書がExpireしてるので、旧バージョンを更新できない!

▌あーでもないこーでもない

▌実は、サーバーがhttpをhttpsにリダイレクトしていたのが問題でした!

▌上記証明書問題と重なってしまったため、同一ソースでは無いと見なされてしまった

▌すでに期限が切れた古い証明書で署名して発行済みだったので修正が利かず酷い目に…

▌MSテックサポート担当の方、長いことお付き合いいただき本当にありがとうございました

Page 8: 今風なデスクトップアプリのモダンインストーラー開発

それからどーした?

Page 9: 今風なデスクトップアプリのモダンインストーラー開発

MSI版やりますか…

▌まぁ、そういうわけです▌ClickOnceの変わりになる自動更新システムを色々物色したが今一歩

▌元々次のメジャー更新辺りでMSI版の話はあった▌当初、サイボウズOffice向けに開発したのだが、ガルーンのお客様に普及し始めた

▌エンタープライズなお客様の諸々の制約もあり

▌ClickOnceよりもMSIなんじゃない?

▌Project Centennial▌Windows Storeに出したいよね、という下心

Page 10: 今風なデスクトップアプリのモダンインストーラー開発

MSI: Windows Installer #とは

▌Windows Installer用パッケージ(拡張子:*.msi)

▌OS標準インストーラー

▌よくあるウィザード形式になってるやつ

▌Setup.exeとHogemoge.msiが1セットになっている

▌Setup.exeがBootstrapper

▌.NET Frameworkやデータアクセスライブラリ等をsetup.exeで先

に入れる

▌セットアップはsetup.exeというわかりやすさ

▌環境が整っていれば.msiを直接実行することもできる

▌昔はWindows Installer自体を事前にインストールする必要もあっ

Page 11: 今風なデスクトップアプリのモダンインストーラー開発

その他のインストーラー(非MSI系)自動更新システム等

▌InnoSetup▌わりとよく見るやつ

▌InstallBuilder▌MSIっぽいのを生成する、マルチプラットフォーム

▌google/Omaha▌Chromeなどで使われている模様

▌NetSparkle ▌Linux系から来たマルチプラットフォーム

▌NSIS : Nullsoft Scriptable Install System ▌Nullsoft製

Page 12: 今風なデスクトップアプリのモダンインストーラー開発

MSIインストーラー開発の定番ツール

▌Install Shield▌大定番、インストーラーで出来ることはほぼ何でもできる

▌Install Shield Limited Edition(無償)はVSに付属

▌Install Shieldで作りました、という風なUIになる

▌有償版は高価、ライセンスが複雑

▌Visual Studio Installer Project ※現在はレガシー扱い▌VS2010までは標準機能だった

▌現在はVisual Studio GalleryでVS Extensionとして公開中

▌シンプルなMSIインストーラーをGUIで簡単に生成

▌できることは少なめだがカスタムアクションである程度対応可能

▌WiX▌Windows Installer XML Toolset

▌MSIスクリプトをXMLで記述するコンパイラ

▌MSIで出来ることはほぼXMLで書ける

▌既存MSIから*.wxsへ逆コンパイル可能

Page 13: 今風なデスクトップアプリのモダンインストーラー開発

MSIの注意点

▌カスタムアクションで~できる?

▌.NETだから簡単ですよー!

▌そうでもなかった

▌公式に.NETのカスタムアクションは非推奨 #らしい

▌いろいろなしがらみがあり、結局Win32ネイティブで開発 #とか

▌VSIPでカスタムアクション対応すればいいや、と思ってるとハマル

▌ローカライズ問題

▌単一の*.msiパッケージで多国語対応できなくはないが、面倒

▌見た目がレガシー

Page 14: 今風なデスクトップアプリのモダンインストーラー開発

モダンインストーラーへの道

▌ウィザード形式はもう古い

▌シンプルにカッコいいインストーラーがトレンド

▌基本利用許諾とプログレスバー程度

▌ちまちま設定・選択させない

▌自動更新システム

▌(Metro改め)Modern UIデザイン

▌例:

▌Visual Studio、Office 365など

Page 15: 今風なデスクトップアプリのモダンインストーラー開発

Bundle: WiX Installation BundlesBurn: WiX Bootstrapper Engine

▌Setup.exeのスーパーセット

▌Setup.exeを自動生成ではなく独自に実装可能

▌MSI本体をペイロードとしてパッケージ化

▌独自UIを実装して、背後でMSIをサイレントインストール

▌UIを自由に実装できるのでローカライズ・多言語対応も容易

▌つまり、ペイロードされるMSIのUIはどーでもいい

Bundle

SetupHogeMoge_v1234.exe

Burn Engine

HMBootstrapperApp.dll

•WPF Modern Install UI

•Multiple Localized Resource

HogeMoge.msi

•Application Files

•Folder, Reg, …

Page 16: 今風なデスクトップアプリのモダンインストーラー開発

BundleとBurnの構造

▌WiX Bootstrapper Projectを作成すると、<Bundle>を定義する*.wxsが生成される

▌Bundle.wxsファイルで定義したSetup.exeをコンパイル生成するイメージ

▌Bundleパッケージの中でBootstrapper ApplicationとしてBurn Engineが実行される

▌Bootstrapper Application

▌イベントドリブンなランチャーモジュール

▌標準ではWixStandardBootstrapperApplicationのUIが利用可能

▌BootstrapperApplication継承クラスを実装したDLLでカスタムUIを実装

▌BundleのPayloadを追加することで各種ライブラリのDLLを参照可能

Page 17: 今風なデスクトップアプリのモダンインストーラー開発

Custom Bootstrapper Application

▌BootstrapperApplication継承クラス

▌Run()で呼ばれて、シンプルにUIを実装したDLL

▌イベントドリブンに実行

▌C# + WPF + MVVM!

▌Yes XAML!

Page 18: 今風なデスクトップアプリのモダンインストーラー開発

BootstrapperAppのライフサイクル

▌DetectBegin▌DetectPackageBegin

// パッケージのインストール状況を確認

▌DetectPackageComplete▌…

▌DetectComplete▌PlanBegin

▌PlanPackageBegin// パッケージのインストールを計画

▌PlanPackageComplete▌…

▌PlanComplete▌ApplyBegin

▌Elevate▌ExecuteBegin

▌ ExecutePackageBegin// パッケージのインストール実行▌ ExecuteMsiMessage▌ ExecuteProgress

▌ ExecutePackageComplete▌…

▌ExecuteComplete

▌ApplyComplete▌Shutdown

Page 19: 今風なデスクトップアプリのモダンインストーラー開発

アンインストール・アップグレードプロセス

▌古いMSIが自分でアンインストールして、新しいMSIをインストールするのが基本

▌Bundleでも同様▌古いBundleを探してアップグレード処理

▌ペイロードのMSIも同様のアップグレード処理を個別に実行

▌UpgradeIDとProductID▌プロダクトに対して一意のUpgradeIDを定義

▌バージョンごとにPruductIDを更新する

▌Bundleの各IDとペイロードMSIのIDは別物

▌アップグレードの流れ▌UpgradeIDを検索

▌同一UpgradeIDでより古いVersionのパッケージがインストールされていたら

▌古いバージョンのインストーラーを叩いてアンインストール(アップグレードモード)

▌しかる後に新バージョンをインストールする

Page 20: 今風なデスクトップアプリのモダンインストーラー開発

Project Centennial #とは

▌Windows 10 Bridge for Classic Desktop Windows Application

▌https://devpreviewsignup.windows.com/

▌This toolkit will enable desktop developers to package and publish their existing .NET and Win32-based Windows applications to the Windows Store. Developers can also use Centennial to call common UWP APIs and services.

▌デスクトップアプリをWindows Storeへ

▌デスクトップアプリをパッケージ化しサンドボックスに入った仮想アプリとして実行

▌アプリは完全にサンドボックスの中で動作するため、他のプロセスには干渉できない

▌仕組み的にはApp-Vとほぼ同じだけど別物

▌パッケージの中身はMSIで作成する(Build2015当時)

Page 21: 今風なデスクトップアプリのモダンインストーラー開発

まとめ

▌ClickOnceもうカンベンな…

▌かっこいいモダンインストーラーできたよ!

▌とにかくノウハウがなかったので手探りでたいへんだった

▌MSIパッケージもできたのでProject Centennialどんとこい