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>
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>