Ух ты какой ответ !! Большое спасибо за то время, которое вы, должно быть, потратили на написание этого, я многому научился !! Я не использую функции, потому что 3 варианта делают примерно одно и то же (и, конечно, нет никаких дополнительных частей, которые пользователь может не устанавливать), но у них разные файлы меню, разные отчеты и т. Д. - но суть код / ​​бизнес-логика одинаковы - хорошо, что я имею в виду, это то, что они используют одни и те же библиотеки DLL, и в них есть логика, которая решает делать разные вещи в зависимости от вкуса. Но, говоря, что мне нравится идея использования включаемых файлов! Спасибо.

есть три типа / разновидности нашего продукта, но только один MSI написан на WiX. Когда мы собираем установщик, мы передаем вкус через определенную константу:

Call MSBUILD.bat ..\MSIs\CoreProduct\OurProduct.sln /p:DefineConstants="FLAVOUR=%_Flavour%"

и константа настраивается в Visual Studio, под Build -> Define препроцессорными переменными как FLAVOR = 50. Процесс сборки, принимает значения 50, 200 или LITE в качестве аромата.

В коде WiX у нас есть множество условий для наших компонентов, которые сообщают ему, какой файл устанавливать в зависимости от разновидности; например

      <Component Id="cmp7F45920B1AA100729BAE37FC846B3FC5" Guid="*">
    <File Id="fil238A776D9294E14671E012472F9F7196"
          KeyPath="yes"
          Source="$(var.MenusPath)\ClientListView 200.r5m"  
    <Condition>$(var.FLAVOUR)=200</Condition>
  </Component>

      <Component Id="cmp8BFF42B232724DC4BA5B8F87994DEF21" Guid="*">
    <File Id="fil808D6428D67248DDB8CA65DBC5978283" 
          KeyPath="yes" 
          Source="$(var.MenusPath)\ClientListView Lite.r5m"
    <Condition>$(var.FLAVOUR)=LITE</Condition>
  </Component>

Таким образом, приведенный выше пример установит файл с именем «ClientListView Lite.r5m», если FLAVOR равен LITE, или установит файл с именем «ClientListView 200.r5m», если FLAVOR равен 200.

Это все работает, как и ожидалось, и в течение многих лет!

Но теперь у нас есть веб-версия нашего продукта, и нам нужен zip-файл, содержащий структуру папок и файлы, которые будут установлены для каждого варианта. Я обнаружил, что вы можете запустить MSI из командной строки, используя MSIEXEC и аргумент / a, который затем перенаправит все, что было установлено в папку, и подумал, что это именно то, что я хочу ... но, увы, это не работает, как я ожидал.

Кажется, что он выполняет MSI и извлекает файлы в целевую папку, но он игнорирует аромат, и в результате вы получаете файлы «ClientListView Lite.r5m» и «ClientListView 200.r5m», извлеченные в Папка; что явно не то, что я хочу.

После прочтения документации по MSIEXEC кажется, что вы можете передать значение для свойства Public, например msiexec.exe / a "C: \ Example.msi" MY_PROP = "myValue" - так что я подумал, что это может помочь мне; поэтому в своем коде WiX я добавил строку:

    <Property Id='PRODTYPE' Value="$(var.FLAVOUR)"/>

и затем изменил условия моего компонента так:

  <Component Id="cmp7F45920B1AA100729BAE37FC846B3FC5" Guid="*">
    <File Id="fil238A776D9294E14671E012472F9F7196"
          KeyPath="yes"
          Source="$(var.MenusPath)\ClientListView 200.r5m"  
    <Condition><![CDATA[PRODTYPE=200]]></Condition>
  </Component>

  <Component Id="cmp8BFF42B232724DC4BA5B8F87994DEF21" Guid="*">
    <File Id="fil808D6428D67248DDB8CA65DBC5978283" 
          KeyPath="yes" 
          Source="$(var.MenusPath)\ClientListView Lite.r5m"
    <Condition><![CDATA[PRODTYPE=LITE]]></Condition>
  </Component>

но хотя это скомпилировано нормально, запустив его через:

msiexec /a OurProduct.msi /qb PRODTYPE=200 TARGETDIR="C:\InstalledFiles200"

все еще извлекает оба файла для вкусов 200 & LITE, где я просто хотел получить один для 200.

Итак, я пытаюсь сделать что-то, что невозможно ... или я делаю что-то не так - любая помощь будет с благодарностью, потому что альтернатива имитации процесса в пакетном файле для создания моего почтового индекса; будет ужасно !!

Ура,

Крис.

Ответы на вопрос(3)

Ваш ответ на вопрос