MS_BuildScript - NetDevInfraWGinOSSConsortium/NetDevInfraWiki GitHub Wiki

ビルドスクリプト

抂芁

ビルドスクリプトでビルド自動化をするず、かなり生産性向䞊に寄䞎する。

ツヌル

䞋蚘ツヌルを䜿甚しおビルドを行うこずが出来る。

コマンドラむン

Visual Studio をコマンドラむンで呌び出しおビルドできる。

devenv /build release solution.sln 
  • devenv は Visual Studio の EXE

  • *.bat 化も容易、倚くの芁件にはこちらで察応可胜。

補足devenv を CI で䜿うべきではない理由: 手元の自動化には
手軜だが、ビルド サヌバでは避けるのが定石である。

【devenv の問題】★
 ・【IDE 本䜓を起動する】
     → 重い。ラむセンスが芁る。GUI セッションを芁求しうる
 ・【倚重起動できない】
     → 䞊列ビルドに向かない
 ・ナヌザヌ蚭定.suo、ナヌザヌ プロファむルに圱響される
     → 「私の環境では通る」の枩床 ★
 ・戻り倀・ログが扱いにくい

【CI での正しい遞択】★
   ・.NET Framework  → 【MSBuild.exe】
   ・.NET Core 以降  → 【dotnet build】★
   ・Build Tools のみ導入すれば
     【VS 本䜓をむンストヌルせずに枈む】
       Visual Studio Build Tools無償
     → コンテナ むメヌゞも提䟛されおいる

【devenv が今も芁る堎面】
   ・VS 固有のプロゞェクト皮別で
     MSBuild だけでは通らないもの
     䞀郚のセットアップ プロゞェクト、
       叀い C++ 系のカスタム ビルド
   → その堎合も【将来の負債】ず認識しおおく

ビルド・むベント

  • 「ビルド前のむベント」
  • 「ビルド埌のむベント」

がある。

䟋えば、プロゞェクトプロゞェクト・ファむル*.csproj *.vbprojに、
[ビルド埌のむベント] を仕掛けお、プロゞェクトのバむナリ出力を配眮できる。

補足ビルド むベントの萜ずし穎: 手軜な反面、壊れやすい。

【① 倱敗しおも気付きにくい】★
   ・Pre/Post build event の
     終了コヌドが 0 以倖ならビルドは倱敗するが、
     ゚ラヌ メッセヌゞが【埋もれやすい】
   → 重芁な凊理はカスタム Target にしお
     Message / Error タスクで明瀺する

【② パスに空癜があるず壊れる】
   → マクロは必ず匕甚笊で囲む
      copy "$(TargetPath)" "$(SolutionDir)bin\"

【③ SDK スタむルでは Target の方が玠盎】★
   <Target Name="CopyOutput" AfterTargets="Build">
     <Copy SourceFiles="$(TargetPath)"
           DestinationFolder="$(SolutionDir)dist\" />
   </Target>
   → クロスプラットフォヌムで動く
   → 増分ビルドInputs/Outputsを指定できる
   → cmd 䟝存の bat を曞かずに枈む

【④ 䞻なマクロ】
   $(TargetPath)    出力ファむルのフル パス
   $(TargetDir)     出力ディレクトリ
   $(ProjectDir)    プロゞェクトのディレクトリ
   $(SolutionDir)   ゜リュヌションのディレクトリ
                    ※ dotnet build 単䜓では
                      【空になるこずがある】★
   $(Configuration) Debug / Release

参考

MSBuild / NAnt

マむクロ゜フトのビルド環境であり、通垞 Visual Studio ず䞀緒に䜿われおいる。

  • nmake ツヌルの機胜的な意味での.NET 版

  • Visual Studio プロゞェクトを IDE 無しでビルドできる。

NAnt

2012 幎あたりで開発が停止しおいる暡様。

  • NAntを掻甚しお開発時の䜜業を自動化する1-4CodeZine
    http://codezine.jp/article/detail/354

    • ビルドツヌルずは、アプリケヌションの構築に必芁な゜ヌスコヌドの
      コンパむルを容易にしたり、定型䜜業を自動化したりできるツヌルです。

    • NAnt の最倧の魅力は呌び出せる機胜の倚さにありたす。
      この機胜のこずを NAnt では「タスク」ず呌んでいたす。

補足NAnt はその埌どうなったか: 「2012 幎あたりで停止」ずいう
芋立おは正しく、その埌も再開しおいない。

【NAnt の珟況】★
   ・最終リリヌスは 0.922012幎6月
   ・以降、正匏リリヌスなし
   ・.NET Core / .NET 5+ ぞの察応もない
   → 【新芏で遞ぶ理由はない】

【䜕が代わりになったか】
   ・ビルド定矩       → 【MSBuild】.csproj そのもの★
   ・タスクの豊富さ   → 【MSBuild タスク + NuGet】
       MSBuild.Extension.Pack、
         MSBuildTasks 等のタスク集
   ・CI ずの連携      → 【GitHub Actions / Azure Pipelines】★
       → 「ビルド以倖の定型䜜業」は
         CI のステップずしお曞くようになった
   ・C# でビルドを曞きたい
       → 【Cake】C# Make★
       → 【NUKE】型付きのビルド定矩
       → いずれも「XML を曞きたくない」局に支持がある

参考

  • ミッションビルドを自動化セペ  IT
    http://www.atmarkit.co.jp/fdotnet/nagile/nagile04/nagile04_01.html

  • .NETビルド・゚ンゞン「MSBuild」䜿いこなし術  IT
    http://www.atmarkit.co.jp/fdotnet/special/msbuild01/msbuild01_01.html

    • MSBuild がビルド・プロセスの統䞀ず自動化を目暙ずしおいるのに察し、

    • NAnt は最終的にはビルド・プロセスだけでなく
      アゞャむル開発のプラクティス実践項目の 1 ぀である
      「継続的むンテグレヌション」を実珟するこずを目的ずしおいる。

    そのため NAnt の方が、䟋えばテスト・ツヌル「NUnit」の呌び出しが
    暙準機胜だけで可胜なこずなど、
    あらかじめ甚意されおいるタスクが MSBuild よりも豊富である。

移行メモ正誀: 移行元では「䟋えばテスト・ツヌル「NAnt」の
呌び出しが暙準機胜だけで可胜」ずなっおいたが、
テスト・ツヌルは NAnt ではないNAnt 自身の呌び出しでは意味が通らない。
文脈から NUnit の誀蚘ず刀断し修正した
NAnt には <nunit2> タスクが暙準で甚意されおいた。

その他

NuGet

  • .NET 向けのパッケヌゞ管理システムで、
    ビルド時に、packages.config を芋おパッケヌゞを埩元する。
..\nuget.exe restore "Frameworks\Infrastructure\AllComponent.sln"
  • PackageReference に切り替え埌のビルドでは、NuGet リストアを
    nuget.exe ではなく、MSBuild /t:Restore で行うように倉曎されおいる。
MSBuild.exe /p:Configuration=Debug -v:d /t:Restore XXXXX.sln

移行メモ衚蚘: 移行元の「package.config」を、
実際のファむル名である「packages.config」に修正した。

補足packages.config ず PackageReference: 原文が觊れおいる
この移行は、今も珟堎で残っおいる䜜業である。

packages.config PackageReference
蚘述堎所 別ファむル .csproj の䞭 ★
䟝存の解決 フラットに党郚曞く 掚移的䟝存を自動解決 ★
配眮先 ゜リュヌション盎䞋の packages/ グロヌバル キャッシュ~/.nuget/packages★
埩元 nuget restore msbuild /t:Restore / dotnet restore
察象 .NET Framework の旧圢匏 SDK スタむル / 珟行
【PackageReference の利点】★
 ・リポゞトリに packages/ を含めなくおよい
   → 【リポゞトリが軜くなる】
 ・掚移的䟝存が自動で解決される
   → 「A が B を芁求しおいる」を自分で曞かなくおよい
 ・条件付き参照が曞ける
     <PackageReference Include="X" Version="1.0"
                       Condition="'$(TargetFramework)'=='net48'" />
 ・【䞭倮パッケヌゞ管理】Directory.Packages.props★
   → 耇数プロゞェクトのバヌゞョンを 1 箇所で揃える

【移行時の泚意】
 ・VS の [packages.config を PackageReference に移行] で
   䞀括倉換できるが、
   - content ファむルを配るパッケヌゞ
   - install.ps1 に䟝存するパッケヌゞ
   は【挙動が倉わる】★
 ・[NU1605](MS_NuGetNU1605) 等の
   ダりングレヌド怜出が厳しくなり、
   今たで通っおいたビルドが萜ちるこずがある

.NET Core では dotnetコマンド を䜿甚する。

トラブルシュヌト

しかし、色々ず問題が起きたす。

MSBuild の該圓節を参照。

NuGet の該圓節を参照。

dotnetコマンド の該圓節を参照。

参考

Open 棟梁は devenv や MSBuild を䜿甚した
ビルド バッチ*.batを提䟛しお、
ビルドタスクの自動化を行っおいる。

https://github.com/OpenTouryoProject/OpenTouryo/tree/develop/root/programs/CS

補足ビルド自動化の珟圚の到達点: 「ビルド スクリプトで自動化するず
生産性向䞊に寄䞎する」ずいう䞻匵は正しく、さらに先ぞ進んでいる。

【段階】★
   ① 手䜜業でビルド
   ② 【bat / スクリプトで自動化】← 本ペヌゞの䞻題
   ③ 【CI で自動実行】push のたびに回る★
      → [CI](MS_CI) / [GitHub Actions](MS_GitHubActions)
   ④ 【CD たで自動化】承認を挟んで配眮
      → [CI/CD パむプラむン](MS_CICDPipeline)
   â‘€ 【IaC】環境そのものもコヌド化

【②で止たるず起きるこず】
   ・「ビルドできるのは特定の PC だけ」
   ・スクリプトが【誰にも保守されない】
   ・手元ず CI で結果が違う
   → ②を䜜るなら、
     【そのたた CI で回せる圢】にしおおくのが埗策 ★
     ロヌカル環境固有のパスを埋め蟌たない、
       匕数で環境を切り替える

【再珟性を䞊げる仕掛け】★
   ・global.json      
 SDK のバヌゞョンを固定する
   ・Directory.Build.props 
 共通の MSBuild 蚭定
   ・Directory.Packages.props 
 パッケヌゞ版の䞭倮管理
   ・【ロック ファむル】packages.lock.json
     → 䟝存の版を固定し、
       「昚日は通ったのに今日萜ちる」を防ぐ
   ・コンテナでビルドする
     → 環境差そのものを消す

Tags: 移行, テスト, デバッグ, デプロむ, CI, .NET開発

⚠ **GitHub.com Fallback** ⚠