Visual Studio:多个构建后命令?

Posted

技术标签:

【中文标题】Visual Studio:多个构建后命令?【英文标题】:Visual Studio: Multiple post-build commands? 【发布时间】:2010-12-31 20:12:21 【问题描述】:

Visual Studio 2008 允许我声明一个命令并将其附加到项目的构建后事件。和很多开发者一样,我经常使用它来 xcopy 文件到应用程序的输出目录。

我正在做一个项目,我需要将文件从两个不同的地方复制到两个不同的目的地,所有这些都在一个项目中。换句话说,我需要从同一个构建后事件中调用两个不同的 xcopy 命令。看起来构建后事件只需要一个命令,如果我需要调用多个命令,我必须将命令放在 *.bat 文件中并从构建后事件中调用它。

这是正确的,还是有更简单的方法从构建后事件调用两个命令?提前感谢您的帮助。

【问题讨论】:

【参考方案1】:

在 Visual Studio 2022 中,用于指定构建前和构建后事件的 UI 略有变化,但您仍然可以通过将每个命令放在单独的行上来指定要运行的多个命令:

上面在你的项目文件中设置了以下内容:

  <Target Name="PostBuild" AfterTargets="PostBuildEvent">
    <Exec Command="echo Post 1&#xD;&#xA;echo Post 2" />
  </Target>

  <Target Name="PreBuild" BeforeTargets="PreBuildEvent">
    <Exec Command="echo Pre 1&#xD;&#xA;echo Pre 2" />
  </Target>

建造时会产生类似的东西:

1>------ Build started: Project: MyProject, Configuration: Debug Any CPU ------
1>You are using a preview version of .NET. See: https://aka.ms/dotnet-core-preview
1>Pre 1
1>Pre 2
1>MyProject -> D:\repos\MyProject\bin\Debug\net6.0\MyProject.dll
1>Post 1
1>Post 2

【讨论】:

【参考方案2】:

只是给像我这样的白痴的注释 - 有这个“下拉”按钮,因此您可以将命令编辑为多行文本

【讨论】:

【参考方案3】:

The approach suggested by womp 适用于 Visual Studio 2015/2017 (Windows),但不适用于 Visual Studio for Mac(预览版),它似乎只执行第一个命令。 我发现在 Mac 和 Windows 版本的 Visual Studio 中工作的唯一方法是链接 2 个 MSBuild 命令:

<Target Name="AfterResolveReferences">
<Exec Command="path\MyFirstCommand.exe -parameters" />
</Target>
<Target Name="MySecondCommand" AfterTargets="AfterResolveReferences" >
<Exec Command="path\MySecondCommand.exe -parameters" />
</Target>

上面的示例使用“AfterResolveReferences”事件,但显然也适用于 PostBuild 事件。

【讨论】:

【参考方案4】:

在 Visual Studio 2017 中,您可以这样做:

<PostBuildEvent>
    <Command>
        copy $(TargetPath) $(SolutionDIr)\bin1
        copy $(TargetPath) $(SolutionDIr)\bin2
    </Command>
</PostBuildEvent>

【讨论】:

我编辑了 .csproj 并在我的两个构建后事件命令周围添加了 。那似乎没有用。当我在 Visual Studio 中查看构建事件时,它在两个命令周围有 ,但给出了构建错误:命令“command1 command2”以代码 255 退出。【参考方案5】:

用 & 或 && 或 ; 分隔命令在 VS2017 中不起作用。不敢相信这么简单的功能在 VS2017 中不可用。 Visual Studio 尝试将构建后事件窗口中的整个文本作为一个字符串执行。我现在唯一的选择是创建一个我不太喜欢的批处理脚本。

【讨论】:

用 && 分隔命令在 VS2017 中对我有用。在 VS2017 编辑器中在单独的行上指定每个命令对我不起作用。【参考方案6】:

这个问题没有很好的解决方案。调用想法确实会导致其他脚本运行。我注意到错误检测不起作用。 将 'exit /b 1' 放入 FailMe.cmd 在后期构建步骤中使用“call FailMe.cmd”。 注意构建没有失败?我正在使用 VS 2017 构建一个 C# 项目。 现在尝试使用“FailMe.cmd”构建现在报告错误。

因此,如果错误报告很重要,您最好只使用一个脚本。

【讨论】:

【参考方案7】:

添加到womp 的answer:

如果您有多个属性表需要在同一个构建事件中执行,您可以执行以下操作来链接命令:

%(Command)
echo foo

%(Command) 扩展为命令的前一个值。

我个人对所有构建事件都这样做,即使我目前没有继承的命令,因为这样可以确保以后添加属性表时不会出现问题。

【讨论】:

这也适用于自定义构建步骤。此外,沿链的任何位置执行exit 批处理语句会导致链中止。事实上,exit 1 导致构建失败,而 exit 0 只是中止该步骤并继续构建。【参考方案8】:

您可以输入任意数量的后期构建命令。只需用换行符将它们分开即可。

这是我的一个项目中的一个示例。

【讨论】:

尽管我的命令在不同的行上,但我的命令就像它们在一行上一样一起运行。 不幸的是,如果中间命令之一失败,似乎至少 VS2015 不会报告错误......它报告最后一个命令的结果作为构建后步骤的结果。跨度> 这似乎可以在 Visual Studio 内部工作 - 但如果您在 TFS 构建机器上使用 MsBuild,则不支持。 MsBuild 去除换行符,然后由于语法错误而使命令失败。 我试过这两个:iisresetxcopy $(TargetDir)ApplicationMig.dll "C:\Program Files\myapi\ApplicationMig.dll" /y这会导致错误。 Exited with code 4。是否只有多个 copy 和 xcopy 命令以这种方式工作?如果我将 IISreset 命令单独放在预构建事件中,那么它可以工作。 对于 VS2019,您可以在每行的末尾添加一个 & 以便查看 ***.com/questions/8055371/…【参考方案9】:

只需在批处理脚本前加上“call”前缀。这样批处理脚本下面的语句也会在从批处理脚本返回调用后执行。

call Script1.cmd
call Script2.bat

【讨论】:

【参考方案10】:

还有另一种选择:您可以用&amp;&amp; 分隔命令。 例如。

copy $(TargetPath) d:\folder1 &amp;&amp; copy $(TargetPath) d:\folder2

这与用换行符分隔并不完全相同:使用&amp;&amp;,如果上一个命令失败,则下一个命令将不会运行。

用换行符分隔更容易阅读,所以你应该更喜欢它。但是我至少知道&amp;&amp; 有用的一种情况。当您使用属性表在不同的机器上进行不同的构建后步骤时,就是这种情况。 VS 2008 不允许直接在属性表中设置 PostBuildStep,但您可以使用命令添加用户宏并从主项目设置中调用它。宏是单行的,因此您可以使用&amp;&amp; 在那里有多个命令。

【讨论】:

【参考方案11】:

重要提示:在执行批处理文件时,您必须使用“call”语句来按顺序执行以下行。如果您不使用“调用”,则执行将进入 .bat 并且不会返回到以下行。与 DOS 提示符相同。

例如:

call MyBatch1.bat
call MyBatch2.bat

【讨论】:

本技巧适用于 grunt 和 npm 命令,因为它们都通过批处理文件(grunt.cmd 和 npm.cmd)运行。【参考方案12】:

每个命令都应该在单独的行上。但我发现,如果执行其中一个命令时出错,整个后期构建将失败,因此您需要一次尝试每个构建后命令进行调试。

【讨论】:

"xcopy /f" 将显示完整的源和目标文件名,将在失败前打印出来,使多个 xcopy 命令比多个复制命令更容易诊断。

以上是关于Visual Studio:多个构建后命令?的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studio 2012 命令行构建 - 检测构建失败

SSIS 项目在 Visual Studio 中构建,但不是来自 Devenv 命令行

MSBuild:从 Visual Studio 中构建解决方案后运行目标

在 Visual Studio 2013 中完成整个编译后是不是可以运行构建后事件?

构建时命令副本以代码 4 退出 - Visual Studio 重新启动解决了它

Visual Studio 命令窗口 - 更多命令的一个别名 [关闭]