NAntでClickOnceの発行を自動化する
アプリケーションをClickOnceで発行するには通常VS2005上から「発行」メニューを選択する必要があるが、毎回毎回めんどくさいので、NAntで自動化できないか調べてみる。
VS2005からはプロジェクトファイル(*.csproj)自体がMSBuildというMicrosoft謹製のビルドツールのビルドファイルになっているので、MSBuild.exeをNAntの「exec」タスクでキックすれば可能だと推測する。
MSDNで調べたところClickOnceで発行するMSBuildタスクはGenerateDeploymentManifestだと判明。使い方がよくわからない。
とりあえず
コマンドプロンプトからMSBuildを起動してみる。
(そのまえにClickOnceで発行する設定をしたプロジェクトを用意しておく、ファイル名はClickOnceApp.csproj)
PS > msbuild ClickOnceApp.csproj
すると
(中略)
ターゲット GenerateDeploymentManifest:
すべての出力ファイルが入力ファイルに対して最新なので、ターゲット "GenerateDeploymentManifest" を省略します。
(中略)
というメッセージが表示されていたので、ターゲットにGenerateDeploymentManifestを指定してみた。
PS > msbuild ClickOnceApp.csproj t/:GenerateDeploymentManifest
さっきと同じメッセージが表示されて、発行はされなかった。
いろいろやってみたけど無理かもしれん・・・
以下のURLにコマンドラインから発行する方法が載ってあると教えて頂いたので、気を取り直してやってみた。
http://www.atmarkit.co.jp/fdotnet/dotnettips/511publishfromcmd/publishfromcmd.html
MSBuildのタスクとしては「Publish」タスクをキックすることでClickOnceアプリを発行する事ができる。
しかし、これだけでは出力ディレクトリに「プロジェクト名.publish」というディレクトリ名で発行されるだけなので、「PublishDir」で出力ディレクトリを指定する必要があるらしい。
PublishDirを指定して試してみたが、このPublishDirには「\\ホスト名\\共有フォルダ名\」というリモートフォルダの形式は駄目らしく、署名のところでエラーが出た。どうやらリモートフォルダに発行する場合は、ネットワークドライブをマウントして、そのパスを指定する必要があるみたい。それはメンドクサイので、出力ディレクトリに出力された「publish」フォルダ配下を発行先にコピーする事にした。
でけた
<?xml version="1.0" encoding="utf-8"?> <project xmlns="http://nant.sf.net/release/0.85/nant.xsd" default="publish" basedir="." name="ClickOnceApp"> <property name="project.name" value="${project::get-name()}" /> <property name="version" value="1.2.0.0" /> <property name="publish.URL" value="\\HogeHoge\Deploy" /> <target name="publish" description="ClickOnceアプリを発行します。"> <exec program="msbuild.exe" commandline="${project.name}.csproj /t:Publish /p:Configuration=Release /p:ApplicationVersion=${version}" /> <copy todir="${publish.URL}"> <fileset basedir="./bin/Release/${project.name}.publish"> <include name="*" /> </fileset> </copy> </target> </project>
コマンドラインからの発行では「publish.html」ページが生成されないので、それは事前に発行先にコピーしておく。
「publish.html」の中に記述されているバージョンの表示はもちろん更新されないので、それは手動で変える必要がある。
まだ不完全だけど、普通に使うぶんには問題ないと思う。
だたこのままだとあまりに不細工なので、この処理をちゃんとしたNAntのタスクにしようと思う。そのうち・・・