Каков канонический способ добавить весь каталог в базу данных MSI с помощью Wix? - PullRequest
0 голосов
/ 25 сентября 2018

Мне нужно упаковать весь каталог в файл MSI, который я создаю с помощью Wix.

Каталог находится в нелокальном расположении (для создания сценариев и т. Д.), Скажем, C:\path\to\baz.

Предполагается, что каталог будет установлен на целевом хосте (где MSI предназначен для запуска) как %ProgramFiles%\foobar\baz, это зависимость от программного обеспечения, которое я разрабатываю.

Программа Wix heatПохоже, что он предназначен для этой работы - сбор содержимого каталога (baz) и генерация исходного файла Wix.Я запускаю его как:

heat.exe dir C:/path/to/baz -gg -dr baz -srd -cg baz baz.heat.wxs

Проблема в том, что heat дословно добавляет SourceDir\ путь к каждому файлу, который он находит:

<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Fragment>
        <DirectoryRef Id="baz" />
    </Fragment>
    <Fragment>
        <ComponentGroup Id="electron">
            <Component Id="cmp9C432873A67498F6C219E9E15596F0D8" Directory="baz" Guid="33D27AF6-A2E4-459C-818B-876268705883">
                <File Id="filE773982796F85DF928701AF071140DE5" KeyPath="yes" Source="SourceDir\api-ms-win-core-console-l1-1-0.dll" />
            </Component>
            <!-- Other Component and nested File elements omitted. -->
        </ComponentGroup>
    </Fragment>
<Wix>

Я не уверен, почему этоделает это, я знаю, что есть некоторые вещи, такие как переменные связующего и другие виды переменных, но независимо от того, компоновщик Wix не будет собирать MSI, потому что он не может найти файлы, указанные в сгенерированном исходном XML-файле:

baz.heat.wxs(12) : error LGHT0103 : The system cannot find the file 'SourceDir\api-ms-win-core-console-l1-1-0.dll'

Я связываю как исходный файл, сгенерированный heat, как описано выше, так и то, что я бы назвал моим «основным» исходным файлом, который фактически определяет установленную функцию и где будет установлен каталог baz:

<?xml version="1.0" encoding="utf-8" ?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
    <Product Name="Foobar" Manufacturer="Acme" Id="2c05b2af-3adf-4901-b126-5a839c67978d" UpgradeCode="6db7d46b-5152-4e67-9615-c3f3c4dc205c" Language="1033" Codepage="1252" Version="7.0.0">
        <Package Id="*" Description="Acme Foobar Installer" Languages="1033" SummaryCodepage="1252" Compressed="yes" InstallerVersion="200" Keywords="Installer" Manufacturer="Acme" />
        <MediaTemplate EmbedCab="yes" />
        <Directory Id="TARGETDIR" Name="SourceDir">
            <Directory Id="ProgramFilesFolder">
                <Directory Id="INSTALLDIR" Name="Foobar">
                    <Directory Id="baz" Name="baz" />
                </Directory>
            </Directory>
        </Directory>
        <Feature Id="lanthir" Level="1">
            <ComponentGroupRef Id="baz" />
        </Feature>
</Product>

Я хотел бы знать:

  • Является ли SourceDir чем-то иным, кроме стенографического справочника каталогов?
  • Что такое каноническийспособ заставить либо heat генерировать правильный путь, который можно связать как есть, без проблем, либо заставить инструмент компоновщика (light) разрешить путь, сгенерированный heat по умолчанию?

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

1 Ответ

0 голосов
/ 28 ноября 2018

Вам нужно использовать ключ командной строки -var для нагрева.Это заменит вместо SourceDir $ (var.WhwhatYouPutAfterTheVarArg).

, например,

heat.exe dir C:/path/to/baz -gg -dr baz -srd -cg baz -var var.BazDir baz.heat.wxs 

должно привести к чему-то более похожему на

<File Id="filE773982796F85DF928701AF071140DE5" KeyPath="yes" Source="$(var.BazDir)\api-ms-win-core-console-l1-1-0.dll" />

. Затем вам нужноустановить значение для BazDir.Я склонен делать это путем обновления файла wixproj

  <PropertyGroup>
     <ProjectDefineConstants>BazDir=PathToBazDirectory;$(ProjectDefineConstants)</ProjectDefineConstants>
  </PropertyGroup>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...