如何在编译之前但仅在编译发生时运行 MSBuild Target

Ing*_*ein 8 msbuild msbuild-task visual-studio incremental-build

我有一个 C# 库项目,它具有一些使用 PowerShell 在“BeforeBuild”中创建的依赖项。

MSBuild 似乎每次都会执行目标“BeforeBuild”,即使库项目本身不需要构建也是如此。

我想将构建过程配置为仅在库需要(重新)构建时运行 PowerShell 脚本。

有没有办法做到这一点?

我尝试使用目标“BeforeBuild”和“BeforeCompile”。但似乎每次都会执行。

Lan*_*SFT 0

MSBuild 似乎每次都执行目标“BeforeBuild”,也好像库项目本身不需要构建。

如果库项目本身不需要构建,那么 msbuild 每次都执行目标是什么意思?据我所知,BeforeBuild是构建过程中必需的一个目标,因此如果你构建一个项目,它总是会调用该目标。如果库项目不需要构建,那么调用 msbuild 来构建它的原因是什么?更多细节可能会更好:)

我想将构建过程配置为仅在库需要(重新)构建时运行 PowerShell 脚本。

有没有办法做到这一点?

我尝试使用目标“BeforeBuild”和“BeforeCompile”。但似乎每次都会执行。

BeforeBuildBeforeCompilemsbuild 系统中预定义的目标。您可以覆盖它们以自定义构建步骤,但您无法避免在构建过程中运行它们。因此,每次构建开始时,它们都会执行,这是设计的预期行为。

根据您的描述,您可以覆盖这些目标并在其中运行power shell脚本。这就是为什么在你的机器上它总是调用 ps 脚本。

如果您通过 msbuild.exe 而不是 VS IDE 构建项目,这里有一个解决方法:

假设您已覆盖BeforeTarget项目文件。您可以添加条件来确定是否运行自定义 BeforeTarget(调用 ps 脚本)或原始 BeforeTarget.

定义一个名为 的属性RunPS,并向您使用的 BeforeTarget 添加一个条件,如下所示:

  <PropertyGroup>
    <RunPS>false</RunPS>
  </PropertyGroup>

  <Target Name="BeforeBuild" Condition="$(RunPS)=='true'">
   <!--Run the ps script here-->  
  </Target>
Run Code Online (Sandbox Code Playgroud)

然后您可以通过设置 的值来控制是使用默认的 BeforeTarget 还是自定义的RunPS

msbuild xx.csproj /p:RunPS=true在构建过程中运行 ps 脚本,msbuild xx.csproj运行原始脚本BeforeTarget

如果您在 VS IDE 中构建项目,则可以创建从 Debug 或 Release 复制的新配置(CustomDebug),并设置Condition="$(Configuration)=='CustomDebug'"为目标。

更新:

对于在 VS 和命令行中有效的解决方法:

请参阅此文档,在 VS 中我们可以通过复制调试和发布配置中的设置来轻松创建新配置。

1.我认为,对于你的库项目,你有正常的Debug和Release配置,你可以按照文档中的提示创建相应的自定义配置。从 Debug 复制设置并创建名为 PSDebug 的新配置,从 Release 复制设置并创建名为 PSRelease 的新配置。

2.然后编辑xx.csproj,添加以下格式的条件:

  <Target Name="BeforeBuild" Condition="'$(Configuration)'=='PSDebug' OR '$(Configuration)'=='PSRelease'">
    <!--Run the ps script here-->
    <Message Text="showsth" Importance="high" />
  </Target>
Run Code Online (Sandbox Code Playgroud)

然后在 VS IDE 中,如果您使用普通 Configuration 构建Debug or Release,它将使用默认BeforeBuild目标。并且只有当你使用 custom 构建时PSDebug or PSRelease,它才会调用你的自定义BeforeBuild目标。在 VS 中,你可以通过这个框轻松地在这些配置之间切换:

在此输入图像描述

对于命令行来说,它也有效。如果您使用类似命令msbuild xx.csproj /p:Configuration=Debug,它将使用预定义的 BeforeBuild 目标来执行此操作,如果您使用类似命令msbuild xx.csproj /p:Configuration=PSDebug,它将调用您的自定义目标并运行 PS 脚本。