2017-02-08 3 views
0

В настоящее время я пытаюсь создать библиотеку с несколькими определениями переменных, которые я могу использовать в разных проектах установки, но безуспешно.Проект библиотеки установки для определения переменных

У меня есть несколько огромных файлов *.wxs, которые встроены в библиотеку, где File/@Source должен зависеть от настроек проекта. Причиной этого является наш внутренний структурный каталог, который выглядит как any\path\Redistributables\In-Test\X64\productA или any\path\Redistributables\RC\X86\productA, поэтому последние 2 части моего пути должны измениться, например. на сборке x64 и x86.

Теперь у меня есть несколько проектов установки, которые используют один и тот же путь, но работают в другом подкаталоге, например Redistributables\In-Test\X64\AnyOtherProductB.

Я не хочу передавать переменные препроцессора с одинаковыми значениями для каждого проекта, потому что путь может измениться позже, и тогда мне придется изменить слишком много параметров проекта.

Итак, мой вопрос: Возможно ли построить что-то вроде «Variable/Property Container» с общедоступными переменными/свойствами, чтобы я мог просто ссылаться на эту библиотеку, чтобы использовать переменные, определенные в ней для моего <component><file source...>?

Я пытался добиться этого с помощью переменных предшественника до $(var.sourcedir)$(var.compilemode)$(var.platform), не повезло. Эти 3 части, которые мне нужно определить один раз, чтобы использовать их почти во всех проектах.

+0

ли вы определили в вашем wixproj - $ (DefineConstants); SourceDir = $ (SourceDir); compilemode = $ (compilemode); платформа = $ (платформа)

ответ

0

Небольшое редактирование здесь, я делаю это много, когда я быстро прочитаю вопрос и сделаю ответ, а затем перечитайте вопрос и подумайте, что мой ответ не совсем соответствует вопросу, но в этом случае я надеюсь, что он по-прежнему полезен и, возможно, один из других ресурсов, упомянутых здесь, также поможет.


А я сделал что-то вроде этого и ударился головой о стену на некоторое время, пытаясь понять его.

Проблема в том, что вы не можете использовать переменные типа $(var.sourceDir) в wixlib, а затем изменить их позже, когда используете lib в проекте. Что происходит, компилятор заменяет $(var.sourceDir) в вашем wixlib фактическим значением этой переменной при ее создании. Вы можете проверить это, открыв свой 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 найти исходные файлы.

Что касается платформ и конфигурационных варов, я думаю, вы можете использовать WixVariables, на которые ссылается как (wix.VariableName), но я не уверен в своей голове и не экспериментирую сам. Вы можете взглянуть на this answer here, чтобы узнать больше о разных типах переменных. Если WixVariables не работает, вы можете просто создать несколько вариантов yoru wixlib и ссылаться на соответствующий в своем wixproj, используя свойства MSBuild $ (конфигурация), ect .. в hintpath файла wixlib.

+0

Кулак вообще, спасибо за ваш ответ. Однако мне не нужно менять переменную внутри процесса. Мне просто нужен набор переменных, которые различаются в каждой сборке, поэтому я думал, что переменные препроцессора будут работать. Например. в x86 build я передаю 'platform = x86' в и на x64' platform = 64'. Таким образом, я могу получить доступ к моим значениям в рамках проекта, в котором передал значения. Единственное, что здесь, что мне нужно получить доступ к этим значениям в других проектах тоже, что кажется невозможным. Можно ли определить wixVariables и установить значения в значения preprocesor? Если я прав, wixvars являются общедоступными? –

+0

Является ли 'Source'' 'необходимым в фазе компиляции или ссылки? –

+0

Поскольку вы можете создать wixlib без фактического наличия файлов в определенном месте, я бы заподозрил, что wix ищет только пакеты и упаковывает включенные файлы через их соединение во время связывания при запуске light.exe. Я постараюсь добавить еще один ответ, который поможет вам сделать то, что вы хотите. Комментарий Аркадия к вопросу заключается в том, что вам нужно сделать так, чтобы вы могли использовать $ (var.configuration) и другие vars в ваших файлах wxs. –