如何在 DefineConstants 中基于您的构建版本放置变量以使用 HeatDirectory 进行收获?

How to put a variable base on your build version in DefineConstants for a Harvest with HeatDirectory?

我需要在 Wix 工具集上获取一个目录,但该目录的名称将包含构建版本号。 我知道如何定义静态常量,但是否可以将变量设为一个?

我在论坛上搜索过,没有找到基于外部变量的收获

<PropertyGroup>
  <DefineConstants>BasePath=..\Files$(build);</DefineConstants>
</PropertyGroup>

<HeatDirectory 
OutputFile="HarvestedCopyFiles.wxs" 
DirectoryRefId="INSTALLFOLDER" 
ComponentGroupName="HarvestedCopyFilesComponent" 
SuppressCom="true" 
Directory="..\Files" 
SuppressFragments="true" 
SuppressRegistry="true" 
SuppressRootDirectory="true" 
AutoGenerateGuids="false" 
GenerateGuidsNow="true" 
ToolPath="$(WixToolPath)" 
PreprocessorVariable="var.BasePath" />

我该怎么做才能使这种 $(build) 变量起作用? 有没有办法将它 link 放到我的 variable.wxi 文件中,我得到了:<?define ProjectBuild = "421" ?>?

您可以通过将 BeforeBuild 目标添加到您的 wixproj 文件来执行类似的操作:

<Target Name="BeforeBuild">
    <ItemGroup>
        <FileThatExists Include="..\Files\**\FileThatExists.txt"/>
    </ItemGroup>

    <PropertyGroup>
        <Build>@(FileThatExists->'%(RecursiveDir)')</Build>
        <BasePath>..\Files$(Build)\</BasePath>
        <DefineConstants>
            $(DefineConstants);
            Build=$(Build);
            BasePath=$(BasePath);
        </DefineConstants>    
    </PropertyGroup>

    <HeatDirectory 
        OutputFile="HarvestedCopyFiles.wxs" 
        DirectoryRefId="INSTALLFOLDER" 
        ComponentGroupName="HarvestedCopyFilesComponent" 
        SuppressCom="true" 
        Directory="$(BasePath)" 
        SuppressFragments="true" 
        SuppressRegistry="true" 
        SuppressRootDirectory="true" 
        AutoGenerateGuids="false" 
        GenerateGuidsNow="true" 
        ToolPath="$(WixToolPath)" 
        PreprocessorVariable="var.BasePath" 
    />
</Target>

它的作用是通过巧妙地使用 ItemGroup 元数据属性来计算构建文件夹的 #。您也可以创建另一个目标来获取该文件夹名称,您应该能够在 SO 上找到一些示例。

我们将 Build 属性 值设置为我们创建的项目的 RecursiveDir 元数据,然后还定义了 BasePath 值。

接下来我们更新 DefineConstants 属性 中包含的值。这是 属性 可以让您将变量键值对传递给 Candle wix 编译器,它可以让您在安装程序源中使用 $(var.Build) 和 $(var.BasePath) 等语法代码。

最后我们调用 HeatDirectory 任务,它将收集您的 build# 文件夹并生成 HarvestedCopyFiles.wxs 文件。

我想建议定义项目 "HarvestDirectory",如果存在一个或多个 HarvestDirectory 项目,HarvestDirectory 目标将使用该项目 运行。

要做到这一点,您只需将 <HeatDirectory> 替换为

    <PropertyGroup>
        <HarvestDirectoryAutogenerateGuids>true</HarvestDirectoryAutogenerateGuids>
        <HarvestDirectoryGenerateGuidsNow>true</HarvestDirectoryGenerateGuidsNow>
    </PropertyGroup>
    <ItemGroup>
        <HarvestDirectory Include="$(BasePath)">
            DirectoryRefId="INSTALLFOLDER" 
            ComponentGroupName="HarvestedCopyFilesComponent"  
            PreprocessorVariable="var.BasePath"
            SuppressCom="true"
            SuppressRegistry="true"
            SuppressRootDirectory="true"
        </HarvestDirectory>
    </ItemGroup>

我更喜欢这种方法,因为它会自动将生成的文件包含在您的编译源中,因此您不必在项目中包含不存在的文件。