2017-02-08 65 views
0

我目前正試圖製作一個庫,其中包含幾個我可以在不同的安裝項目中使用的變量定義,但沒有成功。變量定義的設置庫項目

我有幾個巨大的*.wxs文件構建到庫中,其中File/@Source應取決於項目設置。原因是我們的內部目錄結構看起來像any\path\Redistributables\In-Test\X64\productAany\path\Redistributables\RC\X86\productA,所以我的路徑的最後2個部分應該改變,例如,在x64和x86版本上。

現在我也有幾個安裝項目,它們使用相同的路徑,但在另一個子目錄中工作,例如Redistributables\In-Test\X64\AnyOtherProductB

我不想將具有相同值的預處理器變量傳遞給每個項目,因爲路徑稍後可能會更改,那麼我將不得不編輯太多的項目設置。

所以我的問題: 是否有可能建立一些像「變量/屬性Container」公共變量/屬性,以便我可以只引用該庫以使用它定義的變量我<component><file source...>

我試過在$(var.sourcedir)$(var.compilemode)$(var.platform)之前用preprocessor變量來實現,沒有運氣。這三個部分是我需要定義的部分,幾乎可以在所有項目中使用它們。

+0

你有沒有在你的wixproj定義 - <的PropertyGroup> $(DefineConstants); sourcedir = $(sourcedir); compilemode = $(compilemode);平臺= $(平臺)

回答

0

小編輯在這裏,我做了很多,我很快就讀了這個問題,並作出答案,然後重讀這個問題,並認爲我的答案不太適合這個問題,但在這種情況下,我希望它仍然有幫助,也許此處引用的其他資源之一也將有所幫助。


啊我做了這樣的事情,並撞了我的頭撞在牆上了試圖弄明白了一會兒。

問題是您不能在wixlib中使用像$(var.sourceDir)這樣的變量,然後在項目中使用lib時稍後再更改它。會發生什麼情況是編譯器會在您構建wixlib時用此變量的實際值替換$(var.sourceDir)。您可以通過打開obj文件並查找使用此目錄的組件或其他東西來驗證這一點,並且看到它具有sourceDir變量的值而不是$(var.sourceDir)

爲了解決這個問題,我們將使用bind/wix變量(不確定的術語)在鏈接時進行評估。

This是「如何」,我最終得到了這

幫助我很多,所以,更新您的變量是這樣的!(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找到源文件。

關於平臺和配置變量,我認爲你可以使用引用爲!(wix.VariableName)的WixVariables,但是我不確定是否在我頭頂,沒有更多的嘗試自己。您可以查看this answer here以幫助您更好地瞭解不同類型的變量。如果WixVariables不起作用,你可以通過在wixlib文件的hintpath中使用MSBuild屬性$(configuration)等等來構建幾種yoru wixlib風格,並在你自己的wixproj中引用相應的風格。

+0

首先,謝謝你的回答。但是,我不需要在流程中更改變量。我只需要一組在每個構建中不同的變量,這就是爲什麼我認爲預處理器變量可以工作。例如。在x86版本中,我在x64'platform = 64'中和之上傳遞'platform = x86'。這樣我就可以在我傳遞值的項目中訪問我的值。這裏唯一的事情是,我需要在其他項目中訪問這些值,這似乎是不可能的。是否可以定義wix變量並將值設置爲預處理器值?如果我說得對,wixvars是公開的? –

+0

編譯或鏈接階段需要'''的'源'嗎? –

+0

由於您可以構建wixlib,而不需要在定義好的位置實際存在文件,所以我懷疑wix只會在鏈接時運行light.exe時通過它們的源查找並打包包含的文件。我會嘗試添加另一個答案,以充實你想做的事情。 Arkady對這個問題的評論是你需要做的,以便你可以在你的wxs文件中使用$(var.configuration)和其他變量。 –