Автор: Astra55
Дата сообщения: 31.07.2011 10:24
Глупые советы портабелизаторам
Поскольку появляется все больше и больше сборок, авторы которых научились нажимать несколько кнопок в ThinApp и запускать build.bat, при этом не утруждая себя изучением документации и чтением топика по ThinApp (Thinstall), поскольку первый на английском, а во втором слишкам многа букаф, предлагаются кое-какие советы. Дабы не быть при этом обвиненным в высокомерии, уничижении и прочих грехах, советы названы глупыми. Можете спокойно их проигнорировать и продолжать делать сборки на свой лад.
0. Если вы не знакомы с принципами работы системы Windows в целом, и ее реестра в частности, то постигнуть некоторые моменты работы портабельных сборок будет очень трудно или даже невозможно.
1. Изоляция папок в проекте - один из самых хитрых моментов. Дать рекомендации по каждой папке проекта практически невозможно, поэтому только краткие принципы.
Включать ли вообще ту или иную папку в проект, а если включать, то какой тип изоляции ставить, зависит исключительно от функционала программы. Всегда будут два полюса - либо нужные файлы/папки в процессе работы сборки окажутся в песочнице вместо реальной системы, либо окажутся в реальной системе вместо песочницы, когда они там не нужны. Если программа не создает никаких служебных папок и файлов (именно служебных, то есть, своих собственных), то можно удалить из проекта все папки, кроме тех, что реально использовала программа в момент запуска, при создании проекта. Определить будет ли она создавать что либо для себя самой, можно только работая с ней достаточно долго. Грубо говоря, нужно пройтись по всем фунциям и не по одному разу, чтобы сделать далеко идущие выводы. Обычно этого не случается, по вполне объективным причинам.
Но некоторые принципы действуют для всех случаев, а именно:
- Всегда удаляйте файл ##Attributes.ini (WriteCopy), который лежит сразу же в %ProgramFilesDir%. Почему и зачем? Если оставить этот файл, то все содержимое виртуальной папки Program Files будет всегда в виртуале. К чему это приведет? Если сборке будет нужно создать файл или папку внутри реальной директории Program Files, то вместо реала созданные объекты окажутся в песочнице, ведь там установлена изоляция WriteCopy. Другой пример - если одна сборка обращается к другой сборке, скажем, конвертер pdf вызывает для просмотра pdf файла портабельный Adobe Reader, находящийся в Program Files, то опять таки, изоляция приведет к помещению копии Reader в песочницу. Вот из-за таких моментов и не нужно изолировать %ProgramFilesDir%, пусть она всегда будет в реальной системе. Придумать ситуацию, когда от подобной изоляции будет польза, я не могу, за исключением крайне редких случаев. Само собой, что на папки портабелизируемой программы, находящиеся внутри %ProgramFilesDir%, это правило не действует, там другие законы.
2. Удаляйте из проекта все папки с временным или бесполезным содержанием, как минимум, следующие:
Support
---------------
Эта папка вообще не имеет отношения к сборке, и содержит всякую интимную информацию о вашем компе, удалить обязательно.
---------------
%Desktop%
%Common Desktop%
%Programs%
---------------
Ярлыков в реальной системе сборки не создают, поэтому эти папки не имеют смысла
---------------
%Cookies%
%History%
%Internet Cache%
%TEMP%
---------------
Эти папки по сути своей - помойки, содержащие всякий хлам. Если хлам окажется в реальной системе, то чистить его проще и легче, нежели в песочнице. Для помоек в реальной системе не играет никакой роли, больше будет хлама или меньше, поэтому развозить его на две кучи не нужно.
---------------
%SendTo%
%Startup%
---------------
Опять таки, для портабельной сборки эти папки не имеют смысла в виртуале, они есть в реальной системе.
Разумеется, нельзя воспринимать это как догму, может вы захотите создать браузер с полной изоляцией от реальных директорий или же захотите, чтобы в Temp реальной системы ничего не попадало. Но за исключением экзотики, можете смело исключать вышеуказанные папки из проекта, никакой сермяжной правды они не содержат и ни на что не влияют. Учтите, если их не удалять, то в момент сборки в этих папках окажется содержимое из вашего собственного компа, где могут быть очень любопытные вещи, не предназначенные для чужих глаз.
2. Рассмотрим основной файл проекта Package.ini, где содержатся все настройки будущей сборки:
[Compression]
CompressionType=Fast
-----------
Если программа на сотни мегабайт, с сотнями или тысячами файлов, то для первого запуска на предмет определения - а будет ли софт вообще работать в виде портабельной сборки? - смело ставьте CompressionType=None, иначе сжатие экзешника может занять много времени и будет обидно его расходовать зря, если сборка не заработает как нужно. Если есть уверенность, что сборка нормально работает, тогда можно сменить на Fast, времени будет уже не жалко. С другой стороны, тяжелые в запуске и сложные софты зачастую нет смысла сжимать, проще максимально сжать готовую сборку с помощью 7Z для размещения на файлообменниках.
OptimizeFor=Disk - эта строчка должна быть практически всегда, иначе сборка распухнет и будет много больше исходного размера всех файлов, входящих в нее. Широко используется недобросовестными сборщиками для раздувания размеров, чтобы заработать на платных файлообменниках. Дополнительно такая сборка пакуется RAR с нулевым сжатием.
[Isolation]
DirectoryIsolationMode=Merged
RegistryIsolationMode=Merged - добавьте эту строчку в случае, если необходимо дать сборке доступ к реальному реестру. Кстати, некоторые глубоко убеждены, что портабельные сборки ThinApp в принципе не могут работать с реальным реестром. Это убеждение вытекает из-за нежелания читать, поскольку опция давно документирована в мануалах ThinApp.
[BuildOptions]
CachePath=<sandbox_path>
-------------
Добавьте эту строчку, чтобы кэш сборки всегда находился в песочнице.
ChildProcessEnvironmentDefault=External
-------------
Добавьте эту строчку, чтобы дочерние процессы всегда исполнялись вне контейнера. Дочерний процесс может быть запущен как из контейнера ThinApp, так и из реальной системы. В противном случае, дочерний процесс может либо вообще не запуститься, либо окажется в песочнице.
SandboxPath=.
-------------
Путь к песочнице. Если путь заменен на точку, как показано выше, то песочница будет создана рядом с основным экзешником сборки. Если эту строчку не включать в проект, то песочница будет создана по дефолтному пути c:\Documents and Settings\user_name\Application Data\Thinstall\. При создании папки Thinstall рядом с основным экзешником сборки, песочница будет находиться там. Причем, в этом случае, папка Thinstall будет иметь приоритет перед любыми другими вариантами, включая SandboxPath=.
ExternalDLLs=
-------------
Добавьте эту строчку с именами dll (если их несколько, то через ";"), которые необходимо выносить в реальную систему, на самом деле - в песочницу. Многие программы при портабелизации вообще не будут работать, например, с мышкой, если dll будет в изолированном контейнере. Примеры таких программ - Punto Switcher, HyperSnap и другие. Какие именно dll нужно выносить, сказать невозможно, для каждой программы они будут свои.
;RemoveSandboxOnExit=1
------------
Удалите ";", если необходимо очищать содержимое песочницы при выходе из портабельной программы. Хорошее средство продлить триал некоторых программ.
OptionalAppLinks=plugins\*.exe
------------
Эта строчка должна быть ВСЕГДА (за редчайшими исключениями), поскольку разрешает работу с внешними плагинами AppLinks. К чему приведет ее отсутствие или добавка ";" в начале строчки? Например, некто собрал портабельный софт, и либо по незнанию, либо по недомыслию, не включил в сборку те или иные компоненты, скажем, VC++ или .NET, или еще что-то. Устранить подобные косяки в случае если опция OptionalAppLinks работает, не представляет труда. Достаточно включить недостающие dll-ки в ThinApp плагин и разместить его рядом с экзешником в папке Plugins. Если же эта строчка закомментирована или отсутствует, то придется переделывать всю сборку заново. То же самое касается всех программ, использующих плагины, русификаторы и т.д. Вместо сборки двух вариантов - русского и английского, достаточно собрать один, а дополнительный язык (языки) подключать плагином.
;VirtualDrives=Drive=c, Serial=12345678, Type=FIXED
;VirtualComputerName=MyComp
Эти две строчки частично эмулируют систему, на которой собиралась портабельная сборка. Эмулируется ID дисков, в данном случае C:, и имя компьютера. Используется в случаях привязки программ к указанным параметрам. Для более сложных случаев привязки работать не будет.
3. Если вы используете для снапшотов новые версии ThinApp, ни в коем случае не оставляйте включенной опцию Send anonymous usage statistics to VMware! Это приведет к добавлению к сборке и последующему запуску хитрого экзешника, а его действия очень похожи на троянца. Лучше всего пользоваться для снапшотов старой версией 4.0.0.2200, добавляя в случае необходимости дополнительные опции в Package.ini, благо, различия небольшие. Зато нет нужны отмечать кучу опций во время создания снапшотов и нет риска, что указанная выше опция будет ненароком включена.
Да, можно сказать, что изложены банальные вещи, давно известные всем. Но судя по количеству кривых и косых портабельных сборок, их авторы явно не входят в число "всех, кому это известно".
Обсуждения и дополнения этого текста всячески приветствуются.