Wixproj 属性不会作为变量传递给 Candle

Wixproj properties aren't passed as variables to Candle

Wix 3.11.2

我有一些变量在我的 .wixproj 文件中定义为属性或通过其他 .props 文件导入,但是当它们在 .wxs 文件中被引用时,Candle 会抛出错误。

在我的最小复制中,我的 wixproj 与 Visual Studio 2022 扩展生成的内容完全相同,除了定义变量和添加单个 .wxs 文件:

<PropertyGroup>
  <Manufacturer>ReproManufacturer</Manufacturer>
</PropertyGroup>
<ItemGroup>
  <Compile Include="Product.wxs" />
</ItemGroup>

Product.wxs 的整体是:

<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
  <Product Id="*" Name="MinimalRepro" Language="1033" Version="1.0.0.0" Manufacturer="$(var.Manufacturer)" UpgradeCode="8ad3f73f-4be0-410a-aad0-ec2057962a2f">
    <Package InstallerVersion="200" Compressed="yes" InstallScope="perMachine" />
  </Product>
</Wix>

构建时(在 VS 中和通过仅使用 msbuild 的命令行),我收到此错误:

CNDL0150: Undefined preprocessor variable '$(var.Manufacturer)'.

在构建日志中,调用 candle.exe 时未定义:

candle.exe
-dDebug
-d"DevEnvDir=C:\Program Files\Microsoft Visual Studio22\Professional\Common7\IDE\"
-d"SolutionDir=*Undefined if not building a solution or within Visual Studio*"
-d"SolutionExt=*Undefined if not building a solution or within Visual Studio*"
-d"SolutionFileName=*Undefined if not building a solution or within Visual Studio*"
-d"SolutionName=*Undefined if not building a solution or within Visual Studio*"
-d"SolutionPath=*Undefined if not building a solution or within Visual Studio*"
-dConfiguration=Debug
-dOutDir=bin\Debug\
-dPlatform=x86
-dProjectDir=C:\Path\
-dProjectExt=.wixproj
-dProjectFileName=MinimalRepro.wixproj
-dProjectName=MinimalRepro
-dProjectPath=C:\Path\MinimalRepro.wixproj
-dTargetDir=C:\Path\bin\Debug\
-dTargetExt=.msi
-dTargetFileName=MinimalRepro.msi
-dTargetName=MinimalRepro
-dTargetPath=C:\Path\bin\Debug\MinimalRepro.msi
-out obj\Debug\
-arch x86
Product.wxs

如果我在 .wxi 文件中定义它们,那么它就可以工作...但是我需要从属性中提取一些值,所以这种变通方法对我不起作用。

我不确定我错过了什么;有什么想法吗?


更新:

如果我也将其添加到我的 wixproj 文件中:

  <Target Name="DefineConstants">
    <PropertyGroup>
      <DefineConstants>$(DefineConstants);Manufacturer=TargetManufacturer</DefineConstants>
    </PropertyGroup>
  </Target>

并将其添加到 <Project> 标签内的 InitialTargets 列表中,然后它会按预期工作。不理想,但功能齐全。我仍然希望弄清楚如何让它工作而不必手动添加每个 属性。

MSBuild 属性不是 WiX 预处理器定义的。但是,正如您所发现的,WiX MSBuild 目标会将单个 MSBuild 属性 DefineConstants 转换为 WiX 预处理器定义。你不应该需要一个目标来做到这一点。只是做:

<PropertyGroup>
  <DefineConstants>Manufacturer=ReproManufacturer</DefineConstants>
</PropertyGroup>

或者如果您必须涉及 MSBuild 属性:

<PropertyGroup>
  <Manufacturer>ReproManufacturer</Manufacturer>
  <DefineConstants>Manufacturer=$(Manufacturer)</DefineConstants>
</PropertyGroup>