ClickOnceアプリケーションをコマンドライン(MSBuild)から発行する方法
ClickOnceアプリケーションをコマンドラインもしくはPowerShellから、MSBuildを使用して発行する方法がわかったので、忘備録としてまとめておく。
MSDN
ClickOnce アプリケーションのコマンド ラインからのビルド
@IT
.NETビルド・エンジン「MSBuild」使いこなし術 − @IT
ClickOnceアプリをコマンドラインから発行するには?[2.0のみ、C#、VB] − @IT
作業の流れ
プロジェクトを作成して、発行ウィザードから一度発行する
PowerShellでMSBuildを実行するスクリプトを作成する
発行されたアプリケーションをアップロードする機能を作成する
発行とファイルアップロードを一度に行う
1.プロジェクトを作成して、発行ウィザードから一度発行する
Visual Studiow 2013を起動して、Windowsフォームアプリケーションを作成します。今回は、「SampleForms」とします。
作成したら、アプリを実行して動作することを確認します。その後、通常通り右クリックから「発行」を選んでウィザードに従って操作をします。
Webサーバー上からインストールできるようにしたいので、最初の画面には、配置先IISの仮想ディレクトリのパスを設定し、次の画面で「Webサイトから」を選択して、URLにWebサーバー上のアドレスを設定します。
このURLはインストールするアプリから参照できる必要があります。
そのまま次の画面で「はい」を選択して完了します。そうするとテスト用証明書が自動で作成されて、配置先IISにアプリケーションが配置されます。
2.MSBuildから、ClickOnceの発行を行う
コマンドラインからMSBuildを使用して、ClickOnceの発行を行ってみます。この場合、アプリケーションのアップロードまでは行ってくれないため、後でアプリケーションのアップロードを行う機能を作成します。
「開発者コマンド プロンプト for VS2013」というコマンドプロンプトを使用します。Visual Studio 2013と同じ場所にある「Visual Studio ツール」を開くと、ショートカットがあるので、それを実行します。
そうすると、「開発者コマンド プロンプト for VS2013」という名前がついたコマンドプロンプトが起動しますので、Windowsフォームアプリケーション「SampleForms」のディレクトリに移動します。
以下のコマンドを実行するとClickOnceの発行を行うことが出来ます。
>msbuild SampleForms.csproj /t:Publish
このコマンドを実行すると、プロジェクトのbin/構成名(DebugやRelease)フォルダの下のapp.publishフォルダに、発行用の各ファイルが作成されます。
(ウィザードを使用した発行でも同じフォルダを使うため、今回の場合はファイルが更新されます)
このファイル群を配置先IISのウィザードで指定したフォルダに持っていくと配置することが出来ます。
3.PowerShellでMSBuildを実行するスクリプトを作成する
参考サイトではバッチファイルからMSBuildを実行していましたが、今風にPowerShellを使います。以下の内容を記入したファイルにps1という拡張子をつけて、プロジェクトの直下に保存します。
$env:Path += ";C:\Program Files (x86)\MSBuild\12.0\Bin\" Set-Location (Split-Path ( & { $myInvocation.ScriptName } ) -parent) msbuild SampleForms.csproj /t:Publish
1行目は、パスの設定をしています。2行目では、実行フォルダをPowerShellスクリプトのあるフォルダにします。3行目は上と同じコマンドです。
Visual Studio上からPowerShellを実行するために、「PowerShell Tools for Visual Studio 2013」という拡張機能を使いました。
4.発行されたアプリケーションをアップロードする機能を作成する
こちらも基本的な考え方は、参考サイトと同じです。新しいバージョンでは便利なタスクが増えているのでそれを使用しています。
csprojファイルの最後に以下を追加します。
<Target Name="CopyPublishedApplication"> <ItemGroup> <MySourceFiles Include="$(PublishDir)**\*.*" Exclude="$(PublishDir)$(MSBuildProjectName).exe" /> </ItemGroup> <PropertyGroup> <AppricationDir>$(_DeploymentApplicationDir.Substring($(PublishDir.Length)))</AppricationDir> </PropertyGroup> <!-- Output Message <Message Text="PublishUrl = $(PublishUrl)"/> <Message Text="DeployDir = $(_DeploymentApplicationDir)"/> <Message Text="AppDir = $(AppricationDir)"/> --> <Message Text="PublishDir = $(PublishDir)" /> <Warning Condition="Exists('$(PublishUrl)\$(AppricationDir)')" Text="$(PublishUrl)\$(AppricationDir) is Exists!" /> <!--Copy Published Application--> <Copy SourceFiles="@(MySourceFiles)" DestinationFiles="@(MySourceFiles->'$(PublishUrl)%(RecursiveDir)%(Filename)%(Extension)')" /> </Target> </Project>
$(PublishDir)
がapp.pulishフォルダのパスを示します。ウィザードで発行したIIS上のフォルダを参照すると、アプリケーション名.exeが含まれていないので、コピー対象から外しています。
$(AppricationDir)
は、ClickOnceによって作られるバージョン番号付きのフォルダ名です。コピー先に同名フォルダの有無をチェックするために使用しています。
フォルダがある場合は、Warningタグで警告メッセージを出します。タグをErrorにすればエラーを発生させて処理を停止することも出来ます。
Copyタグで対象ファイルを指定したフォルダにコピーします。再帰的にフォルダの中身もコピーしてくれるのでとても便利です。
5.発行とファイルアップロードを一度に行う
あとは先程のPowerShellスクリプトのMSBuild実行部分を以下のように変えれば、発行とファイルの配置を一度に行うことが出来ます。
msbuild SampleForms.csproj /t:Publish /t:CopyPublishedApplication /p:Configuration=Release /p:PublishUrl="C:\inetpub\wwwroot\SampleForms\" /p:InstallUrl="http://localhost/SampleForms/" /p:ApplicationVersion="1.0.2.0"
CopyPublishedApplicationがcsprojファイルに追加したTargetです。
ConfigurationでRelease構成を指定しています。「Configuration Transform」という拡張機能を導入することで構成によって設定値を変更することが出来ます。
PublishUrlがプロジェクトのプロパティ画面での「発行フォルダーの場所」で、InstallUrlが「インストールフォルダーのURL」です。
ローカルのIISを指定していますが、共有フォルダにあるIISならば、同じような記述で出来ると思います。
ApplicationVersionが「バージョンの発行」で、最後を * にするとリビジョン番号が代わりに設定されます。
オプションを設定しない場合は、csprojファイルに設定されている値が使用されます。
対応していない機能
リリース用に使おうと思っていたので、以下の機能は考慮していません。
- htmlファイルの作成
- リビジョンの自動インクリメント
以上です。
環境:
Windows 8.1 Pro
Visual Studio 2013 Professional