msbuildを使用してソリューションのプロジェクトファイルを指定する


116

devenv.comで行うようにmsbuildを使用してソリューションの特定のプロジェクトを構築するためのコマンドラインが必要です。devenv.comでは、次のコマンドラインを使用してソリューションのプロジェクトを指定できます

devenv.com /Build Release|x86 test.sln /project "testproject"

上記のコマンドラインを使用すると、devenv.comを使用してtest.slnでtestprojectをビルドできます。同じソリューションのmsbuildのコマンドラインは何ですか。

ありがとう


msbuildにtestproject自体を渡していない理由は何ですか?
Mark Smith、

2
コメントを編集できなくなったため。つまり、ソリューションではなくプロジェクトを直接参照しています。"msbuild testproject / p:Configuration = Release / p:Platform = x86"
Mark Smith

別の時間に別のプロジェクトをビルドする必要があります。devenv.comを使用すると、そのソリューションのプロジェクトを指定するのが簡単です
tjdoubts

それが唯一の問題である場合は、msbuildを使用して必要なプロジェクトを正しいタイミングでビルドできるはずです。ソリューションでさまざまなタイミングで実行するさまざまなコマンドが既にあるので、さまざまなmsbuildコマンドを使用して適切なタイミングでプロジェクトを参照しないでください。プロジェクトが正しく設定されている場合、slnファイルを使用せずに、すべての参照を把握する必要があります。
Mark Smith、

回答:


202
msbuild test.sln /t:project /p:Configuration="Release" /p:Platform="x86" /p:BuildProjectReferences=false

割り当てられるの/tはソリューションのプロジェクト名であり、プロジェクトファイル名と異なる場合があることに注意してください。

また、などに記載されているからMSBuild.exeを使用して、ソリューションのビルド特定の目標:どのように

プロジェクト名は任意の文字が含まれている場合は%$@;.()、または'、それらを置き換える_指定されたターゲット名インチ

複数のプロジェクトを一度にビルドすることもできます。

msbuild test.sln /t:project;project2 /p:Configuration="Release" /p:Platform="x86" /p:BuildProjectReferences=false

再構築またはきれいにするには、変更/t:projectします/t:project:cleanか、/t:project:rebuild


98
重要な注意点:プロジェクトに「。」がある場合 / tで指定する場合は、名前を「_」に置き換える必要があります
Watusimoto

4
複数のプロジェクトを構築するための、synthaxを繰り返す私のMSBuildのためだった@easton /tビルドにプロジェクトごとにパラメータを:msbuild test.sln /t:project /t:project2
フィリップ

46
また、ソリューションフォルダーを使用している場合は、プロジェクト名の前にフォルダー名とスラッシュを付ける必要があります。上記の@Watusimotoのように、名前にピリオド(。)がある場合は、アンダースコア(_)に置き換える必要があります。私はこのようなもので終わった:/t:SlnFolder\My_Project_name
Travis Parks

28
@TravisParksは:また、「ソリューションフォルダが」ないことを言及する価値があるかもしれないではないソリューションエクスプローラ]ビューでファイルシステムフォルダではなく、フォルダを参照してください。
joshbodily 2016年

4
また、フォルダー名の「(」と「)」を「_」に置き換える必要がありました(GYPで生成されたプロジェクト)。すべての特殊文字がアンダースコアに置き換えられたと思います。
Maxime Viargues

15

MSBuildは実際にはソリューションではなくプロジェクトを使用して機能します。このソリューションは、内部でMSBuildの一時プロジェクトファイルに解析するためにのみ使用されます。次のコマンドを実行することで、MSBuildを介して直接目的のプロジェクトをビルドできるはずです。

"msbuild testproject /p:Configuration=Release /p:Platform=x86"

ソリューションの代わりにプロジェクトを直接使用すると発生する可能性のある大きな問題が1つあります。ソリューションを使用してプロジェクト間の依存関係を表現する場合、プロジェクトへの参照を追加してビルドシステムに依存関係を自動的に解決させるのではありません。 。

slnファイルを使用してビルド順序を適用する場合は、それらの依存関係を直接projファイルに組み込んでslnから削除することをお勧めします。これにより、MSBuildから任意のprojファイルを直接呼び出すことができ、プロジェクトは追加作業なしですべて独立してビルドされます。ビルド入力としてではなく、Visual Studioでの作業を容易にするために、実際にはslnファイルをプロジェクトのグループとして扱う必要があります。


4
ビルド順序をprojファイルから適用する方法を指摘してください。ありがとう。
ProgramCpp 2015年

4
ここに、プロジェクト名を直接使用することに関する別の問題があります。たとえば、ソリューションに5つのプロジェクトがあるとします。一部のプロジェクトにはDebugPro構成があり、他のプロジェクトにはありません。ソリューション構成DebugProを選択した場合、すべてのプロジェクトにすべてが含まれる構成でプロジェクトをビルドすると、ソリューションファイルのみが各プロジェクトに使用するプロジェクト構成を認識します。
アレックス

@ProgramCppあるプロジェクトから別のプロジェクトに参照を追加すると、参照先のプロジェクトを最初にビルドする必要があることが自動的にわかります。
jpaugh 2017年

このアプローチのもう1つの欠点は、プロジェクト内の相対パスがソリューションファイルに対して相対的に解決されることです。プロジェクトを直接ビルドすると、相対パスが変更されます。出力が別の場所にあり、ユニットテストが間違ったディレクトリを検索する可能性があります。
Tomas Kubes

プロジェクト構成で$(SolutionDir)などのソリューション変数を使用した場合にも問題が発生する可能性があります
Alex Che

8

将来の求職者への情報としての投稿

以下をビルドスクリプトに追加して、1回実行します。これにより、msbuildが実際に使用する正確なターゲットとその他の情報が生成されます。

例:.プロジェクト名またはフォルダにある場合、msbuildはの_代わりに期待します.

set MSBuildEmitSolution=1

情報を取得した後、必要な詳細情報でビルドスクリプトを更新します。


6
`「。」がある場合 「」の代わりに「_」を期待しますプロジェクト名またはフォルダMSBuildの中に`。
dhcgn

2

これを行うには、プロジェクトのターゲット名が何であるかを知る必要があります。必ずしもプロジェクト名ではありません。

これを見つける1つの方法はMSBuildEmitSolution、の値に呼び出される特別な環境変数を設定した後、目的のパラメーターを使用してSLNに対してMSBuildを使用することです1

set MSBuildEmitSolution=1
msbuild my_stuff.sln /t:rebuild /p:Configuration=Release /p:Platform=x64

ネストされたディレクトリ内のターゲットの非常に具体的な名前のため、最近これを行う必要がありました。だから私の生成されたファイルから、my_stuff.sln.metaproj私はこの行を見つけました:

<Target Name="Utils\Firewall\FirewallUtils:Rebuild">

つまり、使用するコマンドラインは、

msbuild my_stuff.sln /t:Utils\Firewall\FirewallUtils:Rebuild /p:Configuration=Release /p:Platform=x64

2
これは私が必要としたものでした。これを実行したくない場合のヒント:ターゲットは、プロジェクトファイルへの現在のパスからプロジェクトファイルの拡張子を除いたフォルダー構造(.csproj私の場合)です。私<3 SO!
返金なし返品なし

1

追加情報を追加するために、プロジェクトフォルダーでmsbuildを実行すると、デフォルトでプロジェクトファイルが1つしかないため、デフォルトでプロジェクトファイルがビルドされます。

>msbuild

この方法でmsbuildを使用する方法には、さまざまなバリエーションがあります。projファイルを直接指定できます。

>msbuild helloworld.csproj -t:Build.

msbuildのドキュメントで、使用方法、projファイルの要件、およびソリューションではなくプロジェクトをビルドする利点について確認します。

MS MSBuildドキュメント

上記のマークスミスが述べたように、この方法を構築することには利点があります。

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