WiX: При uninstall не удаляет каталог прог. из-за orphaned
От: amihal  
Дата: 11.01.08 10:57
Оценка:
Добрый день!

Есть проблема с MSI/WiX. Есть программа, структура ее каталогов следующая:
".\Program Files\PROG\" — каталог программы, создается инсталлятором
".\Program Files\PROG\DATA\" — каталог с данными, создается только программой, должен удаляться инсталлятором при удалении программы
(*** Я в курсе, что для данных существует APPDATA, что не хорошо писать данные в подкаталоги "Program Files", но это программа для системных администраторов).

Проблема в следующем. Написал xml для WiX, который удаляет orphaned files в каталоге DATA и удаляет сам этот каталог. Но, похоже, удаление этих файлов и каталога DATA происходит по времени уже ПОСЛЕ того, как сам инсталлятор (msi) пытался удалить каталог программы. Как итог этого: каталог самой программы инсталлятор, конечно, удалить не смог, так как в нем еще был подкаталог DATA. Подкаталог DATA позже удалился моими стараниями. Но удалять каталог программы больше никто не пытается. Как поменять (и нужно ли) порядок удаления? Чтобы orphaned files удалялись ДО того момента, как инсталлятор начинает удалять проинсталлированные им файлы и каталоги.

Код для WiX:
<Directory Id="TARGETDIR" Name="SourceDir">
  <?include $(var.COMMONDIR)\toolkit.wxi?>
  <Directory Id="ProgramMenuFolder" Name="PMenu">
    <Directory Id="ProgramsCompanyName" Name="$(var.COMPANY_DIR_SHORT)" LongName="$(var.COMPANY_DIR)" />
  </Directory>
  <Directory Id="ProgramFilesFolder" Name="PFiles">
    <Directory Id="CompanyDir" Name="$(var.COMPANY_DIR_SHORT)" LongName="$(var.COMPANY_DIR)">
      <Directory Id="INSTALLDIR" Name="$(var.PROG_PROG_DIR)">
        <?include $(var.COMMONDIR)\ms_libs1.wxi?>
        <Component Id="PCComponent" Guid="!GUID1!" DiskId="1">
          <File Id="prog.exe" Name="prog.exe" Source="prog.exe" Vital="yes">
            <Shortcut Id="PROG_ShortCut" Directory="ProgramsCompanyName" Name="$(var.PROG_VSHORT)" LongName="$(var.PROG_LNK)" Description="$(var.PROG_LNK_DESC)" WorkingDirectory="TARGETDIR" />
          </File>
          <File Id="prog_gui.dll" Name="prog_gui.dll" Source="prog_gui.dll" Vital="yes" />
          <File Id="prog_krn.dll" Name="prog_krn.dll" Source="prog_krn.dll" Vital="yes" />
        </Component>

        <Directory Id="DataDir" Name="DATA">
          <Component Id="RemoveConfigs" Guid="!GUID2!">
            <RemoveFile Id="progdata.bin" Name="progdata.bin" On="uninstall" />
            <RemoveFolder Id="DataDir" On="uninstall" />
          </Component>
        </Directory> <!-- DataDir -->

      </Directory>
    </Directory>
  </Directory>
</Directory>

<Feature Id="PCFeature" Title="$(var.PROG_SHORT)" Description="This is a feature description" Level="1" ConfigurableDirectory="INSTALLDIR">
  <ComponentRef Id="PCComponent" />
  <ComponentRef Id="Toolkit" />
</Feature>

<Feature Id="RemoveConfigsFeature" Title="Remove config files" Level="1" Display="hidden">
  <ComponentRef Id="RemoveConfigs" />
</Feature>
Re: WiX: При uninstall не удаляет каталог прог. из-за orphan
От: bnk СССР http://unmanagedvisio.com/
Дата: 12.01.08 15:53
Оценка:
Здравствуйте, amihal, Вы писали:

A>Проблема в следующем. Написал xml для WiX, который удаляет orphaned files в каталоге DATA и удаляет сам этот каталог. Но, похоже, удаление этих файлов и каталога DATA происходит по времени уже ПОСЛЕ того, как сам инсталлятор (msi) пытался удалить каталог программы. Как итог этого: каталог самой программы инсталлятор, конечно, удалить не смог, так как в нем еще был подкаталог DATA. Подкаталог DATA позже удалился моими стараниями. Но удалять каталог программы больше никто не пытается. Как поменять (и нужно ли) порядок удаления? Чтобы orphaned files удалялись ДО того момента, как инсталлятор начинает удалять проинсталлированные им файлы и каталоги.


Попробуй вот так:
        <!-- ля-ля-ля -->
 
        <Directory Id="DataDir" Name="DATA">
          <Component Id="RemoveConfigs" Guid="!GUID2!">
            <RemoveFile Id="progdata.bin" Name="progdata.bin" On="uninstall" />
            <RemoveFolder Id="DataDir" On="uninstall" />

            <RemoveFolder Id="RemoveCompanyDir" Directory="CompanyDir" On="uninstall" /> <!-- вот эту строчку добавить -->

          </Component>
        </Directory>
Re[2]: WiX: При uninstall не удаляет каталог прог. из-за orp
От: bnk СССР http://unmanagedvisio.com/
Дата: 12.01.08 16:02
Оценка:
Упс. Не заметил что там директории вложенные.
Тогда так:

        <!-- ля-ля-ля -->
 
        <Directory Id="DataDir" Name="DATA">
          <Component Id="RemoveConfigs" Guid="!GUID2!">
            <RemoveFile Id="progdata.bin" Name="progdata.bin" On="uninstall" />
            <RemoveFolder Id="DataDir" On="uninstall" />

            <RemoveFolder Id="RemoveINSTALLDIR" Directory="INSTALLDIR" On="uninstall" /> <!-- добавить -->
            <RemoveFolder Id="RemoveCompanyDir" Directory="CompanyDir" On="uninstall" /> <!-- добавить -->

          </Component>
        </Directory>
Re[2]: WiX: При uninstall не удаляет каталог прог. из-за orp
От: amihal  
Дата: 15.01.08 08:04
Оценка:
Здравствуйте, bnk, Вы писали:

bnk> Попробуй вот так:

bnk>
bnk>        <!-- ля-ля-ля -->
 
bnk>        <Directory Id="DataDir" Name="DATA">
bnk>          <Component Id="RemoveConfigs" Guid="!GUID2!">
bnk>            <RemoveFile Id="progdata.bin" Name="progdata.bin" On="uninstall" />
bnk>            <RemoveFolder Id="DataDir" On="uninstall" />

bnk>            <RemoveFolder Id="RemoveCompanyDir" Directory="CompanyDir" On="uninstall" /> <!-- вот эту строчку добавить -->

bnk>          </Component>
bnk>        </Directory> 
bnk>

Так работать-то может и будет, но это совершенно неправильно так делать. Т.е. это из разряда "под..чудить". Не нужно выполнять работу за MSI-installer там, где он ее должен выполнять самостоятельно. Ведь с тем же успехом можно было бы самому удалять и все установленные файлы, каталоги, ключи реестра, и скатились бы мы в итоге к системе bat-ничков. Нужно как-то это сделать правильно, в рамках MSI.

Такое же решение, может и будет работать (даже уверен в этом), но это неправильно.
Re[3]: WiX: При uninstall не удаляет каталог прог. из-за orp
От: bnk СССР http://unmanagedvisio.com/
Дата: 15.01.08 08:28
Оценка:
Здравствуйте, amihal, Вы писали:

A>Такое же решение, может и будет работать (даже уверен в этом), но это неправильно.


А загонять DATA в Program Files значит правильно?
Так что или шашечки или ехать
Re[4]: WiX: При uninstall не удаляет каталог прог. из-за orp
От: amihal  
Дата: 15.01.08 08:37
Оценка:
A>> Такое же решение, может и будет работать (даже уверен в этом), но это неправильно.
bnk> А загонять DATA в Program Files значит правильно?
bnk> Так что или шашечки или ехать

Аргумент в некотором смысле по делу, конечно. Но as is. Хотелось бы решить как-то изящнее (читай — правильно).
Re[5]: WiX: При uninstall не удаляет каталог прог. из-за orp
От: bnk СССР http://unmanagedvisio.com/
Дата: 15.01.08 08:47
Оценка:
Здравствуйте, amihal, Вы писали:

A>Аргумент в некотором смысле по делу, конечно. Но as is. Хотелось бы решить как-то изящнее (читай — правильно).


Ну а чего, лично я бы так и сделал наверное.
Все вроде в рамках Windows Installer, должно валидироваться. RemoveFolder — просто строчка в таблице, тоже вроде не криминал..
Re[6]: WiX: При uninstall не удаляет каталог прог. из-за orp
От: amihal  
Дата: 21.01.08 15:28
Оценка:
Здравствуйте!

A>> Аргумент в некотором смысле по делу, конечно. Но as is. Хотелось бы решить как-то изящнее (читай — правильно).

bnk> Ну а чего, лично я бы так и сделал наверное.
bnk> Все вроде в рамках Windows Installer, должно валидироваться. RemoveFolder — просто строчка в таблице, тоже вроде не криминал..

Решил попробовать — не работает. Удивился.

Вот фрагмент:

<Directory Id="ProgramFilesFolder" Name="PFiles">
  <Directory Id="CompanyDir" Name="$(var.COMPANY_DIR_SHORT)" LongName="$(var.COMPANY_DIR)">
    <Directory Id="INSTALLDIR" Name="$(var.PROG_DIR)">
      <Directory Id="DataDir" Name="DATA">
        <Directory Id="DataStorageDir" Name="FS" LongName="DataStorage">
          <Component Id="RemoveDataStorage" Guid="!GUID1!">
            <RemoveFile Id="DataStorageFiles" Name="*.*" On="uninstall" />
            <RemoveFolder Id="DataStorageDir" On="uninstall" />
          </Component>
        </Directory> <!-- ".\PROG\DATA\DataStorage" -->
        <Component Id="RemoveConfigs" Guid="!GUID2!">
          <RemoveFile Id="progcfg.bin" Name="progcfg.bin" On="uninstall" />
          <RemoveFile Id="progdata.bin" Name="progdata.bin" On="uninstall" />
          <RemoveFolder Id="DataDir" On="uninstall" />
          <RemoveFolder Id="INSTALLDIR" On="uninstall" />
          <RemoveFolder Id="CompanyDir" On="uninstall" />
        </Component>
      </Directory> <!-- ".\PROG\DATA" -->
[...]

Вот лог:

RemoveEnvironmentStrings: Name: Updating environment strings, Value: , Action 
Action ended 18:20:26: RemoveEnvironmentStrings. Return value 1.
MSI (s) (E0:14) [18:20:26:742]: Doing action: RemoveFiles
MSI (s) (E0:14) [18:20:26:742]: Note: 1: 2205 2:  3: ActionText 
Action 18:20:26: RemoveFiles. Removing files
Action start 18:20:26: RemoveFiles.
RemoveFiles: File: Removing files, Directory: 
MSI (s) (E0:14) [18:20:26:758]: Counted 4 foreign folders to be removed.
MSI (s) (E0:14) [18:20:26:758]: Removing child folder of C:\Program Files\CompanyName\PROG\DATA\ (child: C:\Program Files\CompanyName\PROG\DATA\DataStorage\)
MSI (s) (E0:14) [18:20:26:758]: Removing foreign folder: C:\Program Files\CompanyName\PROG\DATA\DataStorage\
MSI (s) (E0:14) [18:20:26:758]: Removing foreign folder: C:\Program Files\CompanyName\PROG\DATA\
MSI (s) (E0:14) [18:20:26:758]: Removing foreign folder: C:\Program Files\CompanyName\PROG\DATA\
MSI (s) (E0:14) [18:20:26:774]: Removing foreign folder: C:\Program Files\CompanyName\PROG\DATA\
Action ended 18:20:26: RemoveFiles. Return value 1.
MSI (s) (E0:14) [18:20:26:774]: Doing action: InstallFiles
MSI (s) (E0:14) [18:20:26:774]: Note: 1: 2205 2:  3: ActionText 
Action 18:20:26: InstallFiles. Copying new files
Action start 18:20:26: InstallFiles.

Результат: присутствуют пустые каталоги C:\Program Files\CompanyName\PROG\ (внутри ни файлов, ни подкаталогов нет).
Re[7]: WiX: При uninstall не удаляет каталог прог. из-за orp
От: bnk СССР http://unmanagedvisio.com/
Дата: 21.01.08 19:37
Оценка:
Здравствуйте, amihal, Вы писали:

A>Решил попробовать — не работает. Удивился.


Неправильно написал?

У тебя:
<RemoveFolder Id="INSTALLDIR" On="uninstall" />
<RemoveFolder Id="INSTALLDIR" On="uninstall" />

У меня было:
<RemoveFolder Id="RemoveINSTALLDIR" Directory="INSTALLDIR" On="uninstall" />
<RemoveFolder Id="RemoveCompanyDir" Directory="CompanyDir" On="uninstall" />
Re[8]: WiX: При uninstall не удаляет каталог прог. из-за orp
От: amihal  
Дата: 22.01.08 10:11
Оценка:
A>> Решил попробовать — не работает. Удивился.
bnk> Неправильно написал?
Да, был невнимателен. Исправил — заработало. Большое спасибо.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.