デバッグビルドのみのVisual Studioビルド後イベントを実行する方法


592

ビルド後のイベントを1種類のビルドでのみ実行するように制限するにはどうすればよいですか?

イベントを使用してDLLファイルをローカルIIS仮想ディレクトリにコピーしていますが、リリースモードのビルドサーバーでこれを実行したくありません。

回答:


746

ビルド前およびビルド後のイベントは、バッチスクリプトとして実行されます。で条件付きステートメントを実行できます$(ConfigurationName)

例えば

if $(ConfigurationName) == Debug xcopy something somewhere

7
奇妙なことかもしれませんが、おそらく私だけですが、if条件を追加しようとしたところ、このエラーが発生しました-エラーはコード255で終了しました
Michael L

101
コマンド全体を1行に収める必要があることがわかります。そうしないと、「コード255で終了します」
Robin Minto

7
より完全なソリューションには、gotos / labelsを使用することもできます(私の7月24日の回答を参照)
CestLaGalere

11
かっこをifコマンドで使用できます(例については私の回答を参照してください)
gbjbaanb

1
「xcopy / Y」を使用して、ターゲットディレクトリでファイルが上書きされるようにする必要があります。
Matthias

521

参考までに、gotoを使用する必要はありません。シェルIFコマンドは、角かっこで使用できます。

if $(ConfigurationName) == Debug (
  copy "$(TargetDir)myapp.dll" "c:\delivery\bin" /y
  copy "$(TargetDir)myapp.dll.config" "c:\delivery\bin" /y
) ELSE (
  echo "why, Microsoft, why".
)

62
私はまた、エラーコードが生成される次の行にだかのように、すぐにif文を追跡する必要があるの括弧の注意する、追加すること
wonea

37
使用"$(ConfigurationName)"(予告引用符)を使用すると、エラーコード255取得する場合
jgauffin

20
$(ConfigurationName)の前後に ""を使用する場合は、Debug tooという単語も引用符で囲む必要があります。シェルコマンドのIFステートメントは、文字列の比較に関しては非常にリテラル...です。
gbjbaanb 2013年

5
「例えば約$(ConfigurationName)AND条件の周りの削除スペース、もし」255を取り除くために注意、私が使用していた「$(ConfigurationName)」==「リリース」< -周りのノースペース==
fhilton 2015

15
私の場合、Visual Studio 2017 $(ConfigurationName)は空です(ビルド後のイベントコマンドライン)。if "$(Configuration)" == "Debug"私のために働いた。ところで、他のすべての設定で何かしたい場合は、を使用してくださいif NOT "$(Configuration)" == "Debug"
Ralf Hundewadt 2017年

125

通常のように、ビルド後のイベントを追加します。次に、プロジェクトを保存し、メモ帳(またはお気に入りのエディター)で開いて、PostBuildEventプロパティグループに条件を追加します。次に例を示します。

<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
    <PostBuildEvent>start gpedit</PostBuildEvent>
</PropertyGroup>

5
これは機能しますが、プロジェクトファイルソース内のイベントのすべての設計作業を行う必要があります。その他の条件付きビルドイベント宣言はIDEからも非表示になります。
ジョセフデイグル

3
私はこれが私にとってより良い答えであると言わざるを得ません。推奨される方法はうまくいきませんでした。
マイケルL

8
メモ帳で開く必要はありません。VisualStudioをそのまま使用できます。プロジェクトファイルを右クリックして[プロジェクトのアンロード]をクリックし、もう一度右クリックして[編集]をクリックします。これで、{{csproj}}ファイルを構文の色分けで編集できます。もう一度右クリックしますが、「プロジェクトの再読み込み」をクリックして再読み込みします。
アベル

1
この方法では、PostBuildEventコマンド自体のマクロを展開しようとしても拡張されませんでした。 cd "$(ProjectDir)"に拡張されましたcd ""
ダリル

3
VS 2017では、これを使用してこれを行うこともできます<Target Name="PostBuild" AfterTargets="PostBuildEvent" Condition="$(ConfigurationName) == Debug"> <Exec Command="your command"/></Target>。マクロ変数とすべてが通常どおり機能します。
SC

106

または(イベントがバッチファイルに入れられて呼び出されるため)、次を使用します(バッチファイルではなく、[ビルドイベント]ボックスで)。

if $(ConfigurationName) == Debug goto :debug

:release
signtool.exe ....
xcopy ...

goto :exit

:debug
' Debug items in here

:exit

この方法で、あなたはどのような構成のためのイベントがあり、まだかなりバッチファイルにそれらを渡すために持つよりも、マクロでそれを管理する、ことを覚えておくことができ%1ている$(OutputPath)など、


6
リフレクターでコードの一部を見る機会がある場合、コンパイラーは多くのswitch / caseステートメントをgotoに変換します。
StingyJack 2011年

10
ほとんどすべてのコンパイラは、コードをgotoなどのより簡単な命令に変換します。また、リバースエンジニアリングでは、単純な指示を「見栄えのよい」より複雑な指示にまとめることはできません。マイクロソフトがgotoの使用を強制している方法や、これがこの投稿にどのように関連しているかはわかりません。
TamusJRoyce

1
@StingyJack:コンパイルされたコードを見ると、すべてがJMP命令に変換されていることがわかります:)可読性の高いコードを書くことができる限り、コンパイラが内部で何をしているかは気にしません。(gotoを使用することが時々非常に読みにくいというわけではありません)
gbjbaanb

私はバッチ内の私のビルド後のコマンドを入れた場合、私はこのエラーメッセージを取得するときに押しビルド:Error 1 The command "C:\MyProject\postbuild.bat" exited with code 99. MyProject
セバスチャン

4
必要に応じて、を削除しifて使用できますgoto :$(ConfigurationName)
Calimero100582

15

Visual Studio 2015:正しい構文は次のとおりです(1行で記述してください):

if "$(ConfigurationName)"=="My Debug CFG" ( xcopy "$(TargetDir)test1.tmp" "$(TargetDir)test.xml" /y) else ( xcopy "$(TargetDir)test2.tmp" "$(TargetDir)test.xml" /y)

ここにエラー255はありません。


3
1行に保つ
Eric Bole-Feysot

うまくいきました。Tks
ViniciusGonçalves

1
あなたの条件付きテクニックは私にとって最もよく働きました。ただし、これは条件文をまったく使用しなくてもより効果的で、はるかに簡潔です。コピー "$(ProjectDir)\ .. \ $(ConfigurationName)\ MyFileName" "$(TargetDir)"
shawn1874

1
あなたのスクリプトは正しいですが、私のスクリプトでは、さまざまな構成のさまざまなファイルをコピーできます。
Eric Bole-Feysot 2018年

8

Visual Studio 2019以降、最新の.csproj形式では、Target要素に直接条件を追加できます。

<Target Name="PostBuild" AfterTargets="PostBuildEvent" Condition="'$(Configuration)' == 'Debug'">
    <Exec Command="nswag run nswag.json" />
</Target>

UIはこれを設定する方法を提供していませんがConfiguration、UIを介して変更を行った場合、属性をそのままにしておくように見えます。


これはVS 2019で私のために働いた、ありがとう!
BrandoTheBrave

これは本当に高い値に値します。また、ビルド構成をマークするか、少なくともcsprojプロパティから条件を追加できるように、UIを実際に更新する必要があります。
DeadlyChambers

4

構成名をビルド後のスクリプトに渡し、そこでチェックインして、実行する必要があるかどうかを確認できます。

で構成名を渡します$(ConfigurationName)

チェックはビルド後のステップの実装方法に基づいています-コマンドライン引数になります。


-1

これはVisual Studio 2015で私にとっては機能します。

すべてのDLLファイルを、ソリューションフォルダーと同じレベルのライブラリフォルダーにあるフォルダーから、ビルド中のプロジェクトのターゲットディレクトリにコピーします。

プロジェクトディレクトリからの相対パスを使用し、.. \ .. \ lib

MySolutionFolder
.... MyProject
Lib

if $(ConfigurationName) == Debug (
xcopy /Y "$(ProjectDir)..\..\lib\*.dll" "$(TargetDir)"
) ELSE (echo "Not Debug mode, no file copy from lib")

-2

他のプロジェクト設定と同様に、ビルドイベントは構成ごとに構成できます。[プロパティページ]ダイアログのドロップダウンで変更する構成を選択し、ビルド後の手順を編集するだけです。


10
ビルドイベントは、IDEで作成されたときの構成に固有のものではありません。
ジョセフデイグル

1
VS2015でも機能しません。構成ごとに構成することはできません。
willem

2
これはVisual StudioのC ++プロジェクトにのみ適用され、C#には適用されません
bytecode77

-3

Visual Studio 2012では、使用する必要があります(Visual Studio 2010でも使用すると思います)

if $(Configuration) == Debug xcopy

$(ConfigurationName) マクロとしてリストされましたが、割り当てられていません。

ここに画像の説明を入力してください

比較:ビルドコマンドとプロパティのマクロ


7
ConfigurationNameを使用します。この画像は...すべてのぼやけで本当に理解するのは難しいです。
Stealth Rabbi
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.