MSBuild:directory.build.props 和 directory.build.targets 不适用于 *.wixproj

MSBuild: directory.build.props and directory.build.targets does not work with *.wixproj

directory.build.props 和 directory.build.targets 不适用于 Windows Installer Wix 项目。 *.wi​​xproj

如何解决这个问题?

背景

directory.build.propsdirectory.build.targets 的隐式导入是 MSBuild 15.0+ 的固有功能。它 而不是 必须采用新的 SDK 项目样式格式才能工作。 magic 通过导入 microsoft.common.props 发生,SDK 样式项目会自动执行,大多数旧样式项目作为第一个导入包含在项目文件。这已记录在案 here

不幸的是,WiX 项目不包含此导入,这就是它未被拾取的原因(如 Votive 源中所示 here)。我不能说为什么,但 microsoft.common.props 被排除在外可能是有原因的。

由于不清楚导入 microsoft.common.props 可能 是否会让您感到悲伤,推荐的方法是使用手动导入扩展新的 GetPathOfFileAbove 函数。你只需要这样做一次。

解决方案

  1. Right-click 项目卸载你的项目 → 卸载 {name}…
  2. Right-click 项目 → 编辑 {name}…
  3. 第3行添加以下内容(应该是<Project>中的第一个元素):

    <Import Project="$([MSBuild]::GetPathOfFileAbove(directory.build.props))"
            Condition="Exists('$([MSBuild]::GetPathOfFileAbove(directory.build.props))')" />
    
  4. 在导入 WiX 目标之前在文件底部添加以下内容:

    <Import Project="$([MSBuild]::GetPathOfFileAbove(directory.build.targets))"
            Condition="Exists('$([MSBuild]::GetPathOfFileAbove(directory.build.targets))')" />
    

If you need to hook into the WiX build process or targets, use the CustomBeforeWixTargets and CustomAfterWixTargets build properties, which might refer to the directory.build.targets file itself via the MSBuildThisFileFullPath reserved property. This will ensure things are imported by WiX at the appropriate time.

配置后,directory.build.propsdirectory.build.targets 的使用将如预期。如果 WiX 曾经原生支持这些构建扩展,您将保持一致并且应该能够在您有空时删除这些显式导入。