如何只为调试版本运行Visual Studio生成后事件


592

如何将构建后事件限制为仅针对一种构建类型运行?

我正在使用事件将DLL文件复制到本地IIS虚拟目录,但是我不希望在发布模式下的生成服务器上发生这种情况。

Answers:


746

构建前和构建后事件作为批处理脚本运行。您可以在上执行条件语句$(ConfigurationName)

例如

if $(ConfigurationName) == Debug xcopy something somewhere

7
奇怪,也许只是我,但是我尝试添加if条件,现在我收到此错误-代码为255的错误退出
Michael L

101
我发现整个命令需要在一行上,否则您将获得“以代码255退出”
Robin Minto 2009年

7
您还可以使用gotos /标签来获得更完整的解决方案(请参阅我的Jul 24答案)
CestLaGalere

11
并且可以在if命令中使用方括号(请参见我的示例示例)
gbjbaanb 2010年

1
您应该使用“ xcopy / Y”,以便该文件将在目标目录中被覆盖。
马赛厄斯

521

仅供参考,您不需要使用goto。shell 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 2011年

37
"$(ConfigurationName)"如果收到错误代码255,请使用(请注意引号)
jgauffin 2012年

20
请注意,如果在$(ConfigurationName)周围使用“”,则也需要在“ Debug”一词附近加上引号-shell命令IF语句非常..文字...在进行字符串比较时。
gbjbaanb

5
注意,要摆脱255,我必须在$(ConfigurationName)周围使用“”并删除条件周围的空格,例如,如果“ $(ConfigurationName)” ==“ Release” <-周围没有空格==
fhilton 2015年

15
在我的Visual Studio 2017中$(ConfigurationName)为空(生成后事件命令行)。if "$(Configuration)" == "Debug"为我工作。顺便说一句,如果您想在所有其他配置中进行操作,请使用if NOT "$(Configuration)" == "Debug"
拉尔夫·洪德瓦特

125

像平常一样添加您的发布活动。然后保存您的项目,在记事本(或您喜欢的编辑器)中将其打开,然后将条件添加到PostBuildEvent属性组中。这是一个例子:

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

5
这是可行的,但它会迫使您对项目文件源中的事件进行所有设计工作。IDE中也隐藏了其他条件构建事件声明。
约瑟夫·戴格尔,

3
我不得不说这对我来说是更好的答案,首选的方法只是行不通。
Michael L

8
您无需在记事本中打开它,可以保留在Visual Studio中。您可以右键单击项目文件,单击“卸载项目”,然后再次右键单击并单击“编辑”。现在,您可以使用语法着色来编辑{{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。逆向工程无法将更简单的指令组合到您希望看到的“更好”的更复杂的指令中。我看不到Microsoft如何强制我们使用goto,或者这与本文无关。
TamusJRoyce 2011年

1
@StingyJack:如果您看一下已编译的代码,就会发现所有代码都变成了JMP指令:)只要我能编写可读性强的代码,我都不关心编译器在做什么。(不是说使用goto有时不是很容易阅读)
gbjbaanb 2012年

如果我将构建后命令放入批处理中,则在按构建时会收到以下错误消息:Error 1 The command "C:\MyProject\postbuild.bat" exited with code 99. MyProject
Sebastian

4
如果需要,可以删除if并使用goto :$(ConfigurationName)
Calimero100582

15

Visual Studio 2015:正确的语法是(将其保留在一行上):

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

这里没有错误255。


3
保持在同一行
埃里克·博乐Feysot

工作不错。Tks
ViniciusGonçalves17年

1
您的条件技术最适合我。但是,此方法在完全没有条件的情况下效果甚至更好,并且更加简洁。复制“ $(ProjectDir)\ .. \ $(ConfigurationName)\ MyFileName”“ $(TargetDir)”
shawn1874年

1
您的脚本是正确的,但是我的脚本允许为不同的配置复制不同的文件。
Eric Bole-Feysot

8

从Visual Studio 2019开始,现代.csproj格式支持直接在Target元素上添加条件:

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

用户界面没有提供设置方法,但是,Configuration如果您通过用户界面进行更改,它确实可以安全地保留该属性。


这在VS 2019中对我有用,谢谢!
BrandoTheBrave

这确实应该更高,而且他们确实应该更新UI,以允许您标记构建配置或至少从csproj属性添加Condition。
6

4

您可以将配置名称传递到生成后脚本中,然后在其中检查它是否应该运行。

用传递配置名称$(ConfigurationName)

根据您如何实施构建后步骤进行检查-这将是一个命令行参数。


-1

这在Visual Studio 2015中对我有用。

我从与我的解决方案文件夹相同级别的库文件夹中的文件夹中复制所有DLL文件到正在构建的项目的targetdirectory中。

使用我的项目目录中的相对路径并使用.. \ .. \ lib建立两个步骤

MySolutionFolder
.... MyProject

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

-2

像任何项目设置一样,可以按配置配置buildevents。只需在“属性页面”对话框的下拉列表中选择要更改的配置,然后编辑构建后的步骤。


10
在IDE中创建时,构建事件并不特定于任何配置。
Joseph Daigle

1
在VS2015中也不起作用。不能按配置进行配置。
willem

2
这仅适用于Visual Studio中的C ++项目,不适用于C#
bytecode77

-3

在Visual Studio 2012中,您必须使用(我也认为在Visual Studio 2010中)

if $(Configuration) == Debug xcopy

$(ConfigurationName) 被列为宏,但未分配。

在此处输入图片说明

比较:生成命令和属性的宏


7
您要使用ConfigurationName。该图像非常难以理解。
隐身犹太教
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.