设置变量定义的库项目

时间:2017-02-08 12:17:23

标签: visual-studio wix

我目前正在尝试创建一个包含多个变量定义的库,我可以在不同的安装项目中使用但没有成功。

我有几个巨大的*.wxs文件,它们构建在一个库中,File/@Source应该依赖于项目设置。原因是我们的内部目录结构看起来像any\path\Redistributables\In-Test\X64\productAany\path\Redistributables\RC\X86\productA所以我的路径的最后两部分应该改变,例如在x64和x86 build。

现在我有几个安装项目,它们使用相同的路径,但在另一个子目录中工作,例如Redistributables\In-Test\X64\AnyOtherProductB

我不想将具有相同值的预处理程序变量传递给每个项目,因为路径可能会在以后更改,然后我必须编辑太多的项目设置。

所以我的问题: 是否可以使用公共变量/属性构建类似“变量/属性容器”的东西,以便我可以引用该库以使用其中为<component><file source...>定义的变量?

我试图在$(var.sourcedir)$(var.compilemode)$(var.platform)之前使用prepocessor变量实现这一点而没有运气。这三个部分是我需要定义一次以在几乎所有项目中使用它们的部分。

1 个答案:

答案 0 :(得分:0)

小编辑在这里,我做了很多,我快速阅读问题并做出答案,然后重新阅读问题并认为我的答案并不适合这个问题,但在这种情况下,我希望它仍然有用,也许这里引用的其他资源之一也会有所帮助。

<小时/>

啊我做了类似这样的事情,把头撞在墙上一段时间试图弄明白。

问题是您无法在wixlib中使用$(var.sourceDir)之类的变量,然后在项目中使用lib时更改它。当您构建它时,编译器会将wixlib中的$(var.sourceDir)替换为此变量的实际值。您可以通过打开obj文件并查找使用此目录的组件或其他内容来验证这一点,并查看它的sourceDir变量值不是$(var.sourceDir)

要解决这个问题,我们将使用在链接时评估的bind / wix变量(不确定术语)。

This是&#34;如何&#34;我最终得到了很多帮助我的东西

所以,将你的变量更新为这样的东西!(bindpath.SourceDir)

<Fragment>
    <util:RegistrySearchRef Id="MSVCPPRedist_x64_12"/>

    <PackageGroup Id="MSVCPPRedist_x64_12">
        <ExePackage
            Id="MSVCPPRedist_x64_12_0_21005"
            Cache="no"
            Description="Visual C++ 2013 Redistributable needed for [WixBundleName]"
            DetectCondition="MSVCPPRedist_x64_12 OR NOT VersionNT64"
            DisplayName="Prerequisite - Visual C++ 2013 Redistributable (x64)"
            InstallCommand="/install /quiet /norestart /log vc12log.txt"
            PerMachine="yes"
            Permanent="yes"
            SourceFile="!(bindpath.PrerequisitesDir)VC++\vcredist_x64_12.exe"
            UninstallCommand="/uninstall"
            Vital="yes"/>
    </PackageGroup>
</Fragment>

然后在构建机器上的一些道具文件或项目文件中,您可以包含以下内容:

<LinkerAdditionalOptions>-b &quot;PrerequisitesDir=$(PrerequisitesDir)\&quot;</LinkerAdditionalOptions>

如果$(PrerequisitesDir)属性是基于构建机器上的msbuild文件中的相对路径设置的(如果使用绝对路径也可以):

<!-- Directories -->      
<PrerequisitesDir>$(MSBuildThisFileDirectory)..\..\..\Installers\Prerequisites\</PrerequisitesDir>

现在,当您构建链接器阶段时,将使用构建时定义的bindPath来查找源文件。

关于平台和配置变量,我认为你可以使用引用的WixVariables!(wix.VariableName),但是我不确定我的头脑,没有更多的自己试验。您可以查看this answer here以帮助您更好地了解不同类型的变量。如果WixVariables没有工作,你可以构建几种yoru wixlib,并在wixproj中使用MSBuild属性$(配置),在wixlib文件的hintpath中引用相应的一个。