NAntまたはMSBuild、どちらをいつ選択するか?


160

スタックオーバーフローに関する他のNAntおよびMSBuild関連の質問があることは承知していますが、2つを直接比較することができなかったため、ここに質問があります。

MSBuildではなくNAntを選択する必要があるのはいつですか?どちらがより良いですか?NAntは、ホーム/オープンソースプロジェクトやMSBuildの作業プロジェクトに適していますか?2つのいずれかでの経験は何ですか?

回答:


97

今週も同様の調査を行いました。これが私が決定できたことです:

NAnt:

  • クロスプラットフォーム(Linux / Monoをサポート)。たとえば、Webサイトを複数のターゲット(つまり、Linux ApacheとWindows IIS)にインストールする場合に便利です。
  • 構文が95%Antに類似(現在のAntユーザーまたはJavaビルダーが選択しやすい)
  • ビルドの一部としてユニットテストを実行するためのNUnitとの統合、および製品ドキュメントのためのNDocとの統合。

MSBuild:

  • .NETに組み込まれています。
  • Visual Studioと統合
  • VisualBuildでMSBuildを使い始めるのは簡単です-それはすべて舞台裏です。さらに深くしたい場合は、ファイルを手動で編集できます。

主観的な違い: (YMMV)

  • NAntのドキュメントはもう少し簡単です。たとえば、MSBuildタスクリファレンスには、「Cscタスク-Cscタスクとそのパラメーターの説明」(「ヘルプ」に感謝しますか?)とNAntタスクリファレンス「csc-C#プログラムのコンパイル」がリストされています。更新:私はMSBuildのドキュメントが改善され、今ははるかに改善されていることに気付きました(おそらくNAntと同等)。
  • Visual Studio内から直接ビルドスクリプトソース(*。* projファイル)を編集する方法を理解するのは簡単ではありません。NAntでは、Visual Studioに.buildスクリプトをXMLファイルとして処理させるだけです。
  • どうやら、Visual Studioでは、Webアプリケーションプロジェクトはデフォルトで*。* projファイルを取得しないため、MSBuildを実行して配置スクリプトを作成する方法を理解するのが非常に困難でした。
  • NAntはVisual Studioに組み込まれていないため、アドインを使用して、または「外部ツール」として追加する必要があります。これは設定が少し面倒です。
  • (編集:)同僚の1人がこれを提案しました。継続的な統合のためにCruiseControlを使用してビルドマシンをセットアップする場合、CruiseControlはそのままでNAntとうまく統合されます。更新: CruiseControlにもMSBuildタスクがあります
  • 主観的な違いに関する完全かつ最新の議論については、以下のコメントを参照してください。

.projファイルは編集できますが、プロジェクトをアンロードした後(プロジェクトのコンテキストメニューに[アンロード]オプションが表示されます)
Yordan Pavlov

18
@ヨルダン:または、カスタマイズを別の.buildファイル(またはその他)に入れ、.csprojファイルからインポートして実行します。その後、.csprojを1回編集するだけで、ソリューションに.buildファイルを追加できます。ダブルクリックすると、他のファイルと同じように編集できます。オプションで.buildファイルをXMLエディターにマップできます。
ケントブーガート2009年

9
MSBuild CCNetタスクが存在します-詳細は次の場所にあります:confluence.public.thoughtworks.org/display/CCNET/MsBuild+Task
Gavin Miller

2
.csprojファイル自体を変更する必要がないことに注意してください。MyProject.csproj.userファイルを使用してこれらの変更を行い、.csprojファイルをクリーンで元の状態に保つことができます。MSBuildはこれらの.userファイルを探すことを認識しており、それらをビルドプロセスに自動的にインポートします。参照:ahmed0192.blogspot.com/2006/11/...
CleverPatrick

3
@CleverHuman、その.userファイルには通常、プロジェクトの他の部分と一緒に通常チェックインしないプロジェクトに対するユーザー固有の変更が含まれていませんか?私は何年もケントの提案を使用してきましたが、それは非常にうまく機能します。PROJファイルを1回変更して2番目のPROJファイルを含め、2番目のPROJファイルをプロジェクトに追加します。その後、アンロード/リロードプロセスを実行する必要なく、2番目のPROJファイルを簡単にカスタマイズできます。私はこの理由でMSBuildに傾く傾向があります。
DarinH

77

(Windowsプラットフォームでの)私にとってのMSBuildの主要な魅力の1つは、.NET自体の一部として提供されることです。つまり、Windows Updateで最新のWindowsマシンであれば、MSBuildを利用できます。これに加えて、C#コンパイラーも.NET自体の一部であり、クリーンなマシンでプロジェクトをビルドできるプラットフォームがあるという事実を追加します。Visual Studio behemothをインストールする必要はありません。一方、NAntは、ビルドをトリガーする前に明示的にインストールする必要があります。

参考までに、過去の重要なビルドでは、NMake、Make、Ant、Rake、NAnt、MSBuildを(この順序で)使用しました。私のお気に入りはハンドダウンのMSBuildです(そして「それがVisual Studioが使用するものなので」私は好みません)。私見、それは非常に評価されていないビルドツールです。

NAntとMSBuildを、手続き型プログラミングと関数型プログラミングの違いと比較します。NAntは非常に単純で、何を見ても簡単です。一方、MSBuildでは、もう少し考える必要があります。学習曲線は急です。しかし、「取得」したら、それを使って驚くべきことができます。

ですから、関数型または論理型のプログラミングにも引き付けられる場合は、MSBuildを検討することをお勧めします。具体的な結果を確認する前に少しの時間と労力を費やすことをいとわない場合(もちろん、最終的には投資が報われ、より強力なことをより効率的に行うことができます)。


11
うわー!MSBuildがランタイムに付属していることを知りませんでした。それはかなりクールであり、私は間違いなくそこに利点を見ることができます。ただし、関数型と手続き型の比較がわかりません。MSBuildが「取得」されると、MSBuildがさらに強力になる理由を聞くのは興味深いでしょう。
スコットサード

2
Msbuildは実際には、特定のターゲットの呼び出し中にのみ明らかになるさまざまなSDKからのファイルに多数の依存関係を持っています。したがって、msbuildはそのまま使用できますが、実行されない場合があります。
サムShiles

6
追加すべき1つのこと:msbuild内から.NETアセンブリを呼び出すことができるだけでなく、非常に便利な関数(たとえば、Systme.IO.Pathのすべてがビルドスクリプトで便利になる)に1回アクセスできます。 、msbuildファイル内にプレーンなC#コードを記述して実行することもできます。それは単に素晴らしいです。msdn.microsoft.com/en-us/library/dd722601.aspxそして、物事が複雑になりすぎた場合でも、カスタムタスクを簡単に作成できます。
stijn 2012

1
ウィキペディアから:「MSBuildは、以前は.NET Frameworkにバンドルされていましたが、Visual Studio 2013以降、代わりにVisual Studioにバンドルされています。」
DavidRR 2015

MSBuild(Microsoft Build Tools 2013)は、Visual Studio 2013とは別にここからダウンロードすることもできます。
DavidRR 2015

45

個人的には、同じプロジェクトで両方を使用しています。

MSBuildは、Visual Studioソリューションとプロジェクトの構築に優れています。

私の意見では、NAntはより簡単に手動で編集できます-特にAntを既に知っている場合はなおさらです。NAntはNAntContribを使用して非常に簡単にMSBuildを呼び出すことができます。だから、私はNAntスクリプトを手作りして、ビルドされたファイルのコピー、クリーンアップなどのようなことを行い、MSBuildを呼び出して実際の「C#ソースコードをアセンブリに変換する」部分を実行します。

その例が必要な場合は、プロトコルバッファのビルドファイルを参照してください。(素晴らしいNAntスクリプトであるとは言いませんが、それでうまくいきます。)


1
また、Monoもサポートしています。MonoのMSBuildサポートは不安定です。
Mehrdad Afshari、

@Mehrdad:はい、いくつかの点で私は本当に現在のアイデアは、それがモノに最終的に仕事かかわらであろうと常にだった:(作業からそれを停止しGMCSのバグがあります...プロトコルバッファはモノラルでコンパイルするために取得しようとしなければならない。
ジョンスキート

1
皆さん、モノはXBuildを使用しており、MSBuildをXBuildに移植するのは簡単です。これを確認してください:mono-project.com/Porting_MSBuild_Projects_To_XBuild
fyasar

20

NAntには追加設定なしでより多くの機能がありますが、MSBuildの基本構造(アイテムメタデータロック)ははるかに優れているため、再利用可能なMSBuildスクリプトを簡単に構築できます。

MSBuildを理解するには少し時間がかかりますが、一度理解すれば非常に便利です。

学習資料:


38
ねえ、私はそれらの本を聞いた:)
イブラヒム・ハシミは

19

KISS = MSBuildを使用します。

箱から出して合理的な仕事をするものがあるのに、なぜ他のものをミックスに追加するのですか?MSBuildが到着したとき、NAntは亡くなりました。また、MonoにはMSBuild実装(xbuild)があります。

DRY = MSBuildを使用します。

ビルドシステムに何が欲しいのか自問してみてください。2つの異なる構成を維持するのではなく、IDEでも使用されるビルドシステムが必要です。

個人的には、NAntに関する実際の議論を聞きたいと思っています。本当に水を保持しているものは考えられないからです。


2
「msbuildが到着したとき、nantが死んだ」-VS(私は使用しません)がなくても、これはクリンチャーだと思います。
harpo

同意する。DotNet 1.1にはmsbuild.exeがありませんでした。それで、私たちは当時ねじ込まれました。2.0以降、msbuild.exeと追加のライブラリはたくさんあります。また、カスタムMsBuild-Taskを作成することには学習曲線がありますが、私は長年にわたってそのうちの約10を作成しました。
granadaCoder 2014年

1
私は同意する必要があります。ビルドサーバーはより速く失敗することを可能にするため、開発者と同じツールを使用してビルドする必要があります。
クリスタン、2014

14

いくつかの投稿者が言及していることに気付いた1つのことは、.csproj(または.vbprojなど)ファイルを手動で編集する必要があることでした。

MSBuildでは、.userファイルを使用してこれらの。* projファイルをカスタマイズできます。というプロジェクトがある場合 MyCreativelyNamedProject.csprojをし、その中のMSBuildタスクをカスタマイズしたい、私は名前のファイルを作成することができMyCreativelyNamedProject.csproj.userを使いCustomBeforeMicrosoftCommonTargetsCustomAfterMicrosoftCommonTargetsをこれらのファイルをカスタマイズします。

また、NAntとMSBuildの両方は、カスタムのMSBuildタスクとNantContrib拡張機能を使用して、ハートのコンテンツに合わせてカスタマイズできます。

したがって、NAntまたはMSBuildを使用することは、実際には親しみやすさに帰着します。

  • Antに慣れている場合は、NAntを使用してください。学習曲線は非常に簡単になります。
  • どちらのツールにも精通していない場合、MSBuildは既にVisual Studioに統合されており、追加のツールは必要ありません。

MSBuildは、.NETおよびVisual Studioのすべての新しいバージョンがリリースされるとすぐに動作することがほぼ保証されていますが、NAntには多少の遅れがある可能性があります。


1
.netリリースとnantリリースの間のラグを指摘するための+1。.net 3.5がリリースされたとき、物事を機能させるために 'nets'からハッキングされたnant.exe.configを使用する必要があることを覚えています。楽しくない。
mmacaulay 2010年

9
この周りの多くの投稿によると、これらの.USERファイルには、チェックインされるべきではない+ユーザー固有の情報+が含まれているため、ビルドカスタマイズを配置したい最後の場所になります...定義によるビルドカスタマイズユーザー固有ではないため、これらの.userファイルには含めないでください...
DarinH

1
drventureに同意する。.user-filesは、名前がpr userを示唆しているものであり、ソース管理リポジトリにチェックインすることもできません。ここはビルドを自動化する場所ではありません。
Kjetil Klaussen、

10

私はNAntスクリプトがMSBuildを呼び出すという点で両方を使用しています。NAntにとどまる私の主な理由は、隔離です。これが重要だと思う理由を説明しましょう。

  1. プロジェクトに依存関係を追加します。NAntビルドファイルはVisual Studio(私の場合、私はこれをプロだと考えています)とは無関係なので、Visual Studioは何もしません。MSBuildタスクは埋め込まれているため、ソリューションの一部であり、他のMSBuildタスクを参照できます。MSBuildコミュニティタスクがインストールされていなかったため、ビルドできないことを確認するためだけに他の人からソースコードを受け取りました。私が特に苛立たしいと思うのは、Visual Studioがビルドせず、たくさんのエラーをスローして、デバッグに時間を費やしてしまったことです。これは、要求されているビルドが(たとえば、デバッグビルドとして)MSBuildタスクの追加機能なしに進んでいる可能性があるという事実にもかかわらずです。要するに、回避できるのであれば、依存関係をプロジェクトに追加したくありません

  2. Visual Studioを開発チームに任せることができる限り、私はVisual Studioを信頼していません。これは、私のHTMLを大量虐殺するVisual Studioの初期の時代にさかのぼります。私は今でも例としてデザイナーを使用していません(最近の会議で同僚が同じことをしたことがわかりました)。Visual StudioがDLLファイルの依存関係とバージョン番号を台無しにできることを発見しました(これを複製することはできませんが、プロジェクトで一貫して発生し、多くの悲しみと時間の損失を引き起こしました)。Visual Studioを使用してデバッグモードでのみビルドするビルドプロシージャを使用しました。プロダクションでは、NAntを使用して、すべてを外部で制御します。NAntを使用してビルドした場合、Visual Studioはもはや干渉できません。

PS:私はWeb開発者であり、Windowsフォームの開発は行っていません。


6

私はMsBuildについてはあまり詳しくありませんが、両側の重要な違いのいくつかは追加で補完できるという印象を受けています。

最近、NantでSilverlightプロジェクトを構築する必要がありました。私はMsBuildでこれを行うだけで生活が楽になることを発見しました-結局、Nantスクリプト内からMsBuildタスクを呼び出すことになりました。

それを超えて、私はそれが個人的な好みの問題になると思います-それがあなたのことであれば、明らかに、Visual Studio内からMsBuildの機能の一部またはほとんどを管理できます。Nantは、スクリプトを手動で記述したい場合や、Javaの世界から来た場合は、慣れ親しんでいる場合に、より柔軟で適しているようです。


いい視点ね。どちらのソリューションも、必要に応じて簡単に拡張およびカスタマイズできます。
CleverPatrick 2010年

2

両方使ってしまいました。ビルドシステムを再設計するとき、私はトリッキーな問題に直面していました。つまり、誰もがVSを使用してプロジェクトファイル、設定、構成を更新していたため、.vcproj(およびファミリ)を取り除くことができませんでした。そのため、大量の重複とエラーが発生しやすいプロセスがなければ、ビルドシステムを新しいファイルセットに基づくことができませんでした。

このため、VSの「proj」ファイルを保持し、MSBuildを使用することにしました(これらはMSBuildファイルであり、少なくともVS2005およびVS2008はMSBuildプロジェクトファイルを使用します)。それ以外のすべて(カスタム構成、単体テスト、パッケージ化、ドキュメントの準備...)には、NAntを使用しました。

継続的な統合には、CruiseControlを使用しました。そのため、ビルドにMSBuildを使用するNAntジョブをトリガーするCCスクリプトがありました。

最後に、MSBuildはセットアッププロジェクトをサポートしていません。したがって、DevEnv.comを呼び出すか、Visual Studioを直接使用することに行き詰まっています。それが私がやったことですが、開発者は通常それらをビルドする必要がないので、デフォルトですべてのソリューション構成からセットアッププロジェクトを無効にしました。そうする場合、手動で選択してビルドすることができます。



1

NAntで利用可能なドキュメントとチュートリアルにより、NAntでビルドスクリプトの学習を開始しやすくなります。NAntのコツをつかんでビルドスクリプトを作成したら、その知識をMSBuildに変換し始めました(NAntでXを実行しましたが、MSBuildでXを実行するにはどうすればよいですか?)。Microsoftのドキュメントは通常、役立つ前にかなり高いレベルの知識があることを前提としています。

NAntからMSBuildに切り替える理由は、MSBuildの方が最新であるためです。残念ながら、NAntの最後のリリースは2007年12月8日でしたが、MSBuild 4.0(.NET 4.0)はそれほど遠くないです。NAntプロジェクトが終了したようです。

MSBuildを使用してビルドスクリプトの作成を学び始めたばかりの人向けの優れたドキュメントを見つけたら、NAntをスキップしてMSBuildに直接進んでください。NAntが新しいリリースでリリースされた場合は、NAntを使用することを検討しますが、現在は遅れています。


1
2012年6月の時点で、NAntのバージョン0.92は次のWebサイトから入手できます。nant.sourceforge.netおよび.Net 4.0をサポート
ブレットリグビー

0

両方を使用します。NAntは、コピー、IISへの展開など、すべての「スクリプト」に関するものを担当しますでのへの、パッケージの作成、MSBuildはソリューションの構築を担当します。次に、サポートされていない.NET 4.0の問題を新しいバージョンのNAntで回避できます。

NAntはさらにスケーラブルです。デプロイメントスクリプトを本番サーバーに移行する場合は、ビルドファイルをコピーして適切なバージョンの.NETをインストールするだけです。csprojファイルに関するVisual Studioの問題はありません:)


0

YDeliver by Manojは、PSake上に構築されたビルドフレームワークです。豊富なライブラリ機能とワークフローを定義する機能があり、6つ以上のエンタープライズプロジェクトを本番環境に提供するために使用しています。

TeamCityCruiseControl、またはPowerShellを実行できるものと組み合わせて使用​​します。


0

FlubuCoreを使用しています。これは、プロジェクトをビルドし、C#コードを使用してデプロイメントスクリプトを実行するためのオープンソースのC#ライブラリです。

flubuの使い方の簡単な例:

protected override void ConfigureTargets(ITaskContext session)
{           

    var compile = session.CreateTarget("compile")
        .SetDescription("Compiles the solution.")
        .AddTask(x => x.CompileSolutionTask())
        .DependsOn("generate.commonassinfo");
}

flubuの詳細と開始方法については、こちらをご覧ください: choice-for-build-tool-msbuild-nant-or-something-else

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.