Как определить структуру каталога (путь) для использования в качестве атрибута WorkingDirectory

Я уже успешно создал MSI для PyCharm, потому что установщик не работает должным образом в автоматическом режиме. Итак, у меня был первый успешный опыт работы с WiX.

Теперь у меня есть папка для установки от наших разработчиков. Эта программа должна идти в "C:\ProgramFiles\ Папка A\ Папка B", потому что позже будет другой пакет, который идет в "C:\ProgramFiles\ Папка A\ Папка C"

Итак, вот что я получил (часть этого):

<Directory Id="TARGETDIR" Name="SourceDir">
    <Directory Id="ProgramFilesFolder">
        <Directory Id="APPLICATIONROOTDIRECTORY" Name="Folder A"/>
            <Directory Id="APPLICATIONSUBDIRECTORY" Name="Folder B"/>
    </Directory>

    <Directory Id="ProgramMenuFolder">
        <Directory Id="ApplicationProgramsFolder" Name="Program B"/>
    </Directory>
</Directory>

Я пытаюсь сейчас создать ярлык

<Shortcut Id="ApplicationStartMenuShortcut" Name="Program B" Target="[APPLICATIONSUBDIRECTORY]\Program B.exe" Icon="ProductIcon" WorkingDirectory="APPLICATIONSUBDIRECTORY"/>

Таким образом, я намеревался сделать APPLICATIONSUBDIRECTORY = "C:\ProgramFiles\Folder A\Folder B", но это будет "C:\ProgramFiles\Folder B"

Я нашел это: Установка ярлыка Wix с переменной среды рабочей директории

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

Оставляя это:

<Directory Id="APPLICATIONSUBDIRECTORY" Name="Folder B"/>

и использование APPLICATIONROOTDIRECTORY будет работать, но мне нужен второй слой папок.

Атрибуту Target это тоже не нравится. Использование (комбинация переменных)

Target="[APPLICATIONROOTDIRECTORY]\[APPLICATIONSUBDIRECTORY]\Program B.exe"

не работает но

Target="[APPLICATIONROOTDIRECTORY]\Folder B\Program B.exe"

делает.

Поскольку я новичок в WiX, я все еще пытаюсь определить каталоги. Первые 2 идентификатора каталога объединены, а третий - нет.

    <Directory Id="ProgramFilesFolder">
        <Directory Id="APPLICATIONROOTDIRECTORY" Name="Folder A"/>
            <Directory Id="APPLICATIONSUBDIRECTORY" Name="Folder B"/>
    </Directory>

Это мой командный файл:

@echo off
SET WIXPATH=C:\Program Files (x86)\WiX Toolset v3.11\bin
SET COMPONENTGROUP=MyCompGroup
SET FILEFOLDER=Files
SET FILELIST=FileList
SET MAINFILE=Main
SET MSINAME=Program B.msi

if exist FileList.wxs del FileList.wxs
if exist *.wixobj del *.wixobj
if exist *.wixpdb del *.wixpdb
if exist *.msi del *.msi
if exist *.cab del *.cab
pause

"%wixpath%\heat.exe" dir ".\%FILEFOLDER%" -cg %COMPONENTGROUP% -dr APPLICATIONROOTDIRECTORY -out %FILELIST%.wxs -gg -ke -srd -sfrag -template fragment

"%wixpath%\candle.exe" -arch x86 %MAINFILE%.wxs %FILELIST%.wxs

"%wixpath%\light.exe" -b %FILEFOLDER% -out "%MSINAME%" %MAINFILE%.wixobj %FILELIST%.wixobj

И это структура каталогов для "захвата":

/--Files
/----Program B
/------File1
/------File2

и т.п.

Любая помощь приветствуется. Благодарю.

3 ответа

Глюк в структуре каталогов

Похоже, что есть ошибка в вашей иерархии каталогов. Возможно попытайтесь изменить это, чтобы быть похожим на это как первый шаг:

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

  <Directory Id="ProgramFilesFolder">
    <Directory Id="APPLICATIONROOTDIRECTORY" Name="Folder A">
      <Directory Id="APPLICATIONSUBDIRECTORY" Name="Folder B" />
    </Directory>
  </Directory>

  <Directory Id="ProgramMenuFolder">
    <Directory Id="ApplicationProgramsFolder" Name="Program B" />
  </Directory>

</Directory>

Вы используете Visual Studio? Попробуй идти Edit => Advanced => Format Document когда у вас открыт исходный файл WiX. Посмотрите, как выглядит отступ. Ваши подпапки должны иметь отступ, как показано выше. Если они не отступят, посмотрите на /> записей. Добавляйте их только в том случае, если вы указываете, что больше нет подпапок.

Добавление вашего ярлыка

Что касается вашего ярлыка. Вот как вы можете добавить объявленный ярлык в файл, который вы устанавливаете:

<Shortcut Id="mysc" Advertise="yes" Directory="ApplicationProgramsFolder" 
          Name="My Shortcut" Description="My Shorcut Description" />

Этот элемент ярлыка должен быть добавлен к компоненту, который устанавливает данный файл, например, так:

<Component Id="NOTEPAD.EXE" Feature="ProductFeature">

   <File Source="MyReleaseFiles\NOTEPAD.EXE" />

   <Shortcut Id="mysc" Advertise="yes" Directory="ApplicationProgramsFolder" 
             Name="My Shortcut" Description="My Shorcut Description" />

   <RemoveFolder Id="ApplicationProgramsFolder" On="uninstall"
                 Directory="ApplicationProgramsFolder"/>

</Component>

Visual Studio

Вы можете установить Visual Studio 2017 Community Edition бесплатно - и я рекомендую этот способ сделать MSI-файлы WiX. Вы получаете дополнительную помощь от инструмента, чтобы избежать ошибок, таких как проблема с вашей иерархией каталогов.

Я написал короткий ответ о том, как создать минимальный WiX MSI в стиле "Hello World" с помощью Visual Studio: установщик WiX msi не устанавливает приложение Winform, созданное в Visual Studio 2017.

Возможно, вы захотите переустановить последнюю версию WiX и расширения Visual Studio ( 2017), если вы устанавливаете Visual Studio, чтобы убедиться, что типы и расширения проекта WiX доступны.

В качестве другого обходного пути я смог вчера создать новое свойство, используя настраиваемое действие. Это не верхний регистр специально.

<SetProperty Id="ApplicationFullDirectory" Value="[APPLICATIONROOTDIRECTORY]Folder B" After="CostInitialize" />

Это позволило мне использовать новую переменную / свойство "ApplicationFullDirectory" в элементе ярлыка.

<Shortcut Id="ApplicationStartMenuShortcut" Name="Program B" Target="[ApplicationFullDirectory]\Program B.exe" Icon="ProductIcon" WorkingDirectory="ApplicationFullDirectory"/>

Но все еще учусь:-)

Все еще изучаю, как работает этот форум:-) Для публикации разметки мне нужно использовать "ответ" вместо "комментарий", верно?

Вот как это работает, как писал @Stein Åsmul:

I split every directory element into <Directory> and </Directory> instead of just <Directory />.
I know it's not necessary for the "last" one but just to make it clear for me next time I look at that code :-)

<Directory Id="TARGETDIR" Name="SourceDir">
    <Directory Id="ProgramFilesFolder">
        <Directory Id="APPLICATIONROOTDIRECTORY" Name="Folder A">
            <Directory Id="APPLICATIONSUBDIRECTORY" Name="Folder B">
            </Directory>
        </Directory>
    </Directory>

    <Directory Id="ProgramMenuFolder">
        <Directory Id="ApplicationProgramsFolder" Name="Program B">
        </Directory>
    </Directory>
</Directory>

Ярлык работает так:

<DirectoryRef Id="ApplicationProgramsFolder">
    <Component Id="ApplicationShortcut" Guid="*PUT-IN-GUID*">
        <Shortcut Id="ApplicationStartMenuShortcut" Name="Program B" Target="[APPLICATIONSUBDIRECTORY]\Program B.exe" Icon="ProductIcon" WorkingDirectory="APPLICATIONSUBDIRECTORY"/>
        <RemoveFolder Id="ApplicationProgramsFolder" On="uninstall"/>
        <RegistryValue Root="HKCU" Key="Software\[blabla]\Program B" Name="installed" Type="integer" Value="1" KeyPath="yes"/>
    </Component>
</DirectoryRef>

Это не идеально, но намного лучше, чем копирование всего дерьма с помощью пакетного файла... Было бы еще лучше, если бы наши разработчики использовали WiX вместо того, чтобы предоставлять мне только двоичные файлы для развертывания:-)

Другие вопросы по тегам