33

在我的项目中,我正在运行一个外部工具来更新一些二进制文件。这些文件作为“内容”包含在项目中。

目前,该工具设置为在 C# 项目属性中的“预构建事件”期间运行。不幸的是,这个事件只有在项目过期时才会执行,这不是我需要的。

我通过在我的项目中始终使用“重建”而不是“构建”来解决这个问题,但这既乏味又缓慢。

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

有正确的方法吗?

4

5 回答 5

53

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

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

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

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

于 2015-03-14T14:50:54.080 回答
10

在项目级别,您有三个选项:

1) 预构建动作

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

2)正常的BeforeBuild目标

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

3)“附加”到“构建”目标(如 stijn 建议)

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

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


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


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

您可以使用外部工具并针对您的解决方案或项目运行“msbuild”。这也将编译“正确的方式”并且二进制文件不会有所不同,但您将拥有 MsBuild 的全部功能和潜力

于 2015-03-09T17:01:42.523 回答
3

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

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

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

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

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

于 2019-01-30T23:48:22.787 回答
1

这些解决方案都不适用于我使用 Visual Studio for Mac。我想在构建项目之前运行一个 bash 脚本,但由于我使用的是 Xamarin,所以有些事情变得不正常了。我尝试了所有不同类型的目标,甚至尝试了项目选项中的 CustomCommands,但我仍然会遇到 MSbuild 只是自动运行或在构建之前没有真正运行的问题

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

  1. 创建一个新项目并将其命名为“PreBuildEvent”
  2. 将如上所示的 MSbuild 目标/命令添加到每个属性组/构建配置的新 PreBuildEvent.csproj 文件中
  3. 在您最初执行 PreBuild 工作的项目中,添加对这个新项目的引用。
  4. 这个新项目将首先构建,执行任何 PreBuild 事件,一旦构建了这个项目,它将开始为您的原始项目构建。这是因为当您添加对项目的引用时,Visual Studio 会确保以正确的顺序构建它们
于 2018-09-26T16:58:08.207 回答
0

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

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

于 2022-02-16T10:54:24.190 回答