MSBuild:directory.build.props和directory.build.targets无法与*.wixproj一起使用

5

directory.build.props和directory.build.targets在Windows Installer Wix项目中无法使用。 *.wixproj

如何解决这个问题?

1个回答

10

背景

directory.build.propsdirectory.build.targets 的隐式导入是 MSBuild 15.0+ 的内在特性。它不必采用新的 SDK 项目格式才能工作。这是通过microsoft.common.props的导入实现的,SDK 样式的项目自动包含它,并且大多数旧样式的项目将其作为项目文件中的第一个导入项。此处进行了文档说明here

不幸的是,WiX 项目没有包含此导入项,这就是为什么它没有被检测到的原因(可以在 Votive 源代码here 中看到)。我不知道为什么,但 microsoft.common.props 被排除在外可能有一些原因。

由于不清楚导入 microsoft.common.props 是否会导致问题,建议使用新的 GetPathOfFileAbove 函数手动导入扩展程序。您只需要执行一次即可。

解决方案

  1. 使用 右键单击项目 → 卸载 {name}…,卸载您的项目。
  2. 右键单击项目 → 编辑 {name}…
  3. 行 3 (应该是 <Project> 中的第一个元素) 处添加以下内容:

    <Import Project="$([MSBuild]::GetPathOfFileAbove(directory.build.props))"
            Condition="Exists('$([MSBuild]::GetPathOfFileAbove(directory.build.props))')" />
    
    请将以下内容添加到文件底部,导入WiX目标之前:
  4. <Import Project="$([MSBuild]::GetPathOfFileAbove(directory.build.targets))"
            Condition="Exists('$([MSBuild]::GetPathOfFileAbove(directory.build.targets))')" />
    
    如果您需要钩入WiX构建过程或目标,请使用CustomBeforeWixTargetsCustomAfterWixTargets构建属性,这些属性可能通过MSBuildThisFileFullPath保留属性引用directory.build.targets文件本身。这将确保WiX在适当的时间导入这些内容。

    配置完成后,使用directory.build.propsdirectory.build.targets将按预期进行。如果WiX有望原生支持这些构建扩展名,则您应该能够自由地删除这些显式导入。


WiX v4 开关切换到使用 Microsoft.Common.props。 - Bob Arnson
1
很好了解。不过我很好奇,新的_Setup Project_(*.wixproj)的项目模板是作为Visual Studio扩展(又称_Votive_)的一部分提供的,对吗?但我仍然没有看到Microsoft.Common.props被引入项目中(参考:https://github.com/wixtoolset/VisualStudioExtension/blob/develop/src/Templates/v4/Projects/WixProject/SetupProject.wixproj)。这个导入是以其他方式进行的吗? - Chris Martinez
https://github.com/wixtoolset/Tools/blob/master/src/WixToolset.BuildTasks/wix.targets#L75 - Bob Arnson
感谢澄清。;) - Chris Martinez
我花了一些时间才弄清楚为什么我的.targets文件无法看到我的wixproj属性。拥有v4钩子将是很好的。 - str8ball

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接