Что делает ActivePerl, перемещая файлы во время установки?

Учитывая некоторую программу unix, которую я скомпилировал, что мне нужно сделать, чтобы переместить ее в другой каталог и продолжить ее правильную работу.

Я думаю о Perl, но меня интересуют и другие системы, такие как Apache, которые тоже, кажется, терпят неудачу, когда это делается. Чтобы мотивировать вопрос, возможность выполнить такое перемещение было бы очень полезно при объединении других систем как части установки продукта.

Что бы это ни стоило, процесс установки ActivePerl, похоже, содержит некоторую магию, которая выполняет перемещение во время установки.

Installing ActivePerl...
Copying files to /opt/ActivePerl-5.8...done
Relocating...done (164 files relocated)
Generating HTML documentation...done
Syncing perl PPM database with .packlists...done 

ActivePerl has been successfully installed at /opt/ActivePerl-5.8.

Может ли кто-нибудь просветить меня относительно того, что происходит за этой строкой «Перемещение ...»?


person Matt Sheppard    schedule 20.11.2009    source источник


Ответы (5)


Когда вы компилируете perl, он ожидает определенные файлы в определенных местах. Вы можете увидеть некоторые из этих путей с помощью perl -V. Для ActivePerl, когда вы хотите переместить всю установку, вы должны обновить, где perl ожидает найти что-то, и где его различные вспомогательные программы ожидают найти perl. См. документацию по reloc_perl ActiveState и, возможно, просмотрите исходный код, если вы иметь это.

То, что делает ActivePerl, не имеет общего отношения к тому, что вы будете делать с другими программами. Это зависит от того, что каждый из них делает и ожидает.

person brian d foy    schedule 20.11.2009
comment
Это будет правильный ответ. Я работаю в компании, которая когда-то владела ActiveState, и задавала вопросы авторам ActivePerl именно по этому поводу. - person Chris Simmons; 20.11.2009
comment
Круто. С чего мне начать, чтобы научиться делать такие вещи с произвольной программой? - person Matt Sheppard; 20.11.2009
comment
@Matt В последний раз, когда я смотрел, метод состоит в том, чтобы настроить двоичный файл с корнем всех жестко запрограммированных путей на что-то вроде /xxxXXXxxxREPLACEMExxxXXXxxx, а затем выполнить поиск и заменить двоичный файл вашим новым корнем. Немного страшно, что это работает. Я не знаю, насколько это применимо ко всем компиляторам и исполняемым форматам. - person Schwern; 21.11.2009
comment
Однажды я пытался сделать что-то подобное вручную, но столкнулся с проблемой, если длина пути отличалась от исходной. Я думаю, если вы начнете с очень длинного пути и заполните его нулями, все может пойти хорошо... - person Matt Sheppard; 21.11.2009
comment
@Matt Это именно то, что происходит. - person Schwern; 22.11.2009

Многое зависит от программы. Некоторые программы довольно автономны и, таким образом, обрабатывают перемещения более изящно, чем другие программы, которые имеют пути к каталогам во внешних файлах конфигурации или других менее щадящих элементах.

person Amber    schedule 20.11.2009
comment
Да, думаю, мне было бы интересно узнать, что это за элементы и как их обновлять. Например, двоичный файл Perl, кажется, подхватывает некоторые пути к библиотекам, встроенные в двоичный файл. Я думаю, должен быть какой-то способ исправить их как часть переезда... - person Matt Sheppard; 20.11.2009

Active Perl не компилирует Perl в вашей системе, он просто распаковывает и копирует его в нужное место.

Проблема в том, что в установке Perl есть много файлов, в которых должна быть определенная информация об установке, например, где найти библиотеки, где находится установка и так далее. Эти файлы модифицируются, чтобы иметь правильную информацию на этапе перемещения.

person daotoad    schedule 20.11.2009

Это зависит от того, что вы подразумеваете под «переехать». Вы можете запустить бинарный файл, а затем переместить его в другой каталог, он должен работать под Linux.

Итак, вы можете написать программу, которая переместит все ваши двоичные файлы и файлы конфигурации в другой каталог, а затем просто изменит текущий рабочий каталог.

person Elalfer    schedule 20.11.2009
comment
Я не уверен, что это должно просто работать - по крайней мере, это не похоже на perl и apache (но работает для Java, чего бы это ни стоило) - person Matt Sheppard; 20.11.2009
comment
Если вы переместите только двоичный файл Perl, он будет работать, но если вы переместите любую из библиотек, он не сможет их найти. Их местоположение жестко закодировано в двоичном коде. - person Schwern; 21.11.2009
comment
Только не в Linux библиотеки нельзя было жестко запрограммировать. Используйте окружение LD_LIBRARY_PATH. переменная для добавления пути поиска библиотек. - person Elalfer; 21.11.2009
comment
Да, LD_LIBRARY_PATH может работать, но я больше думаю о чем-то, что я мог бы установить в систему конечного пользователя (где LD_LIBRARY_PATH, вероятно, был бы неприемлем), чем о быстром взломе, чтобы заставить что-то работать для себя. Спасибо хоть. - person Matt Sheppard; 21.11.2009
comment
@Eafler Я имел в виду библиотеки Perl (файлы .pm), а не общие библиотеки, связанные с двоичным файлом. - person Schwern; 22.11.2009

Использование UltraEdit для поиска и замены всех файлов в установке Perl: например, при переходе с C:\Perl64 на G:\Perl64 замените все файлы, содержащие «C:\Perl64», на «G:\Perl64». В процессе нам нужно снять несколько конфигурационных файлов и свойство exe-файла только для чтения и повторить замену.

person Frank    schedule 21.10.2013