2010-09-03 21 views
6

我有一个WiX(Windows安装程序XML)v3项目,其中包含对我解决方案中其他项目的引用。我正在使用WiX项目的BeforeBuild事件中的复制任务来收集一些参考项目的输出,供以后使用我的HeatVisual Studio和MSBuild fire BeforeBuild在一个WiX项目上有所不同

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

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

为什么BeforeBuild在命令行通过MSBuild在Visual Studio中运行时在不同的时间点执行?

回答

8

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

如果您使用MSBuild从命令行构建,则依赖项目将被解析(并生成if在ResolveReferences目标期间需要)。 BeforeBuild目标和PreBuild事件(从PreBuildEvent目标执行)都在ResolveReferences目标之前执行。因此,依赖项目BeforeBuild目标在启动依赖项目的构建之前结束执行。

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

+1

感谢Franci.Sounds像BeforeBuild不是我所需要的。是否有一个事件可以在我的WIX项目中重写,在ResolveReferences目标构建了所有引用的项目之后会触发? – 2010-09-05 09:03:36

+2

@DavEvans,请通过BeforeTargets或AfterTargets属性查看AfterResolveReferences目标。或者,具有BeforeTargets属性的编译目标: <目标名称=“MyOtherCustomTarget”BeforeTargets =“编译”><消息文本=“做的东西BeforeTargets:编译在这里。”重要性=“高”/>' – dirtybird 2015-06-05 16:43:32

相关问题