繁体   English   中英

Visual Studio:多个构建后命令?

[英]Visual Studio: Multiple post-build commands?

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

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

这是正确的,还是有更简单的方法从构建后事件中调用两个命令?

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

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

构建后事件命令行

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

例如:

call MyBatch1.bat
call MyBatch2.bat

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

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

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

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

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

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

添加到womp答案

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

%(Command)
echo foo

其中%(Command)扩展为%(Command)的前一个值。

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

在 Visual Studio 2017 中,您可以执行以下操作:

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

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 事件。

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

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

将遗留 .NET 项目迁移到 Visual Studio 2022。发现我无法为 Pre-Build 或 Post-Build 运行多个命令。 即使语法正确,在调试/发布之间切换时行为也不一致。 我预计这里可能存在错误。

Debug配置中,无论我尝试什么,使用XCOPY /Y /F都会出错。 错误代码24Release工作时最常见。 我很难判断什么是语法错误,什么只是错误。 XCOPY /Y /F在 CMD/PowerShell 中工作得很好。

只有在“冒泡”命令(... )

即从这个开始

copy $(TargetDir)x64\SQLite.Interop.dll $(TargetDir)SQLite.Interop_x64.dll
copy $(TargetDir)x86\SQLite.Interop.dll $(TargetDir)SQLite.Interop_x86.dll
if $(ConfigurationName) == Release (
    call "C:\Program Files (x86)\Microsoft SDKs\ClickOnce\SignTool\signtool.exe" sign /t http://timestamp.sectigo.com /fd sha256 $(TargetPath)
)
(copy $(TargetDir)x64\SQLite.Interop.dll $(TargetDir)SQLite.Interop_x64.dll)
(copy $(TargetDir)x86\SQLite.Interop.dll $(TargetDir)SQLite.Interop_x86.dll)
(if $(ConfigurationName) == Release (
    call "C:\Program Files (x86)\Microsoft SDKs\ClickOnce\SignTool\signtool.exe" sign /t http://timestamp.sectigo.com /fd sha256 $(TargetPath)
))

额外的花絮,因为( )是特殊字符,如果你需要转义它们,请使用插入符,即^)

Stackoverflow:具有多个 if/copy 组合的构建后事件仅在第一个文件不存在时执行

只是给像我这样的白痴一个注意-有这个“下拉”按钮,因此您可以将命令编辑为多行文本在此处输入图片说明

在 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

您可以在 Visual Studio 2022 中运行多个命令/批处理文件。

只管不加

exit %errorlevel% 

到您的批处理文件,因为这将导致 cmd 退出,并且 visual studio 将不会执行进一步的后期构建事件。

如果您想返回退出代码,请使用

exit /b 

https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/exit

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

call Script1.cmd
call Script2.bat

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM