642

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

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

4

11 回答 11

810

构建前和构建后事件作为批处理脚本运行。您可以对$(ConfigurationName).

例如

if $(ConfigurationName) == Debug xcopy something somewhere
于 2008-09-29T18:48:19.120 回答
551

仅供参考,您不需要使用 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".
)
于 2010-08-23T13:06:16.457 回答
136

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

<PropertyGroup Condition=" '$(Configuration)' == 'Debug' ">
    <PostBuildEvent>start gpedit</PostBuildEvent>
</PropertyGroup>
于 2008-09-29T18:47:13.520 回答
109

或者(因为将事件放入批处理文件然后调用),使用以下内容(在构建事件框中,而不是在批处理文件中):

if $(ConfigurationName) == Debug goto :debug

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

goto :exit

:debug
' Debug items in here

:exit

这样,您可以为任何配置设置事件,并且仍然使用宏对其进行管理,而不必将它们传递到批处理文件中,记住%1is$(OutputPath)等。

于 2009-07-24T09:56:39.767 回答
31

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

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

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

于 2020-01-08T16:59:00.620 回答
17

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。

于 2016-02-22T13:21:27.410 回答
5

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

使用 传递配置名称$(ConfigurationName)

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

于 2008-09-29T18:44:05.010 回答
0

我发现我可以像这样在项目文件中放置多个条件:

  <Target Name="PostBuild" AfterTargets="PostBuildEvent" Condition=" '$(Configuration)' != 'Debug' AND '$(Configuration)' != 'Release' ">
      <Exec Command="powershell.exe -ExecutionPolicy Unrestricted -NoProfile -NonInteractive -File $(ProjectDir)postBuild.ps1 -ProjectPath $(ProjectPath) -Build $(Configuration)" />
  </Target>
于 2022-02-04T14:37:22.467 回答
-1

这适用于我在 Visual Studio 2015 中。

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

使用我的项目目录中的相对路径并使用..\..\lib 将文件夹结构向上两步

MySolutionFolder
....MyProject

if $(ConfigurationName) == Debug (
xcopy /Y "$(ProjectDir)..\..\lib\*.dll" "$(TargetDir)"
) ELSE (echo "Not Debug mode, no file copy from lib")
于 2017-06-29T14:59:13.620 回答
-3

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

于 2008-09-29T18:48:43.767 回答
-3

在 Visual Studio 2012 中你必须使用(我认为在 Visual Studio 2010 中也是如此)

if $(Configuration) == Debug xcopy

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

在此处输入图像描述

比较:构建命令和属性的宏

于 2012-12-14T07:46:20.463 回答