Visual Studio和MSBuild在WiX项目上以不同方式触发BeforeBuild

Dav*_*ans 8 msbuild wix

我有一个WiX(Windows安装程序XML)v3项目,其中包含对我解决方案中其他项目的引用.我正在使用WiX项目的BeforeBuild事件中的复制任务来收集参考项目的一些输出,以便以后使用我的Heat.

当我在Visual Studio中构建WiX项目(而不是解决方案)时,每个引用的项目都是在我的WiX项目之前构建的,一旦它们构建完毕,我的WiX项目上的BeforeBuild事件就会触发,然后构建WiX项目本身.这是我期望的行为 - 我能够从WiX BeforeBuild中的引用项目的bin目录访问文件,并在WiX项目执行Candle之前使用它们.

我遇到的问题是当我通过MSBuild构建WiX文件时,我发现在任何引用的项目之前,BeforeBuild事件会立即触发.这种行为差异意味着从命令行构建时我无法使用引用项目的输出.

为什么在通过命令行上的MSBuild运行到Visual Studio内部时,BeforeBuild在不同的时间点执行?

Fra*_*nov 9

如果要在Visual Studio中构建,则使用解决方案依赖项(可以是显式的或基于项目引用)来确定需要构建哪些项目,并为每个项目启动单独的构建.这是必要的,因为解决方案还可以包含不是使用MSBuild构建的项目,而其他项目在解决方案中为它们设置了显式依赖项.副作用是每个项目都被视为一个独立的构建,从而确保BeforeBuild为您提供正确的订单.

如果使用MSBuild从命令行构建,则在ResolveReferences目标期间解析(并在必要时构建)依赖项目.的BeforeBuild目标和PreBuild事件(从执行PreBuildEvent目标)是本之前都执行ResolveReferences目标.因此,依赖项目BeforeBuild目标在依赖项目的构建开始之前最终执行.

请注意,从单个项目的角度来看,BeforeBuild在解析依赖项之前执行目标确实有意义,因为依赖项解析本身可能依赖于BeforeBuild目标输出.例如,BeforeBuild可以执行自定义脚本以从SCM获取任何依赖项目的最新副本.

  • 谢谢 Franci.Sounds like BeforeBuild 不是我需要的。在 ResolveReferences 目标构建了所有引用的项目后,是否有我可以在我的 WIX 项目中覆盖的事件? (2认同)
  • @DavEvans,通过BeforeTargets或AfterTargets属性查看AfterResolveReferences目标.或者,具有BeforeTargets属性的Compile目标:`<Target Name ="MyCustomTarget"AfterTargets ="AfterResolveReferences"> <Message Text ="在此处执行AfterTargets:AfterResolveReferences." 重要性="高"/> </目标> <目标名称="MyOtherCustomTarget"BeforeTargets ="编译"> <消息文本="做东西之前的目标:在这里编译." 重要性="高"/> </目标>` (2认同)