Upload
kaoru-nakajima
View
5.382
Download
6
Embed Size (px)
Citation preview
今風なデスクトップアプリのモダンインストーラー開発
Kaoru Nakajima
Cybozu Labs, Inc.
2015/12/19
About @kaorun
▌Kaoru Nakajima
▌Cybozu Labs, Inc.
▌Software Design Engineer
Twitter: @kaorun
Hatena: id:kaorun
MetroHatenaRNatehaR.Express
Cybozu Livefor Windows Phone
食べログStreetWalker
これまでのあらすじ
Cybozu Desktop 2 for Windows #とは
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/
ClickOnceの光と闇
▌ClickOnceのイイトコロ▌インストール手続きいらずの1クリック導入
▌サーバーサイドの入れ替えだけで自動更新
▌VSのプロジェクトから発行するだけ
▌ClickOnceのアカントコロ▌実行中のアップグレード時に古いバイナリがどんどん残ってしまう
▌アンインストール時、アカウント設定などが削除できない
▌コード署名が大変
▌諸々制約多い…
▌メンテされているようないないような
証明書更新事件勃発
▌新バージョン、お客さんのところでアップグレードに失敗します!
▌げげっ
▌そういえば、今回、コードサイン証明書更新したよね?
▌今年の証明書からSHA1→SHA256に変わってる?
▌実はちゃんと署名できてない?
▌証明書がExpireしてるので、旧バージョンを更新できない!
▌あーでもないこーでもない
▌実は、サーバーがhttpをhttpsにリダイレクトしていたのが問題でした!
▌上記証明書問題と重なってしまったため、同一ソースでは無いと見なされてしまった
▌すでに期限が切れた古い証明書で署名して発行済みだったので修正が利かず酷い目に…
▌MSテックサポート担当の方、長いことお付き合いいただき本当にありがとうございました
それからどーした?
MSI版やりますか…
▌まぁ、そういうわけです▌ClickOnceの変わりになる自動更新システムを色々物色したが今一歩
▌元々次のメジャー更新辺りでMSI版の話はあった▌当初、サイボウズOffice向けに開発したのだが、ガルーンのお客様に普及し始めた
▌エンタープライズなお客様の諸々の制約もあり
▌ClickOnceよりもMSIなんじゃない?
▌Project Centennial▌Windows Storeに出したいよね、という下心
MSI: Windows Installer #とは
▌Windows Installer用パッケージ(拡張子:*.msi)
▌OS標準インストーラー
▌よくあるウィザード形式になってるやつ
▌Setup.exeとHogemoge.msiが1セットになっている
▌Setup.exeがBootstrapper
▌.NET Frameworkやデータアクセスライブラリ等をsetup.exeで先
に入れる
▌セットアップはsetup.exeというわかりやすさ
▌環境が整っていれば.msiを直接実行することもできる
▌昔はWindows Installer自体を事前にインストールする必要もあっ
た
その他のインストーラー(非MSI系)自動更新システム等
▌InnoSetup▌わりとよく見るやつ
▌InstallBuilder▌MSIっぽいのを生成する、マルチプラットフォーム
▌google/Omaha▌Chromeなどで使われている模様
▌NetSparkle ▌Linux系から来たマルチプラットフォーム
▌NSIS : Nullsoft Scriptable Install System ▌Nullsoft製
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へ逆コンパイル可能
MSIの注意点
▌カスタムアクションで~できる?
▌.NETだから簡単ですよー!
▌そうでもなかった
▌公式に.NETのカスタムアクションは非推奨 #らしい
▌いろいろなしがらみがあり、結局Win32ネイティブで開発 #とか
▌VSIPでカスタムアクション対応すればいいや、と思ってるとハマル
▌ローカライズ問題
▌単一の*.msiパッケージで多国語対応できなくはないが、面倒
▌見た目がレガシー
モダンインストーラーへの道
▌ウィザード形式はもう古い
▌シンプルにカッコいいインストーラーがトレンド
▌基本利用許諾とプログレスバー程度
▌ちまちま設定・選択させない
▌自動更新システム
▌(Metro改め)Modern UIデザイン
▌例:
▌Visual Studio、Office 365など
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, …
…
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を参照可能
Custom Bootstrapper Application
▌BootstrapperApplication継承クラス
▌Run()で呼ばれて、シンプルにUIを実装したDLL
▌イベントドリブンに実行
▌C# + WPF + MVVM!
▌Yes XAML!
BootstrapperAppのライフサイクル
▌DetectBegin▌DetectPackageBegin
// パッケージのインストール状況を確認
▌DetectPackageComplete▌…
▌DetectComplete▌PlanBegin
▌PlanPackageBegin// パッケージのインストールを計画
▌PlanPackageComplete▌…
▌PlanComplete▌ApplyBegin
▌Elevate▌ExecuteBegin
▌ ExecutePackageBegin// パッケージのインストール実行▌ ExecuteMsiMessage▌ ExecuteProgress
▌ ExecutePackageComplete▌…
▌ExecuteComplete
▌ApplyComplete▌Shutdown
アンインストール・アップグレードプロセス
▌古いMSIが自分でアンインストールして、新しいMSIをインストールするのが基本
▌Bundleでも同様▌古いBundleを探してアップグレード処理
▌ペイロードのMSIも同様のアップグレード処理を個別に実行
▌UpgradeIDとProductID▌プロダクトに対して一意のUpgradeIDを定義
▌バージョンごとにPruductIDを更新する
▌Bundleの各IDとペイロードMSIのIDは別物
▌アップグレードの流れ▌UpgradeIDを検索
▌同一UpgradeIDでより古いVersionのパッケージがインストールされていたら
▌古いバージョンのインストーラーを叩いてアンインストール(アップグレードモード)
▌しかる後に新バージョンをインストールする
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当時)
まとめ
▌ClickOnceもうカンベンな…
▌かっこいいモダンインストーラーできたよ!
▌とにかくノウハウがなかったので手探りでたいへんだった
▌MSIパッケージもできたのでProject Centennialどんとこい