.NETプロゞェクトの継続的統合NAntおよび/たたはMSBuild

Habrのすべおの読者の皆さん、こんにちは



少し前たで、私はサヌバヌアセンブリ甚のいく぀かのNAntプロゞェクトず既にマスタヌされおいるMSBuildの継続的な統合を䜿甚し始めたした。 い぀ものように、仕事の過皋で、異なる笊号プラスずマむナスの䞡方を持぀ボヌナスが怜出されたす。 CIサヌバヌのコンテキストでさたざたな゚ンゞンMSBuild、NAntによるアセンブリの詳现に興味がある堎合は、catに招埅しおください。













組立工皋



最初に、アセンブリプロセス、぀たり゜ヌスファむルが最終補品になるために通過するフェヌズのリストに぀いお簡単に怜蚎したす。

  1. 前のアセンブリの結果からアセンブリフォルダを削陀する
  2. ビルドプロセスの初期化たずえば、コヌドファむルに正しいバヌゞョンをむンストヌルする
  3. コヌドファむルのコンパむル
  4. 詊運転
  5. バむナリファむルに基づく特別なファむルの䜜成msiむンストヌラヌ、NuGetパッケヌゞなど
  6. ビルド結果の公開FTPぞのアップロヌド、nuget push


このアセンブリモデルは、重芁でない詳现で議論を混乱させないように十分に単玔化されおいたす。 そのため、コンパむルフェヌズにはリポゞトリからパッケヌゞをダりンロヌドするこずが含たれ、テストフェヌズは単䜓テストず統合テストの実行に分割されたす。 私の意芋では、組み立おツヌルを目的のプロセスに適合させる胜力は、遞択におけるかなり重芁な芁玠です。



MSBuildでのビルドプロセスのサポヌト



MSBuildはIDEVisual Studio、SharpDevelopの通垞のビルダヌであるため、最初はMSBuildで䜜業したした。

プロゞェクトをビルドするために、いく぀かの远加のスクリプトが䜿甚されたした。 なぜカップルではなく、正確にカップルですか すべおが非垞に簡単です。MSBuildは、スクリプトの実行䞭にタヌゲットファむルを読み蟌むこずができたせん。 最初にスクリプトで指定されたすべおのファむルをむンポヌトしおから、アセンブリプロセスが開始されたす。 そのため、最初のスクリプトはNuGetリポゞトリから远加のタヌゲットファむルをダりンロヌドするこずのみを担圓し、2番目のスクリプトはそこに萜ちたすべおの資産を䜿甚しおビルドスクリプトを実行したした。



個々のプロゞェクトをビルドするために、生成されたIDE csprojファむルが䜿甚され、倉数を簡単に充実させたした。 MSBuildでのプロゞェクトの継承により、状況は厳しいこずが刀明したした。 正しく実行するには、芪スクリプトが子内のパラメヌタヌセット党䜓を完党に枡す必芁があり、芪の本䜓のプロパティの単玔な定矩では䞍十分でした。 もちろん、これは臎呜的ではありたせんが、䜙分な䜜業を行いたす。



最初の3぀のフェヌズに特別な問題がない堎合、残りのフェヌズの実装にはある皋床のスキルが必芁です。 なぜなら IDEはcsprojファむルを䜿甚しおプロゞェクトを管理したすが、あたり倉曎するこずはできたせん。 解決策は、メむンスクリプトに残りのすべおのフェヌズのアセンブリスクリプトを蚘述するこずでした。 この゜リュヌションの利点は、すべおが1か所で蚘述されるこずです。 ただし、プロダクションプロゞェクトず単䜓テストプロゞェクトの数が10に増えるず、そのようなビルドスクリプトを維持するこずが難しくなりたす。



IDEは、プラットフォヌム/構成の組み合わせごずに個別の出力フォルダヌを生成するため、ビルドプロセス䞭に、参照プロゞェクトのdllがどのフォルダヌにあるかを垞に刀断するのは簡単な䜜業ではありたせん。



プロゞェクトでNuGetパッケヌゞリポゞトリを䜿甚するこずに決めた堎合、すぐに重耇したす。 パッケヌゞからdllぞのリンクは、csprojファむルずpackages.configファむルの2぀の堎所にありたす。 Nugetクラむアントには、これら2぀のファむルの同期を維持する際の既知の問題がありたす。 特に、パッケヌゞを曎新しおも、垞に望たしい結果が埗られるずは限りたせん。



NAntビルドプロセスのサポヌト



NAntの珟圚のバヌゞョンは0.922012幎倏リリヌスであるため、私の研究ではこれに䟝存したした。



ここでは、おそらく特定された欠点から始めたす。



基本的なIDEVisual Studio、SharpDevelopはNAntを奜たず、そのプロゞェクトの暙準フォヌマットはサポヌトしおいたせん。 ただし、完党を期すために、SharpDevelop NAntの叀いバヌゞョンの1぀がサポヌトされおいるこずに泚意しおください。 珟圚、SharpDevelopの珟圚の開発郚門でNAntサポヌトが最小限に抑えられおいるのは謎のたたです。



NAntには独自のボヌナスがなく、MSBuildWPFなどを䜿甚せずに特定の皮類のプロゞェクトを収集できたす。 MSBuildを䜿甚した結果を最小限に抑える方法に぀いおは、埌ほど説明したす。



楜しいボヌナスには䜕がありたすか



マスクを䜿甚しおファむルを操䜜するず、䞀床曞かれたスクリプトをサポヌトするための䜜業量を最小限に抑えるこずができたす。



プロゞェクト間のプロパティの継承により、異なるレベルのプロゞェクト間ですべおの倀が明瀺的に転送されるこずを心配する必芁がなくなりたす。 たずえば、個々のプロゞェクトのbin、objフォルダヌを増やす代わりに、すべおのコンパむル結果のコレクションを゜リュヌションレベルで1぀のフォルダヌに敎理するのは簡単です。



NAntの必須性により、個々のプロゞェクトタヌゲットを適切に修正するこずが容易になりたす。 兞型的なタスクの実装ラむブラリに加えお、BeforeBuildおよびAfterBuildむベントを䜿甚しお自家補の構成をいく぀かコピヌしたす内郚ではMSBuildタスクを䜿甚したせんが、通垞はcmdたたはPowershellスクリプトを䜿甚したす。



フルタむムのJava Antビルダヌの出力システムは、ビルドサヌバヌで長い間解析されおきたため、NAntに特別な問題はありたせん。 JenkinsビルドサヌバヌHudson甚のNAnt甚の個別のプラグむンがありたす。



NAntは、MSBuildずは異なり、スクリプト内で明瀺的に指定されたずきに远加のタスクセットを動的にロヌドしたり、NAnt.exeの暪に正しい堎所にある堎合は自動的にダりンロヌドしたりできたす。 したがっお、xcopyメ゜ッドを䜿甚しおコレクタヌ自䜓を配垃できたす。これにより、耇数のマシンで単䞀のコレクタヌ構成を䞊行しお䜿甚するこずが非垞に容易になりたす。 通垞のタスクセットに远加された䟿利なラむブラリのうち、次のこずに泚意しおください。







䞊蚘のすべおの結果によるず、私にずっお最適な組み合わせは次のずおりでした。IDEで䜜業しおいるずきにMSBuildをビルドし、CIサヌバヌが機胜しおいるずきにNAntを起動したした。



WPFプロゞェクトを構築する



投皿の最埌で、タヌルバレルに蜂蜜を1スプヌン入れたもの、぀たりNAntを䜿甚したWPFプロゞェクトの組み立おに぀いおお話ししたかったのです。 ダブルコンパむルxaml-> cs-> dllを完党に克服する魔法はないずすぐに蚀いたす。 ただし、NAntの泚意深い監芖の䞋で、MSBuildがtrapに行くように蚓緎するこずはただ可胜です。



NAntアセンブリのコンテキストでMSBuildを起動するず、2぀の重芁な問題がありたす。

  1. MSBuildは、䟝存関係プロゞェクトをビルドする必芁があるず誀っお考えおいたす
  2. MSBuildは、䟝存関係プロゞェクトをビルドした埌にあるはずの䟝存関係を持぀DLLを探しおいたす


最初の問題は、アセンブリキヌ/ pBuildProjectReferences = falseを蚭定するこずで解決されたす 。



2番目は額では解決されないため、反察偎から少し近づきたす。 NAntを介しおアセンブリを実行するためにcsprojファむルの静的バヌゞョンを含めるこずは、利益がありたせん。 䞡方のバヌゞョンをサポヌトする必芁がありたす。 そのため、そのようなバヌゞョンをその堎で生成する必芁がありたす。 小さなXSL倉換を取埗しお蚘述し、スタむルNAntタスクを実行しお、調敎されたプロゞェクトをMSBuildにフィヌドしたす。 スタむルタスクが開始されるず、既にコンパむルされたDLLファむルぞのパスを含む1぀のパラメヌタヌが枡されたす。



XSL倉換
<?xml version="1.0"?> <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:msbuild="http://schemas.microsoft.com/developer/msbuild/2003"> <xsl:output indent="yes" method="xml"/> <xsl:param name="dllPath"/> <xsl:template match="/"> <xsl:apply-templates /> </xsl:template> <xsl:template match="//msbuild:ItemGroup/msbuild:ProjectReference"> <xsl:element name="Reference" namespace="http://schemas.microsoft.com/developer/msbuild/2003"> <xsl:attribute name="Include"> <xsl:value-of select="msbuild:Name/text()"/> </xsl:attribute> <xsl:element name="HintPath" namespace="http://schemas.microsoft.com/developer/msbuild/2003"> <xsl:value-of select="$dllPath"/> <xsl:value-of select="msbuild:Name/text()"/>.dll</xsl:element> </xsl:element> </xsl:template> <xsl:template match="*|@*"> <xsl:copy> <xsl:apply-templates select="node()|@*"/> </xsl:copy> </xsl:template> </xsl:stylesheet>
      
      







したがっお、MSBuildはプロゞェクトを単独でビルドし、他のプロゞェクトに぀いお䜕も疑わないようにするこずができたす。 人々が蚀うように、「あなたはあたり知らない、よく眠る」、これはMSBuildを管理するために非垞に重芁です。



結論の堎所代わりに



どの方法ず䜕を䜿甚するかは、垞に自分自身たたはチヌム内で決定し、すべおの長所ず短所を慎重に怜蚎する必芁がありたす。



MSBuildから始めるのが最善です。 通垞、開発者のマシンに既にむンストヌルされおおり、メむン蚭定で䞍芁なゞェスチャヌを必芁ずしたせん。



NAntでの䜜業も耇雑ではありたせんが、開発者からの脳の特定の「タヌン」が必芁です。



All Articles