#installation #wix
Вопрос:
Я читал https://www.firegiant.com/wix/tutorial/getting-started/where-to-install/ но для меня это только половина истории.
Я хочу создать проект установки WIX, который будет включать готовые файлы и устанавливать их в три разные папки. Под «предварительно собранным» я имею в виду, что я не хочу добавлять проект установки WIX в решение VS, которое создает какие-либо файлы для развертывания. Приложение, которое я пытаюсь развернуть, состоит из файлов, созданных C#, C и сторонним кодом/инструментами, не встроенными в проекты Visual Studio.
Кроме того, в конечном итоге я хочу сделать это в конвейере выпуска Azure DevOps / TFS.
У меня есть три конвейера CI, которые публикуют свои результаты в артефактах. В конвейере выпуска я извлекаю опубликованные артефакты и хотел бы «создать» проект WIX, чтобы объединить все артефакты в один установщик MSI. У моего установщика нет, и мне не нужен пользовательский интерфейс.
Хотя в конечном итоге я хочу запустить это в Azure/TFS, я начал с того, что поместил свои файлы в три отдельные подпапки на своем локальном компьютере, чтобы доказать проект: моя проблема в том, что мои файлы устанавливаются в разные папки.
- .артефактыЭлементы управления приложениями
- .артефактыСервер приложений
- .артефактыЭкраны приложений
У меня есть файл Product.wxs, и я использую heat.exe для создания 3 дополнительных файлов wxs, по одному для каждой из вышеперечисленных папок.
- AppControls.wxs
- AppServer.wxs
- Экраны приложений.wxs
Я использую сценарий PowerShell в событии предварительной сборки в проекте WIX, чтобы найти три папки, как если бы они были запущены в агенте сборки TFS, а затем запустить heat в каждой папке для создания вышеуказанных файлов wxs. В настоящее время я не использую шаблон преобразования с heat.exe, но будет, если понадобится.
В файле Product.wxs: .. ..
<Feature Id="AppServer" Title="App Server" Level="1">
<ComponentGroupRef Id="AppControlsGroup" />
<ComponentGroupRef Id="AppServerGroup">
<ComponentGroupRef Id="AppScreensGroup" />
</Feature>
...
<Property Id="SCREENDIRFOUND">
<DirectorySearch Id="SCREENDIR" Path="E:PROJECTSAPP" Depth="2" AssignToProperty="yes">
<FileSearch Id="RUNSCREEN" Name="APP_Monitor.cimrt" />
</DirectorySearch>
</Property>
</Product>
...
<!-- Step 1: Define the directory structure -->
<Fragment>
<Directory Id="TARGETDIR" Name="SourceDir">
<Directory Id="ProgramFilesFolder" Name="PFiles">
<Directory Id="MFG" Name="Mfg">
<Directory Id="INSTALLDIR" Name="APP" />
</Directory>
</Directory>
</Directory>
DirectorySearch / Поиск файлов работает и устанавливает мое свойство в правильную папку, но я не могу понять, как использовать это свойство в качестве расположения папки для файлов/компонентов.
Я говорю, что это работает на основе содержимого файла журнала, который я создал, когда запускал msiexec.
MSI (c) (58:9C) [16:13:02:742]: Doing action: AppSearch
MSI (c) (58:9C) [16:13:02:742]: Note: 1: 2205 2: 3: ActionText
Action start 16:13:02: AppSearch.
MSI (c) (58:9C) [16:13:02:743]: Note: 1: 1322 2:
MSI (c) (58:9C) [16:13:02:743]: Note: 1: 1325 2: APP_Monitor.cimrt
MSI (c) (58:9C) [16:13:02:743]: Note: 1: 1325 2: APP_Monitor.cimrt
MSI (c) (58:9C) [16:13:02:743]: PROPERTY CHANGE: Adding SCREENDIR property. Its value is 'E:PROJECTSAPPAppSiteNameScreens'.
Action ended 16:13:02: AppSearch. Return value 1.
MSI (c) (58:9C) [16:13:02:743]: Doing action: LaunchConditions
«AppSiteName» is the part of the path that varies. It is not in any environment variable or the registry. I could create an INI file prior to install, but I expect I would have the same challenge using the result of an INI search.
I want to install the new screen files into the folder the value of the SCREENDIR property.
I don’t know how or where to use SCREENDIR ?
I have been doing a lot of trial and error, manually manipulating the AppScreens.wxs file and then planning to automate it if I got something working.
<?xml version="1.0" encoding="utf-8"?>
<Wix xmlns="http://schemas.microsoft.com/wix/2006/wi">
<Fragment>
<ComponentGroup Id="AppScreensGroup" Directory="SCREENDIR">
<Component Id="compApp_Config.cimrt" Guid="22E9F025-....heat generated">
<File Id="fileApp_Config.cimrt" KeyPath="yes" Source="D:TFSAPPartifactsAppScreensAPP_Config.cimrt" />
</Component>
<Component Id="compApp_Monitor.cimrt" Guid="56DF9438-....heat generated">
<File Id="fileGEP_Diagnostic.cimrt" KeyPath="yes" Source="D:TFSAPPartifactsAppScreensAPP_Monitor.cimrt" />
</Component>
... more files.
</ComponentGroup>
</Fragment>
</Wix>
I manually added comp and file prefix to the Component Id and File Id in my trial and errors. It hasn’t helped. How to use SCREENDIR is what I am focused on, and not even sure if it should go in the AppScreens.wxs file.
In searching/reading I read that SCREENDIR is a property, and not a folder. There was an example that used SetDirectoryID.
I tried to add :
<SetDirectory Id="SCREENDIR" Value="[SCREENDIRPROPERTY]"/>
In my Product.wxs file, changing my DirectorySearch Id=»SCREENDIRPROPERTY», but I failed with that.
I also had problems using $(env.CIMPATH) to direct where the files harvested into AppServer.wxs. I removed to focus on the SCREENDIR, hoping if I could get one working I would understand what was needed for the other.
My heat command looks like this:
heat.exe dir D:TFSAPPartifactsAppScreens -var SourcePathScreens -dr SCREENDIR -cg AppScreensGroup -gg -g1 -scom -sreg -srd -suid -out AppScreens.wxs
I then run a Powershell command ( -replace ) to put the literal absolute path in place of $(SourcePathScreens). I had mixed luck using environment variables reliably on both my local machine and the remote TFS Build Agent. I decided that the PowerShell would have to find the source folder and either set an Environment variable for WIX, or just insert the path into the wxs file before the build of the MSI. Inserting the literal path seems like a more reliable solution.
In many iterations of trial and error, I have modified the resulting AppScreen.wxs file and commented out the prebuild event. The example above of AppScreens.wxs is what I am using now.
My build currently fails with Unresolved reference to symbol ‘Directory:SCREENDIR’ in section ‘Fragment:’. in the AppScreens.wxs file.
Previously, I got a build to work but got an error when performing the install.
MSI (c) (18:6C) [16:09:25:022]: Note: 1: 2205 2: 3: MsiAssembly
MSI (c) (18:6C) [16:09:25:022]: Note: 1: 2716 2: APP_Config.cimrt
MSI (c) (18:6C) [16:09:25:022]: Note: 1: 2262 2: Error 3: -2147287038
DEBUG: Error 2716: Couldn't create a random subcomponent name for component 'APP_Config.cimrt'.
MSI (c) (18:B4) [16:09:25:029]: Font created. Charset: Req=0, Ret=0, Font: Req=MS Shell Dlg, Ret=MS Shell Dlg
MSI (c) (18:6C) [16:09:28:036]: Note: 1: 2262 2: Error 3: -2147287038
MSI (c) (18:6C) [16:09:28:036]: Product: APP Server -- The installer has encountered an unexpected error installing this package. This may indicate a problem with this package. The error code is 2716. The arguments are: APP_Config.cimrt,
I am lost as how to use DirectorySearch / FileSearch.