如何仅为调试版本运行Visual Studio后期构建事件

JC.*_*JC. 570 build-process visual-studio

如何将后期构建事件限制为仅针对一种类型的构建运行?我正在使用事件将DLL复制到本地IIS虚拟目录,但我不希望在发布模式下在构建服务器上发生这种情况.

Jos*_*gle 720

构建前和构建后事件作为批处理脚本运行.你可以做一个条件语句$(ConfigurationName).

例如

if $(ConfigurationName) == Debug xcopy something somewhere
Run Code Online (Sandbox Code Playgroud)

  • 我发现整个命令需要在一行上,否则你将"退出代码255" (92认同)
  • 你可以在if命令中使用括号(参见我的答案中的一个例子) (11认同)
  • 奇怪,也许只是我,但我尝试添加if条件,现在我得到这个错误 - 错误退出代码255 (7认同)
  • 您还可以使用gotos/labels来获得更全面的解决方案(请参阅我的7月24日答案) (6认同)
  • 您应该使用“xcopy /Y”,以便在目标目录中覆盖该文件。 (2认同)

gbj*_*anb 507

仅供参考,您不需要使用转到.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".
)
Run Code Online (Sandbox Code Playgroud)

  • 我还要补充一点,要小心需要紧跟if语句的左括号,好像它在下一行会生成一个错误代码 (61认同)
  • 如果收到错误代码255,请使用"$(ConfigurationName)"`(注意引号) (35认同)
  • 请注意,如果你在$(ConfigurationName)周围使用"",你还需要在Debug这个词周围引用 - shell命令IF语句非常......文字...当涉及字符串比较时. (19认同)
  • 在我的情况下使用Visual Studio 2017` $(ConfigurationName)`是空的(构建后事件命令行).`if"$(Configuration)"=="Debug"`为我工作.顺便说一句,如果你想在所有其他配置中做某事,请使用`if NOT'$(Configuration)"=="Debug"`. (14认同)
  • 注意,为了摆脱255,我不得不在$(ConfigurationName)周围使用""并删除条件周围的空格,例如,如果"$(ConfigurationName)"=="Release"< - 周围没有空格== (5认同)

Fra*_*nov 123

像平常一样添加你的帖子构建事件.然后保存项目,在记事本(或您喜欢的编辑器)中打开它,并将条件添加到PostBuildEvent属性组.这是一个例子:

<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
    <PostBuildEvent>start gpedit</PostBuildEvent>
</PropertyGroup>
Run Code Online (Sandbox Code Playgroud)

  • 您不需要在记事本中打开它,您可以留在Visual Studio中.您可以右键单击项目文件,单击"卸载项目",然后再次右键单击并单击"编辑".您现在可以使用语法着色编辑{{csproj}}文件.再次右键单击,但现在单击"重新加载项目"以重新加载. (7认同)
  • 这有效,但它会强制您对项目文件源中的事件进行所有设计工作.其他条件构建事件声明也从IDE隐藏. (5认同)
  • 在 VS 2017 中,您还可以使用 `&lt;Target Name="PostBuild" AfterTargets="PostBuildEvent" Condition="$(ConfigurationName) == Debug"&gt; &lt;Exec Command="your command"/&gt;&lt;/Target&gt;` 来执行此操作。宏变量和一切正常。 (4认同)
  • 我不得不说这对我来说是更好的答案,首选方法不起作用. (3认同)
  • 当我尝试这种方法时,它没有在 PostBuildEvent 命令本身中扩展宏。`cd "$(ProjectDir)"` 扩展为 `cd ""`。 (2认同)

Ces*_*ere 105

或者(因为事件被放入批处理文件然后被调用),请使用以下内容.(在Build事件框中,不在批处理文件中):

if $(ConfigurationName) == Debug goto :debug

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

goto :exit

:debug
' debug items in here

:exit
Run Code Online (Sandbox Code Playgroud)

通过这种方式,您可以为任何配置创建事件,并且仍然可以使用宏来管理它,而不必将它们传递到批处理文件中并记住%1是$(OutputPath)等:

  • 感谢microsoft,迫使我们在我们的C#应用​​程序中使用goto. (49认同)
  • 大多数编译器都会将代码转换为更简单的指令,例如goto.逆向工程不能将更简单的指令放在您希望看到的"更好"更复杂的指令中.我不知道微软如何强制我们使用goto,或者这与这篇文章有什么关系. (9认同)
  • 如果你有机会在反射器中查看一些代码,编译器会将很多switch/case语句转换为goto. (6认同)
  • 如果你愿意,你可以删除`if`并使用`goto:$(ConfigurationName)` (4认同)

Dan*_*ker 23

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

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

UI 没有提供设置方法,但Configuration如果您通过 UI 进行更改,它似乎可以安全地保留该属性。

  • 这确实值得更高,而且他们确实应该更新 UI 以允许您标记构建配置或至少从 csproj 属性添加条件。 (4认同)

Eri*_*sot 13

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)
Run Code Online (Sandbox Code Playgroud)

这里没有错误255.

  • 把它放在一条线上 (2认同)

Lou*_*nco 5

您可以将配置名称传递给构建后脚本并在那里检查它是否应该运行。

使用$(ConfigurationName).

检查它是基于您如何实现构建后步骤——它将是一个命令行参数。