Как построить WiX так, чтобы он копировал файлы в зависимости от того, где устанавливается .msi? - PullRequest
3 голосов
/ 11 апреля 2011

Мне нужно создать .msi, используя WiX, который развертывается в нескольких средах. Каждый окр. имеет свой собственный файл конфигурации. Прямо сейчас мы создаем одну msi на среду, и я хочу отойти от этой практики. Есть ли способ создать только один MSI, который будет копировать определенные файлы в зависимости от того, где он работает?

Ответы [ 3 ]

6 голосов
/ 12 апреля 2011

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

Если среда может измениться, необходимо также сделать состояние компонента транзитивным, чтобы при восстановлении \ обновлении был развернут правильный файл конфигурации.

Одна трудность, с которой вы можете столкнуться, состоит в том, что компоненты должны представлять уникальные ресурсы. но, похоже, у вас, вероятно, много разных конфигурационных файлов с одинаковыми именами и предназначенных для одной и той же целевой папки. Возможно, вам будет проще дать вашим файлам конфигурации все разные псевдо-имена и использовать CopyFile для копирования псевдо-версии в конечный пункт назначения.

1 голос
/ 04 июля 2016

В моем случае я объявил свойство, подобное этому:

<Property Id="MACHINE_ENVIRONMENT" Admin="yes" />

С этого момента каждый компонент имеет элемент «Condition», который устанавливается следующим образом:

<Component Id="Log4Net_config" Guid="{666}">
  <Condition>MACHINE_ENVIRONMENT = "dev"</Condition>
  <File Id="Log4Net_config" Source="$(var.dir)\Log4Net.config.$(var.Environment)" Name="Log4Net.config" />
</Component>

Выполнитеустановка через командную строку:

msiexec.exe /i "C:\mymsi.msi" MACHINE_ENVIRONMENT="dev"

Таким образом, мой единственный MSI содержит все различные файлы конфигурации log4net, но устанавливает только соответствующий в зависимости от предоставленного флага.

0 голосов
/ 14 апреля 2011

MSI Таблица файлов требует указания байтового размера устанавливаемого файла, чтобы сделать что-то в зависимости от расположения источника установки, потребуется настраиваемое действие (которое обычно допускает сбой)

См. Мой вопрос Самое простое решение для замены крошечного файла внутри MSI? - я пришел к решению, чтобы создать преобразование MSI (MST). Исходный фрагмент кода, который я разместил, не работает в Windows 7, поэтому вот обновление:

Option Explicit

Const MY_CONFIG = "MyConfigApp.xml"
Const CAB_FILE = "config.cab"
Const MSI = "MyApp.msi"

Dim filesys : Set filesys=CreateObject("Scripting.FileSystemObject")

If filesys.FileExists("temp.tmp") Then filesys.DeleteFile("temp.tmp")
filesys.CopyFile MSI, "temp.tmp"

Dim installer, database, database2, view
Set installer = CreateObject("WindowsInstaller.Installer")
Set database = installer.OpenDatabase ("temp.tmp", 1)
Set database2 = installer.OpenDatabase (MSI, 1)

If Not filesys.FileExists(MY_CONFIG) Then WScript.Quit 2 ' No config file, abort!

Dim objFile, size, result, seq, objCab

' MakeCab object has been depreciated so we fallback to makecab.exe for with Windows 7
On Error Resume Next ' Disable error handling, for a moment
Set objCab = CreateObject("MakeCab.MakeCab.1") 
On Error Goto 0  ' Turn error handling back on

If IsObject(objCab) Then ' Object creation successful - use XP method   
    objCab.CreateCab CAB_FILE, False, False, False
    objCab.AddFile MY_CONFIG, filesys.GetFileName(MY_CONFIG)
    objCab.CloseCab
    Set objCab = Nothing
Else ' object creation failed - try Windows 7 method
    Dim WshShell, oExec
    Set WshShell = CreateObject("WScript.Shell")
    Set oExec = WshShell.Exec("makecab " & filesys.GetFileName(MY_CONFIG) & " " & CAB_FILE)
End If

Set objFile = filesys.GetFile(MY_CONFIG)
size = objFile.Size

Set view = database.OpenView ("SELECT LastSequence FROM Media WHERE DiskId = 1")
view.Execute
Set result = view.Fetch
seq = result.StringData(1) + 1 ' Sequence for new configuration file

Set view = database.OpenView ("INSERT INTO Media (DiskId, LastSequence, Cabinet) VALUES ('2', '" & seq & "', '" & CAB_FILE & "')")
view.Execute

Set view = database.OpenView ("UPDATE File SET FileSize = " & size & ", Sequence = " & seq & ", FileName = 'MYC~2.CNF|MyConfigApp.xml' WHERE File = '" & MY_CONFIG & "'")
view.Execute

database.GenerateTransform database2, "CustomConfig.mst"
database.CreateTransformSummaryInfo database2, "CustomConfig.mst", 0, 0
filesys.DeleteFile("temp.tmp")

Set view = nothing
Set installer = nothing
Set database = nothing
Set database2 = nothing
Set filesys = Nothing
WScript.Quit 0
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...