В файлах WiX, что означает Name= "SourceDir"?

файлы WiX всегда включают эту строку:

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

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

3 ответов


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

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

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

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


из wix.документация chm, раздел "Как добавить файл в установщик":

элемент с идентификатором TARGETDIR является требуется установщиком Windows и корень всех каталогов конструкции для установки

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

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

также согласно MSDN, SourceDir is

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

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

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

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


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

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

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

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

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

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