В файлах WiX на что ссылается Name = "SourceDir"? - PullRequest
60 голосов
/ 29 октября 2009

WiX-файлы всегда содержат следующую строку:

<Directory Id="TARGETDIR" Name="SourceDir">

Что такое "SourceDir"? Для чего его используют? Это не настоящее имя каталога. Это какая-то магическая ценность?

Ответы [ 3 ]

86 голосов
/ 27 января 2010

От: http://robmensching.com/blog/posts/2010/1/26/StackOverflow-what-does-NameSourceDir-refer-to

Честно говоря, это то, что мы должны были скрыть от разработчика, но не сделали. Сожалею. Дело в том, что установщик Windows ожидает, что дерево Каталога всегда будет иметь корни в строке Каталога, где первичный ключ (Directory / @ Id) - «TARGETDIR», а столбец DefaultDir (Directory / @ Name) - «SourceDir». .

Во время установки TARGETDIR по умолчанию будет использовать самый большой диск на машине. SourceDir будет установлен в место, где выполняется MSI. Теперь SourceDir сложен после начальной установки, потому что он не будет установлен, пока не будет вызвано действие ResolveSource. Однако вы не хотите явно вызывать действие ResolveSource, потому что оно может побудить вас предоставить исходный носитель (иначе: вставьте компакт-диск, пожалуйста).

То, что мы должны были сделать в наборе инструментов WiX, это убрать необходимость указать пару TARGETDIR / SourceDir и сказать: «Любой элемент Directory, у которого нет родителя, будет автоматически связан с TARGETDIR, потому что это то, что MSI SDK говорит делать». Вместо этого вы должны сделать это сами ... и некоторые разработчики задаются вопросом, что все это значит.

21 голосов
/ 29 октября 2009

Из документации по wix.chm, тема «Как: добавить файл в установщик»:

Элемент с идентификатором TARGETDIR имеет вид требуется установщиком Windows и является корнем всего каталога конструкции для вашей установки

Согласно документации MSDN TARGETDIR равно

корневой каталог назначения для установка

Также в соответствии с MSDN, SourceDir равно

корневой каталог, содержащий исходный кабинетный файл или исходный файл дерево установочного пакета

Таким образом, свойство SourceDir указывает на реальный каталог: тот, где находится ваш файл MSI. Вы можете увидеть это в журнале установщика при установке с msiexec /lvx* installer.log installer.msi.

Однако по какой-то причине SourceDir полностью игнорируется при разрешении TARGETDIR. TARGETDIR должен быть установлен явно (например, в командной строке), иначе он разрешается в ROOTDRIVE. Если ROOTDRIVE не задан явно, то это корень диска с наибольшим количеством свободного места.

Быстрый тест показывает, что установка компонента в TARGETDIR действительно помещает файлы в корень моего диска D: \, а не в папку, где находится MSI.

2 голосов
/ 04 мая 2018

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

После некоторой разборки я нашел фактический путь в файле wixproj, там SourceDir определен как:

<SourceDir>$(SolutionDir)distribution\Release</SourceDir>

, который на самом деле не имеет ничего общего с установочными файлами и файлами проекта. Мне удалось добавить еще одну PropertyGroup, которая зеркально отображала группу релизов, которая теперь указывала на мои файлы отладки:

<SourceDir>$(SolutionDir)distribution\Debug</SourceDir>

Надеюсь, это кому-нибудь поможет. Я знаю, что это немного не по теме, но, надеюсь, это поможет кому-то в будущем. Не уверен, почему плагин проекта не предоставляет это значение? Или я скучаю по этому?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...