在我的项目中,我正在运行一个外部工具来更新一些二进制文件。这些文件作为"内容"。
包含在项目中此时工具设置为在"预构建事件期间运行"在C#项目属性中。不幸的是,只有在项目过期时才会执行此事件,这不是我需要的。
我通过使用" rebuild"来解决这个问题。而不是" build"在我的项目上,但这很乏味而且很慢。
无论项目是否是最新的,我都需要始终执行此工具。实际上,甚至在MSBuild确定项目是否是最新的之前,因为该工具修改了项目中包含的一些文件,因此影响了最新的检查结果。
有没有正确的方法呢?
答案 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事件,该项目在主项目之前进行编译。
答案 3 :(得分:0)
还有另外一个未在此处讨论的预构建事件。通常,代码分析器使用它来检查NuGet是否下载了代码分析器。
因此,如果要在代码分析器之前执行某些操作,则需要使用该目标。
您只需要在.csproj文件的<Target/>
节点下添加<Project/>
节点:
<Target Name="DownloadNugetPackages" BeforeTargets="PrepareForBuild">
<Exec Command="notepad.exe Foo.txt"/>
</Target>
PrepareForBuild事件将在预构建事件之前运行。