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

时间:2015-03-07 15:22:53

标签: visual-studio-2013 msbuild pre-build-event

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

包含在项目中

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

我通过使用" rebuild"来解决这个问题。而不是" build"在我的项目上,但这很乏味而且很慢。

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

有没有正确的方法呢?

4 个答案:

答案 0 :(得分:35)

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

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

PreBuildStep将随时执行,无论项目是否是最新的。

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

答案 1 :(得分:7)

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

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>

实际上这个解决方案(在Build的情况下)不起作用,因为在 BeforeTargets 之前执行 DependsOnTargets 。而且正是在DependsOnTargets中真正的(CoreBuild)坐着:) 这就是他们发明'BeforeBuild'目标的原因;)


在这两种情况下,VS都会检查是否有更改(文件是最新的)。如果没有改变,为什么你甚至想要运行外部程序?如果该程序在文件上工作(例如“内容”),则msbuild和VS应检测文件是否过时并进行过程构建。


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

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

答案 2 :(得分:0)

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

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

  1. 创建一个新项目,并将其命名为“ PreBuildEvent”
  2. 将如上所述的MSbuild目标/命令添加到此新的PreBuildEvent.csproj文件中,以用于每个属性组/构建配置
  3. 在最初 要进行PreBuild工作的项目中,添加对该新项目的引用。
  4. 该新项目将首先构建,执行所有PreBuild事件,并且一旦构建了该项目,它将开始为您的原始项目进行构建。这是因为当您添加对项目的引用时,Visual Studio确保确保以正确的顺序构建它们

答案 3 :(得分:0)

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

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

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

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

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