ごった煮

色々な事を書いてます

ASP.NET (.NET Framework) のプロジェクトを Azure DevOps でビルドする

Azure DevOps 便利ですよね ASP.NET Core ならテンプレートも充実してるしすぐにCICD を組むことが出来ます。 ですが意外と .NET Framework のプロジェクトをビルドするのはややこしいと思ったので備忘録にします。

実際にやってみる

結局 MSBuild を頑張る形になります。 普段は、Visual Studio が頑張ってくれるので MSBuild の使い方を意識することは、あまりなくそれがハードルの高さに感じます。

因みに今回は、クラシックエディタを想定しています。(OtherGit を使う想定です)

パイプライン作成時のテンプレートで以下のものを選択します。 f:id:papemk2:20191126184536p:plain

テンプレートが出来ると以下のような感じになります。 f:id:papemk2:20191126184842p:plain

ここで大事なのは、Build Solution の Job です。 1 ソリューション、1プロジェクトみたいな形ならこのままでOKですが、複数プロジェクトが入っていたりすると MSBuild Arguments を書く必要が出ます。 f:id:papemk2:20191126185033p:plain

デフォルトだと、特定のプロジェクトだけデプロイしたい場合に対応できないのでここを頑張ります。

MSBuild arguments

デフォルトでは、以下の記述があります。

/p:DeployOnBuild=true /p:WebPublishMethod=Package /p:PackageAsSingleFile=true /p:SkipInvalidConfigurations=true /p:PackageLocation="$(build.artifactstagingdirectory)\\"

これだとプロジェクトが指定されていないので、全てのプロジェクトがビルドされます。 なので特定のプロジェクトだけビルドしたい場合は、以下のようにします。

/p:DeployOnBuild=true /p:WebPublishMethod=Package /p:PackageAsSingleFile=true /p:SkipInvalidConfigurations=true /p:PackageLocation="$(build.artifactstagingdirectory)\\" /t:"ターゲットプロジェクト:Clean;Build"

/t ターゲットプロジェクト の後ろのClean;Build は、クリーンしてからビルドするコマンドになります。 これを入れておくのが無難です。

ターゲットプロジェクトは、ソリューション内でフォルダが切られてその下にいる場合は、フォルダ名\プロジェクト名とします。 プロジェクト名に . が含まれる場合は、. を入れられない仕様なので _ に置き換えます。 例えば Target.Project.csproj の場合は、Target_Project にします。

これでビルドを回せば、デプロイ用のパッケージがいい感じに作られます。

MSBuild が入っている環境ならコマンドを試せるので、手元の環境で試して問題が無かったら DevOps に反映みたいな形がいいかと思います。 その場合は、

msbuild ソリューション名.sln 上記のコマンド

とすると実行できます。

まとめ

MSBuild は、Visual Studio があるとうまく隠蔽されていて触る機会が少なくハードルが高いですが、一度覚えると便利なので試してみるといいかもしれません。