Visual Studio 添加始终运行的预生成事件(C# 项目)

Visual Studio add pre-build event that always runs (C# project)

在我的项目中,我运行正在使用一个外部工具来更新一些二进制文件。这些文件作为 "content".

包含在项目中

目前,该工具在 C# 项目属性中 "pre-build event" 期间设置为 运行。不幸的是,这个事件只有在项目过期时才会执行,这不是我需要的。

我通过在我的项目中始终使用 "rebuild" 而不是 "build" 来解决这个问题,但这既乏味又缓慢。

我需要始终执行此工具,无论项目是否是最新的。其实,在MSBuild判断项目是否最新之前,因为该工具修改了项目中包含的一些文件,所以影响了最新的检查结果。

有什么正确的方法吗?

在项目级别,您有以下三种选择:

1) 构建前操作

<PropertyGroup>
  <PreBuildEvent>notepad.exe Foo.txt</PreBuildEvent>
</PropertyGroup>

2) 正常的 BeforeBuild 目标

<Target Name="BeforeBuild">
  <Exec Command="notepad.exe Foo.txt" />
</Target>

3) "attached" 到 "Build" 目标(像 stijn 建议的那样)

<Target Name="BeforeBuild2" BeforeTargets="Build">
  <Exec Command="notepad.exe Foo.txt" />
</Target>

实际上这个解决方案(在构建的情况下)将不起作用,因为 DependsOnTargetsBeforeTargets 之前执行。正是在 DependsOnTargets 中,真正的 (CoreBuild) 位于 :) 这就是为什么他们发明了 'BeforeBuild' 目标 ;)


在这两种情况下,VS 检查是否有变化(文件是最新的)。如果什么都没有改变,你为什么还要 运行 外部程序?如果此程序在文件上工作(例如 "content"),则 msbuild 和 VS 应将文件检测为过时并进行构建。


不幸的是 IDE (Visual Studio) 有自己的方法来处理 msbuild 项目。主要机制是相同的,但是当它决定构建或不构建项目时,或者以何种顺序... VS 行为完全不同。

您可以针对您的解决方案或项目使用外部工具和 运行 "msbuild"。这也将编译 "the proper way" 并且二进制文件没有什么不同,但您将拥有 MsBuild

的全部功能和潜力

这是解决方案。在您的项目文件中定义此 属性:

<PropertyGroup>
    <DisableFastUpToDateCheck>true</DisableFastUpToDateCheck>
</PropertyGroup> 

然后每次都会执行 PreBuildStep,无论项目是否是最新的。

似乎 Visual Studio 正在绕过 MSBuild 的正常最新检查并使用某种更快的自定义检查,但有破坏自定义构建目标的副作用。

None 这些解决方案对我有用 Visual Studio 用于 Mac。 我想在构建项目之前 运行 一个 bash 脚本,但是由于我使用的是 Xamarin,所以有些事情变得不正常了。我尝试了所有不同类型的目标,甚至在项目选项中尝试了 CustomCommands,但我仍然会在构建

之前自动 运行ning 或不真正 运行ning 遇到有关 MSbuild 的问题

您可以 运行 在主项目之前编译的单独项目中的 PreBuild 事件。

  1. 创建一个新项目并将其命名为 "PreBuildEvent"
  2. 将如上所示的 MSbuild targets/commands 添加到每个 属性 group/build 配置的这个新 PreBuildEvent.csproj 文件中
  3. 在您最初 进行 PreBuild 工作的项目中,添加对这个新项目的引用。
  4. 这个新项目将首先构建,执行任何 PreBuild 事件,并且一旦这个项目被构建,它就会开始构建你的原始项目。这是因为当您添加对项目的引用时,visual studio 确保以正确的顺序构建它们

还有一个额外的预构建事件未在此处讨论。通常代码分析器使用它来检查代码分析器是否由 NuGet 下载。

因此,如果您想在代码分析器之前执行某些操作,则需要使用该目标。

您只需在 .csproj 文件中的 <Project/> 节点下添加 <Target/> 节点:

<Target Name="DownloadNugetPackages" BeforeTargets="PrepareForBuild">
    <Exec Command="notepad.exe Foo.txt"/>
</Target>

PrepareForBuild 事件将 运行 预构建事件之前。

对我有用的解决方案是创建另一个项目(配置 Makefile)并将该项目设置为 BuildDependancy。

这可以避免修改预构建步骤的运行方式,并且可以让您在需要时独立于构建过程的其余部分重新生成二进制文件。