Упаковка приложения perl, чтобы оно работало вне префикса по умолчанию для perl - PullRequest
3 голосов
/ 11 марта 2011

Я использую Module :: Build (хотя я гибок в средах сборки) для упаковки некоторого программного обеспечения Perl, которое я пишу для внутреннего использования, где я работаю.Он включает в себя несколько сценариев и несколько вспомогательных модулей.Мой план состоит в том, чтобы сделать так, чтобы вы могли указывать префикс того, что вы хотите (то есть что-то вне значения по умолчанию в perl @INC) во время процесса сборки, и встроенные скрипты должны все еще без проблем находить свои вспомогательные модули.

Я хочу сделать это, потому что я хочу распространять это программное обеспечение внутри компании с помощью Encap, который является инструментом упаковки, который по умолчанию может не устанавливать что-либо за пределами / usr / local, ив RedHat наш perl не ищет / usr / local / lib для модулей по умолчанию.

Это дает мне возможность либо сказать пользователю вручную устанавливать PERL5LIB в / usr / local / lib каждыекогда они захотят запустить приложение или сделать что-то умное с системой сборки, чтобы оно работало со строкой use lib каждого скрипта после указания --prefix.

Сейчас я просто устанавливаю use lib указывать прямо на / usr / local / lib вручную в каждом из моих сценариев, но мне не очень нравится это как решение.Главным образом из-за процесса тестирования: я хочу переопределить @INC во время тестирования, чтобы он сначала использовал мой рабочий каталог для модулей perl, но после сборки рабочий каталог должен быть удален из @INC и заменен указанным пользователем префиксом,Но также потому, что я хотел бы, чтобы это программное обеспечение было установлено в произвольных местах (например, на его собственном маленьком островке где-то в NFS с собственным bin / и lib / dirs) и все еще работало без проблем.

вопрос :

Может ли модуль :: Build позволить мне поиграться со строками use lib моих скриптов во время шагов сборки?Я заметил, что в MakeMaker есть опция pm_filter, которая позволяет вам указать функцию поиска и замены, которая может произвольно изменять ваши файлы .pm по мере их создания, но работает только с файлами .pm, а не со скриптами.Модуль :: Сборка должна быть более гибкой, но я тону в документации, пытаясь выяснить, где вы бы это указали.

1 Ответ

3 голосов
/ 11 марта 2011
>>> daxim@champion:/tmp/Foo-Bar$ tree
.
├── bin
│   └── foobar
├── Build.PL
├── inc
│   └── Local
│       └── Module
│           └── Build
│               └── Fnord.pm
└── lib
    └── Foo
        └── Bar.pm

7 directories, 4 files

>>> daxim@champion:/tmp/Foo-Bar$ cat bin/foobar
use lib "DUMMY";
use Foo::Bar;
print "It works!\n";

>>> daxim@champion:/tmp/Foo-Bar$ cat Build.PL
use lib 'inc';
use Local::Module::Build::Fnord;

my $build = Local::Module::Build::Fnord->new(
    module_name => 'Foo::Bar',
    license     => 'restricted',
);
$build->add_build_element('bin');
$build->create_build_script;

>>> daxim@champion:/tmp/Foo-Bar$ cat inc/Local/Module/Build/Fnord.pm
package Local::Module::Build::Fnord;
use parent 'Module::Build';
sub process_bin_files {
    my ($self) = @_;
    my $lib = $self->install_base . '/lib/perl5';
    system "chmod u+w blib/script/*";
    my $call = qq($^X -p -i -e's[use lib "DUMMY";][use lib "$lib";]' blib/script/*);
    print "$call\n";
    system $call;
};
1;

>>> daxim@champion:/tmp/Foo-Bar$ cat lib/Foo/Bar.pm
package Foo::Bar;
1;

>>> daxim@champion:/tmp/Foo-Bar$ perl Build.PL --install_base=/tmp/usr/local
⋮

>>> daxim@champion:/tmp/Foo-Bar$ ./Build install
Building Foo-Bar
/home/daxim/local/bin/perl -p -i -e's[use lib "DUMMY";][use lib "/tmp/usr/local/lib/perl5";]' blib/script/*
Installing /tmp/usr/local/lib/perl5/Foo/Bar.pm
Installing /tmp/usr/local/bin/foobar

>>> daxim@champion:/tmp/Foo-Bar$ cat blib/script/foobar
use lib "/tmp/usr/local/lib/perl5";
use Foo::Bar;
print "It works!\n";

>>> daxim@champion:/tmp/Foo-Bar$ cd /tmp/usr/local/bin/

>>> daxim@champion:/tmp/usr/local/bin$ perl foobar
It works!
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...