ClickOnceの配布手順がよくわからなかったのでメモ

とりあえず、VS2008でWindowsFormsアプリ(.net2.0用)のプロジェクトのプロパティ画面、「発行」タブで「発行フォルダの場所」を指定して、ローカルIIS(5.1)に配置できるところまでは事前確認済。


今回テストサーバ(IIS7.0)に配置する手順をいろいろ調べてはまった。


VS2008からだと、「発行」タブに「インストールフォルダのURL」という欄がある。
右にあるボタンをクリックすると、ファイルシステム、ローカルIISFTPサイト、リモートサイトの4つから選ぶようになっている。
配置先がネットワークでつながっていないといけない?らしいが、本番はお客様環境に設定するので無理。


なので、そこにテストサーバの配布先として設定したいURLをいれてみた。
「今すぐ発行」ボタンを押すと、とりあえず設定したURLからダウンロードできませんでしたといったような警告がでるが発行はできた。
で、ローカルIISに作成されたファイルをフォルダ毎サーバに持っていってやれば動くようだ。
VSを使えばとりあえずできる。


ただし、このやり方だと設定ファイル(Hoge.config)の値を、開発環境、テストサーバ環境で切り替えたい場合、発行前にIDE環境上(開発環境)のconfigファイルをテストサーバ用に変更し、発行した後にまた開発環境用のconfigファイルに戻す必要があり煩雑。


Hudsonとか使ってると、コマンドラインで自動化したいのでmage.exeを使用してやってみる。


チュートリアル : ClickOnce アプリケーションを手動で配置する | Microsoft Docs


ここを見ながらやってみるがうまくいかない。
手順どおりやってもconfigファイルを含むプロジェクトの場合、うまく配置できないので手順を書いておく。


mage.exeを使用して作成されるClickOnceの配布サイトは、以下のような構成になるようだ。

配布ルートディレクトリ
├配置マニフェスト(Hoge.application)
└各バージョンごとのディレクトリ(*n)
 ├アプリケーションマニフェスト(Hoge.exe.manifest)
 └各種配布ファイル(dll、config、exe、icoなど)

mage.exeがなかったら、.net Framework SDK 2.0にはいっているらしい。
自分の端末では、C:\Program Files\Microsoft SDKs\Windows\v6.0A\bin にあったのでこれを使用した。
(VS6.0のもの?)


MSページの手順を追ってやってみる。

手順1.Windows SDK のコマンド プロンプトを開き、ClickOnce のファイルを格納するディレクトリに移動します。

Visual Studio2008コマンドプロンプトを開けば、mage.exeにパスが通っているようだ。
通常のコマンドプロンプトでは、パスを通す必要あり。
ClickOnceのファイルって何だ? と思ったがこれは、VS2008のプロジェクトプロパティ画面の「発行」タブで、「アプリケーション ファイル」をクリックして出てくるファイルが配布対象ファイルとなるので、それらを作業用のディレクトリにコピーして、コマンドプロンプト上でそのディレクトリに移動すればOK

手順2.ディレクトリを作成し、配置の現在のバージョンに対応させて名前を付けます。初めてアプリケーションを配置する場合であれば、1.0.0.0 などの名前を付けます。

作業用ディレクトリに、バージョン毎のフォルダ(リリース前であれば0.9.0.xなど?)を作って、配布対象ファイルをそのディレクトリに移動。
手順1と2が逆なんじゃないか(作業用ディレクトリを作って、底にファイルをコピー)と思ったりするけどまあよし。

手順3.そのフォルダのサブディレクトリ bin を作成し、実行可能ファイル、アセンブリ、リソース ファイル、データ ファイルなど、すべてのアプリケーション ファイルをこのサブディレクトリに格納します。

結果的にここは実施していない。なんどか試していたとき、bin作っても、Webサーバ上に配置するときにbin以下に各種ファイルがあるとだめで、結局バージョンごとのフォルダにファイルを配置することになったのでbinは作らないことにした。

手順4.Mage.exe を呼び出して、アプリケーション マニフェストを作成します。

コマンドは以下。

mage -New Application -ToFile 0.9.0.x\Hoge.exe.manifest -Name "Hoge" -Version 0.9.0.x -FromDirectory 0.9.0.x

MSサイトの例とは、binディレクトリを指定しないところが異なる。
また、このコマンドを叩く前にconfigファイルをテストサーバ用のconfigファイルにしておく必要がある。
署名後に変更すると、ハッシュ値が違うと怒られて動かない。

手順5.自分のデジタル証明書を使用してアプリケーション マニフェストに署名します。

デジタル証明書はとりあえずVS2008のプロジェクトプロパティ画面、署名タブで作ったテスト用のものを使用。
本番用をどうするかはこれから調べないと。
コマンドは以下

mage -Sign .\0.9.0.x\Hoge.exe.manifest -CertFile C:\hogehoge\Hoge_TemporaryKey.pfx

手順6.Mage.exe を呼び出して、配置マニフェストを作成します。この場合 ClickOnce 配置は、既定で、オンラインでもオフラインでも実行できるインストール アプリケーションとして解釈されます。ユーザーがオンラインの場合にだけアプリケーションを使用できるようにする場合は、-i フラグの値に f を指定して使用します。既定値を使用し、Web サイトまたはファイル共有からユーザーがアプリケーションをインストールするようにする場合は、Web サーバーまたは共有サイトにあるアプリケーション マニフェストを -providerUrl フラグの値で指すようにしてください。

日本語が微妙に怪しいぞ。
自分が叩いたコマンドは以下。

mage -New Deployment -ToFile Hoge.application -Name "Hoge" -Version 0.9.0.x -AppManifest 0.9.0.x\Hoge.exe.manifest -providerUrl http://testserver/HogeInstall/Hoge.application

MSページとの違いは特にないか。
また、ここで合わせてやっておかないと配布できない手順がある。
configファイルを含むプロジェクトを配布する場合、上記コマンドで作成された配置マニフェストファイルを編集する必要がある。
具体的には、deployment要素にmapFileExtensions属性を付加する。



これをしないとconfigファイルなどの拡張子のファイルは、IISからダウンロードする際に制限されてしまうらしい。
GUIツールだと、(VS2008、mageUI.exe)deploy拡張子を使用する、というオプションがあるみたいだが、mageにはないとのことなので、直接ファイル編集が必要。なんでないのー。

手順7.自分のデジタル証明書を使用して配置マニフェストに署名します。

mage -Sign Hoge.application -CertFile C:\hogehoge\Hoge_TemporaryKey.pfx

手順8.バージョン フォルダおよび \bin フォルダも含め、現在のディレクトリにあるすべてのファイルを配置先にコピーします。配置先は、Web サイトか FTP サイト、ファイル共有、または CD のいずれかです。


作業用フォルダを、仮想ディレクトリのフォルダにコピーします。
その際、配布用の各種ファイルに対して、.deployという拡張子を付加します。


これで無事、配布用URLからダウンロードすることが出来た。
ただし、publish.htmは作成されないので、VS2008にて作成されたpublish.htmをコピってサイトに置いちゃえばそこからダウンロードできる。
.net F/Wのsetup.exeも大丈夫かな?(未確認)


バージョンアップ時は、手順6で配置マニフェストを作成する際に、update指定でmageを叩けばOK

mage -Update Hoge.application -Version 0.9.0.x -AppManifest 0.9.0.x\Hoge.exe.manifest

configファイルを含むときの記述が全然みつからずはまった。。。。

まだ自動化は出来てないけど何とかできそうでよかった。
あとは本番用の電子証明書絡みをクリアすればいいかな。