2013-06-24 4 views
0

У меня есть проекты с несколькими установщиками (для установки различных приложений и веб-сайтов), которые все устанавливаются под одной и той же родительской папкой (например, \ Веб-сайты). Каждый из моих инсталляторов вызывает CustomAction, который запускает консольное приложение C# (общее для всех установщиков), передавая несколько параметров, специфичных для этого установщика.Как перечислить дочерние каталоги в WiX?

Каждый установщик устанавливает несколько веб-сайтов, каждый со своей собственной структурой папок (например, \ Веб-сайты \ App1, \ Веб-сайты \ App2 и т. Д.).

Например, в одном инсталляторе:

<DirectoryRef Id="WebsitesFolder"> 
    <Directory Id="App1Folder" Name="App1"/> 
    <Directory Id="App2Folder" Name="App2"/> 
</DirectoryRef> 

А в другой инсталлятор:

<DirectoryRef Id="WebsitesFolder"> 
    <Directory Id="App3Folder" Name="App3"/> 
    <Directory Id="App4Folder" Name="App4"/> 
    <Directory Id="App5Folder" Name="App5"/> 
    <Directory Id="App6Folder" Name="App6"/> 
</DirectoryRef> 

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

<CustomAction Id="ConfigureWebsites" Directory="WebsitesFolder" ExeCommand="&quot;[%DEPLOYEXE]&quot; /d:&quot;[WebsitesFolder]\<list child directories here>&quot;" Execute="deferred" Return="ignore" /> 

Для получения следующего в одном инсталляторе:

deploy.exe /d:"C:\Websites\App1,C:\Websites\App2" 

Во втором установщика:

deploy.exe /d:"C:\Websites\App3,C:\Websites\App4,C:\Websites\App5,C:\Websites\App6" 

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

Причина, по которой я хочу, чтобы мой файл deploy.exe имел определенный список папок, состоит в том, что он будет проходить через эти папки и выполнять множество пользовательских задач, и я не хочу, чтобы он проходил через каждый веб-сайт под это родительская папка, но только папки веб-сайтов, которые являются частью текущей установки.

ответ

0

Enumerat[ing] child directories в вашем пользовательском действии было бы правильным способом сделать это. WiX предлагает оболочку DTF для API установщика Windows. Вы можете написать свое собственное действие на C# таким образом, чтобы выполнять все необходимые сценарии установки, отката, деинсталляции в соответствии с надлежащими пользовательскими действиями. Чтобы найти затронутые дочерние каталоги, вы должны найти каталог веб-сайтов в Directory table, а затем получить все каталоги в таблице с ним в качестве родителя. После того, как у вас есть идентификаторы Directory, найдите их места установки с помощью GetTargetPath (MsiGetTargetPath) DTF и выполните соответствующие действия для сценария. См. Документацию DTF, поставляемую с WiX.

Или продолжать с идеей пользовательских действий, использовать MSBuild XslTransformation task в файле .wixproj (это файл проекта MSBuild), чтобы преобразовать соответствующие данные из файла .wxs в WiX Include файл, в котором ваш CustomAction элемент будет быть определена. Вы можете поставить задачу XslTransformation в целевой объект BeforeBuild, как описано в комментариях, которые вы найдете в файле проекта. (Немного XSL не слишком сложна, ни немного MSBuild ... особенно по сравнению с установщиком Windows.)

Примечание: Чтобы отредактировать файл проекта в Visual Studio, щелкните правой кнопкой мыши проект в обозреватель решений и выберите «Разгрузить». Затем щелкните правой кнопкой мыши и выберите «Изменить».