Вопрос следующего содержания...
Использую Wix 3, очень нужно сделать так, что бы инсталлятор цеплял файл, который просто лежит рядом с msi, что бы в дальнейшем не меняя инсталятор можно было заменять этот файл на более новый. как?
Здравствуйте, Lexa-Lexa, Вы писали:
LL>Доброго времени суток всем.
LL>Вопрос следующего содержания... LL>Использую Wix 3, очень нужно сделать так, что бы инсталлятор цеплял файл, который просто лежит рядом с msi, что бы в дальнейшем не меняя инсталятор можно было заменять этот файл на более новый. как?
Люди добрые , ну помогите... тяжело с Wix разобраться с ходу то.
Суть в общем:
если рядом с msi лежит base.dat (база данных) при установке кинуть его в CommonAppData папочку (сзаменой существующего), если не лежит — установить прогу без него (предпологается что в этом случае base.dat уже есть у пользователя).
Думаю, можно ли организовать это чере CustomAction (на C# dll )и написать соответствующую код, реально ли?
Здравствуйте, Lexa-Lexa, Вы писали:
LL>Здравствуйте, Lexa-Lexa, Вы писали:
LL>>Доброго времени суток всем.
LL>>Вопрос следующего содержания... LL>>Использую Wix 3, очень нужно сделать так, что бы инсталлятор цеплял файл, который просто лежит рядом с msi, что бы в дальнейшем не меняя инсталятор можно было заменять этот файл на более новый. как?
LL>Люди добрые , ну помогите... тяжело с Wix разобраться с ходу то. LL>Суть в общем: LL>если рядом с msi лежит base.dat (база данных) при установке кинуть его в CommonAppData папочку (сзаменой существующего), если не лежит — установить прогу без него (предпологается что в этом случае base.dat уже есть у пользователя). LL>Думаю, можно ли организовать это чере CustomAction (на C# dll )и написать соответствующую код, реально ли?
Добавь атрибут Compressed="no" к элементу File, который описывает данный файл. Тогда он не будет включен в состав msi-пакета, а будет лежать с ним.
Здравствуйте, Lexa-Lexa, Вы писали:
LL>>Доброго времени суток всем.
LL>>Вопрос следующего содержания... LL>>Использую Wix 3, очень нужно сделать так, что бы инсталлятор цеплял файл, который просто лежит рядом с msi, что бы в дальнейшем не меняя инсталятор можно было заменять этот файл на более новый. как?
LL>Люди добрые , ну помогите... тяжело с Wix разобраться с ходу то. LL>Суть в общем: LL>если рядом с msi лежит base.dat (база данных) при установке кинуть его в CommonAppData папочку (сзаменой существующего), если не лежит — установить прогу без него (предпологается что в этом случае base.dat уже есть у пользователя). LL>Думаю, можно ли организовать это чере CustomAction (на C# dll )и написать соответствующую код, реально ли?
Вам конечно поможет такая конструкция
<Component Id="base.dat" Guid="{XXX}">
<CopyFile Id="CopyExternalFile" SourceName="base.dat" SourceProperty="SourceDir" DestinationName="base.dat" DestinationDirectory="CommonAppData"/>
</Component>
Здравствуйте, -af, Вы писали:
-af>Вам конечно поможет такая конструкция -af><Component Id="base.dat" Guid="{XXX}"> -af> <CopyFile Id="CopyExternalFile" SourceName="base.dat" SourceProperty="SourceDir" DestinationName="base.dat" DestinationDirectory="CommonAppData"/> -af></Component>
-af>но прежде чем вставить это подумайте как у Вас будет работать reinstall -af>(наверно при reinstall нужно будет требовать оригинальный msi, -af>тут вам пригодиться ResolveSource Action http://msdn.microsoft.com/en-us/library/aa371232(VS.85).aspx).
спасибо большое. Постараюсь покопать в эту сторону. Но мне нужен достаточно хитрый механизм работы с этим файлом и я уже начал писать custom action на C# который позволит выполнить все действия. Ну и понятное дело возникли вопросы :
1. Как можно в custom action определить место, где лежит дистрибутив?
2. Если например в custom action возникнет ошибка как сделать что бы установщик сказал? "не удается скопировать файл. Повторить/отмена"
3. Как можно в custom action определить суть процесса: install, reinstall, deinstallation
Здравствуйте, Lexa-Lexa, Вы писали:
LL>Здравствуйте, -af, Вы писали:
-af>>Вам конечно поможет такая конструкция -af>><Component Id="base.dat" Guid="{XXX}"> -af>> <CopyFile Id="CopyExternalFile" SourceName="base.dat" SourceProperty="SourceDir" DestinationName="base.dat" DestinationDirectory="CommonAppData"/> -af>></Component>
-af>>но прежде чем вставить это подумайте как у Вас будет работать reinstall -af>>(наверно при reinstall нужно будет требовать оригинальный msi, -af>>тут вам пригодиться ResolveSource Action http://msdn.microsoft.com/en-us/library/aa371232(VS.85).aspx).
LL>спасибо большое. Постараюсь покопать в эту сторону. Но мне нужен достаточно хитрый механизм работы с этим файлом и я уже начал писать custom action на C# который позволит выполнить все действия. Ну и понятное дело возникли вопросы : LL>1. Как можно в custom action определить место, где лежит дистрибутив? LL>2. Если например в custom action возникнет ошибка как сделать что бы установщик сказал? "не удается скопировать файл. Повторить/отмена" LL>3. Как можно в custom action определить суть процесса: install, reinstall, deinstallation
LL>вот такой я любознательный заранее спасибо
Ну зачем Вы пытаетесь усложнить себе жизнь, и по сути изобрести велосипед (не забудте, кстати, что Вам RollBack еще потдерживать, чтобы велосипед ездил . Managed кастом акция, в даном случае это не к селу ни к городу.
Да и если к указаному примеру кода добавить условия, в которых фигрирует BASE_SOURCE и BASE_DESTINATION, то у вас все 3 пункта выполнятся.
Ответы на Ваши вопросы зависят как вы пишите ManagedCA, используя Deployment Tools Foundation или System.Configuration.Install
Спасибо! буду копать!
-af>.... чтобы велосипед ездил
А велосипед я люблю, снег дотает и поеду
-af>ps, пишите хороший сетап, подумайте о людях, для кого Вы пишите.
Да... я уже призадумался, и сильно, после того как мой старый сетап уже 100 раз преподнес сюрпризов пользователям. Но он правда не был на wix , а был написан просто дефолтным студийным способом
В общем у меня ща есть в .wxs:
<Binary Id="CopyBase" SourceFile="..\CustomActions.CA.dll" />
<CustomAction Id="DoCopyBase" BinaryKey="CopyBase" DllEntry="CustomActionCopyBase" />
<InstallExecuteSequence>
...
<Custom Action="DoCopyBase" After="InstallFinalize"></Custom>
...
а в .cs :
namespace CustomActions
{
public class CustomActions
{
[CustomAction]
public static ActionResult CustomActionCopyBase(Session session)
{
у session нет и половины того, о чем пишут
и кроме того как я выяснил экшн вызывается тока при установке, при исправлении или удалении — нет, почему?
Здравствуйте, Lexa-Lexa, Вы писали:
LL>Извините конечно за навязчивость... LL>может дело и в том что я первый день работаю, а до этого болел неделю... но..
-af>>Ответы на Ваши вопросы зависят как вы пишите ManagedCA, используя Deployment Tools Foundation или System.Configuration.Install LL>в vs 2008 проект-новый-wix-C# custom action, как то так. И на чем я пишу? ))))
-af>>1 -> http://msdn.microsoft.com/en-us/library/aa371857(VS.85).aspx -af>>2 -> http://msdn.microsoft.com/en-us/library/aa371672(VS.85).aspx -af>>3 -> http://msdn.microsoft.com/en-us/library/aa371645(VS.85).aspx -af>>http://msdn.microsoft.com/en-us/library/aa371648(VS.85).aspx LL>Посмотрел, здорово, токо в упор не пойму как заюзать ComponentCurrentState, нет у объекта session такого ))))
LL>В общем у меня ща есть в .wxs: LL><Binary Id="CopyBase" SourceFile="..\CustomActions.CA.dll" /> LL><CustomAction Id="DoCopyBase" BinaryKey="CopyBase" DllEntry="CustomActionCopyBase" /> LL><InstallExecuteSequence> LL> ... LL> <Custom Action="DoCopyBase" After="InstallFinalize"></Custom> LL>...
LL>а в .cs : LL>namespace CustomActions LL>{ LL> public class CustomActions LL> { LL> [CustomAction] LL> public static ActionResult CustomActionCopyBase(Session session) LL> { LL>у session нет и половины того, о чем пишут
LL>и кроме того как я выяснил экшн вызывается тока при установке, при исправлении или удалении — нет, почему?
LL>в vs 2008 проект-новый-wix-C# custom action, как то так. И на чем я пишу? ))))
Вы используете Deployment Tools Foundation , он с wix поставляется.
Очень плохо делать что-то (изменяющее систему) после InstallFinalize, после него можно только редми показывать.
Правильно использовать Deffered или Commit кастом акцию http://msdn.microsoft.com/en-us/library/aa368268.aspx.
LL>Посмотрел, здорово, токо в упор не пойму как заюзать ComponentCurrentState, нет у объекта session такого ))))
в DTF есть такой класс ComponentInfo, он вам поможет.
Еще раз повторюсь, очень плохая архитектура у Вас.
ps.
Но для счастья своего не бери себе его:
Много, много непокоя принесет оно с собою
Спасибо... копаю...
-af>Еще раз повторюсь, очень плохая архитектура у Вас. -af>ps. -af> Но для счастья своего не бери себе его: -af> Много, много непокоя принесет оно с собою
может предложите правильную?
Постараюсь ясно описать суть всего.
Приложение работает с бд (base.dat).
Устанавливается с CD диска.
А обновлятся должно уметь:
1. через интернет (обновляется как ПО так и информация в БД) — это все отличненько работает
2. через MSI (тут начинаются запары)
2.1 у некоторых клиентов программу ставит сисадмин, соотв у пользователей нет прав на обновление ПО, они спокойненько обновляют только БД. Когда появляется обновление ПО сисадмин скачивает новый msi (без base.dat — он большой) и запускает процесс обновления через GPO.
Тут ес-но у пользователя должна остаться его base.dat нетронутая, а рядом с msi скорее всего файла base.dat и лежать не должно.
2.2 некоторым пользователям обновления программы приходят на новом CD (соотв. обновленный msi и новая base.dat) — здесь инсталятор должен заменить ПО + base.dat[/b] тоже!
3. при repear инсталяции соответственно base.dat вообще не должен трогаться...
Вроде так. Ну и простой вывод отсюда напрашивается: есть base.dat рядом с msi — скопируй и замени, нет — не трогай
Здравствуйте, Lexa-Lexa, Вы писали:
LL>может предложите правильную?
Ну Вы даете!!! Ведь все написал, и примеры привел. Что же еще нужно? Готовую реализацию?
Хорошо, не поленюсь скопировать из предыдущего + добавлю, пожалуй, удаление при uninstall.
Здравствуйте, -af, Вы писали:
-af>Здравствуйте, Lexa-Lexa, Вы писали:
LL>>может предложите правильную?
-af>Ну Вы даете!!! Ведь все написал, и примеры привел. Что же еще нужно? Готовую реализацию? -af>Хорошо, не поленюсь скопировать из предыдущего + добавлю, пожалуй, удаление при uninstall.
.....
Спасибо это все работает. Но кроме одного случая
Представим, что есть инсталятор с версией 1.0.0 и 1.1.0. Причем инсталятор 1.1.0 даем пользователю без базы данных.
В нем строки: <RemoveExistingProducts After="InstallInitialize" /> — т.е. удаляется версия 0.. а она за собой и базу подтирает, а новый уже не ставит...
Если написать <RemoveExistingProducts After="InstallFinalize" /> — база не удаляется уже, но так она не будет инсталятором 2 заменяться, если будет присутствовать...
Как вывод, конечно, можно не удалять файл базы инсталятором, но тут проблема снова. Если файл присутствует, то он не перезаписывается новым, а мне надо!
Здравствуйте, Lexa-Lexa, Вы писали:
LL>Спасибо это все работает. Но кроме одного случая LL>Представим, что есть инсталятор с версией 1.0.0 и 1.1.0. Причем инсталятор 1.1.0 даем пользователю без базы данных. LL>В нем строки: <RemoveExistingProducts After="InstallInitialize" /> — т.е. удаляется версия 0.. а она за собой и базу подтирает, а новый уже не ставит... LL>Если написать <RemoveExistingProducts After="InstallFinalize" /> — база не удаляется уже, но так она не будет инсталятором 2 заменяться, если будет присутствовать...
LL>Как вывод, конечно, можно не удалять файл базы инсталятором, но тут проблема снова. Если файл присутствует, то он не перезаписывается новым, а мне надо!
При <RemoveExistingProducts After="InstallInitialize" /> Вы можете не удалять при Upgrade (используйте UPGRADINGPRODUCTCODE)
При <RemoveExistingProducts After="InstallFinalize" /> Вы можете предварительно удалить (используйте BASE_DESTINATION AND BASE_SOURCE см. ответ 4, и тот же RemoveExternalFile)
Здравствуйте, -af, Вы писали:
-af>При <RemoveExistingProducts After="InstallInitialize" /> Вы можете не удалять при Upgrade (используйте UPGRADINGPRODUCTCODE) -af>При <RemoveExistingProducts After="InstallFinalize" /> Вы можете предварительно удалить (используйте BASE_DESTINATION AND BASE_SOURCE см. ответ 4, и тот же RemoveExternalFile)
Попробовал сделать так:
<Component Id="BaseOldRemove" Guid="{6BF1952F-A607-4eb6-9605-AFE720E56343}">
<Condition>(UPGRADINGPRODUCTCODE AND BASE_SOURCE) OR NOT UPGRADINGPRODUCTCODE</Condition>
<RemoveFile Id="RemoveExternalFile" Name="base.txt" On="uninstall"></RemoveFile>
</Component>
т.е. я понимаю так: удалить если обновляем и есть новый файл-база или удалить если не обновляем (т.е. видимо удаляем))))
это с <RemoveExistingProducts After="InstallInitialize" />
не работает удаляется файл в случае обновления и отсутствия нового файла — я уже на него похож
Здравствуйте, Lexa-Lexa, Вы писали:
LL>Здравствуйте, -af, Вы писали:
-af>>При <RemoveExistingProducts After="InstallInitialize" /> Вы можете не удалять при Upgrade (используйте UPGRADINGPRODUCTCODE) -af>>При <RemoveExistingProducts After="InstallFinalize" /> Вы можете предварительно удалить (используйте BASE_DESTINATION AND BASE_SOURCE см. ответ 4, и тот же RemoveExternalFile)
LL>Попробовал сделать так: LL><Component Id="BaseOldRemove" Guid="{6BF1952F-A607-4eb6-9605-AFE720E56343}"> LL> <Condition>(UPGRADINGPRODUCTCODE AND BASE_SOURCE) OR NOT UPGRADINGPRODUCTCODE</Condition> LL> <RemoveFile Id="RemoveExternalFile" Name="base.txt" On="uninstall"></RemoveFile> LL></Component>
LL>т.е. я понимаю так: удалить если обновляем и есть новый файл-база или удалить если не обновляем (т.е. видимо удаляем)))) LL>это с <RemoveExistingProducts After="InstallInitialize" />
LL>не работает удаляется файл в случае обновления и отсутствия нового файла — я уже на него похож
Вы написали следующее:
компонента BaseOldRemove устанавливается если выполнено условие (UPGRADINGPRODUCTCODE AND BASE_SOURCE) OR NOT UPGRADINGPRODUCTCODE,
файл удаляется всегда при удалении этой компоненты (если компонента не была установлена, файл не удалять).
предварительные тесты проказали что работает, причем именно так как мне надо....
За исключением 1-го если в инсталяторе выбрать пункт Исправить Установку, то файл бд удаляется )) происходжит это я так понимаю из-за того, что выделено жирным... что там правильно то писать? нужно условие — УДАЛЕНИЕ (не восстановление, не обновление а именно финальное удаление продукта)
LL>предварительные тесты проказали что работает, причем именно так как мне надо.... LL>За исключением 1-го если в инсталяторе выбрать пункт Исправить Установку, то файл бд удаляется )) происходжит это я так понимаю из-за того, что выделено жирным... что там правильно то писать? нужно условие — УДАЛЕНИЕ (не восстановление, не обновление а именно финальное удаление продукта)
да нужно заменить NOT UPGRADINGPRODUCTCODE на REMOVE=ALL AND NOT UPGRADINGPRODUCTCODE
хм... а при установке удаленной через политики GPO как себя данная конструкцуия будет вести? есть принципиальные отличия? почему то у меня файлик не скопировался... может быть я как то не так политику GPO назначил?
Здравствуйте, Lexa-Lexa, Вы писали: LL>хм... а при установке удаленной через политики GPO как себя данная конструкцуия будет вести? есть принципиальные отличия? почему то у меня файлик не скопировался... может быть я как то не так политику GPO назначил?
Мне не охота делать эксперименты, проверьте на своей инсталяшке, будет ли скопирован файл в таком варианте:
Здравствуйте, WPooh, Вы писали:
WP>Здравствуйте, Lexa-Lexa, Вы писали: LL>>хм... а при установке удаленной через политики GPO как себя данная конструкцуия будет вести? есть принципиальные отличия? почему то у меня файлик не скопировался... может быть я как то не так политику GPO назначил? WP>Мне не охота делать эксперименты, проверьте на своей инсталяшке, будет ли скопирован файл в таком варианте:
WP>msiexec /a installpackagename.msi /l*vx c:\Temp\MyPackage.install.log TARGETDIR=c:\Temp\MyPackage
WP>Проверьте в C:\Temp\MyPackage, есть ли где внутри ваш файлик. Подозреваю, что нету.
WP>Успехов!
Да, вы правы, мой файлик даже и не подумал копироваться... может быть дадите комментарии по всему этому, я слабо понимаю
Как же поступить? на всякий случай вот код: