redwarrior’s diary

C#, ASP.NET, WEB, G*などの雑多な情報

TFS 2018 で ClickOnce の発行を行う

少し前に作成したWPFアプリケーションは、対象OSとしてWindows 8.1も含まれるため、フレームワークとして.NET Framework 4.5.1を使用しました。

Webアプリ(ASP.NET MVC)は、TFS上でビルド(XAMLではない)、リリースが出来るようにしたので(下記参照)

redwarrior.hateblo.jp

今回はデスクトップアプリケーションのビルド、ClickOnceによる発行をTFS上で試しました。

はじめに

TFSはビルド、リリースに分かれていて、ビルドが対象のビルドを行い、リリースで各環境への配置を行います。 ASP.NET MVCでは、リリースでIISの設定を行うため、ビルドとリリースに分けて使いました。

しかし、ClickOnceは、MSBuildのパラメータでビルド/発行を切り替えるし、発行先は1か所なので、リリースを使用せず、ビルドだけを使用しました。

作業開始

まず、「.NET デスクトップ」テンプレートを使用してビルド定義を作成しました。

WPFアプリケーションで、Prismを使用するためにPrism Template Packでプロジェクトを作成したところ、NuGetパッケージの管理方式に「PackageReference」を使用しており、リポジトリにpackagesフォルダが存在せず、リポジトリに使用するDLLを含めなくなりました。

そのため、NuGet関連タスクは削除せずに残すことにして、早速、ビルドを試しました。これはテンプレートのままで上手くいきました。

次に、ClickOnceの発行を試しました。「ソリューションのビルド」タスクのMSBuild引数で/target:publishとすると、ClickOnce用のファイルが、app.publishフォルダに作成されます。

VSの画面から発行した場合とは違い、サーバへのファイルコピーは行われません。

以前にコマンドラインから実行したときは、csprojファイルを編集して、コピー処理を追加しました。これを今回はTFSのビルド定義のタスクで行う必要があります。

いろいろと試してみた結果、最終的にはファイルのコピー用に、二つのタスクを作成しました。

ファイルのコピータスク

ビルド結果から、app.publishフォルダだけをコピーします

ソースフォルダ
$(system.defaultworkingdirectory)

コンテンツ
**\bin\$(BuildConfiguration)\app.publish\**
!**\bin\$(BuildConfiguration)\app.publish\$(VsProject).exe

ターゲット フォルダー
$(build.artifactstagingdirectory)
成果物の公開タスク

app.publishフォルダを、配布用フォルダにコピーします。発行場所は、「TFS」ではなく「A file share」を指定しました。

発行するためのパス
$(build.artifactstagingdirectory)\$(VsSolution)\bin\$(BuildConfiguration)\app.publish

成果物名
app.pubslihの中身が格納されるフォルダ名

ファイル共有パス
成果物が格納されるフォルダの親フォルダ

VsProject、VsSolution変数は、変数タブで作成し、値としてプロジェクト名、ソリューション名を登録しました。

つまづいた点

最初はファイルのコピータスクで、配布用フォルダへのコピーまでやろうとしたが、ソースフォルダ(リポジトリのルートパス)からのコピーになってしまい、階層が深くなってしまったので、分けることにしました。

成果物の公開タスクで、ファイルが圧縮されてしまわないか心配しましたが大丈夫でした(フォルダの内容がそのままコピーされました)

以上