Как может я “использовать lib” соответствующий каталог в зависимости от местоположения установки?

Необходимо быть очень осторожными, если Вы звоните System.gc(). Вызов его может добавить ненужные проблемы производительности к Вашему приложению, и это, как гарантируют, на самом деле не выполнит набор. На самом деле возможно отключить явный System.gc() через аргумент Java -XX:+DisableExplicitGC.

я настоятельно рекомендовал бы прочтение документов, доступных в сборка "мусора" Java HotSpot для больше подробно деталей о сборке "мусора".

7
задан brian d foy 11 November 2009 в 18:10
поделиться

5 ответов

FindBin::libs is excellent for that. I've used it for a while in a large system with no problems at all.

The default invocation looks like it'll work for you, simply:

use FindBin::libs;

This will search for all the ./lib dirs in all the parent directories of the current file's dir and use lib them. So, for example, if your script lives in /home/w/myapp_live/scripts/defurblise_widgets.pl (and use()es FindBin::libs), it will look for:

/home/w/myapp_live/scripts/lib
/home/w/myapp_live/lib
/home/w/lib
/home/lib
/lib       # (presumably!)

Any that it finds with be added to you @INC with use lib.

But, if that's not quite what you need, it's a very flexible module. I'd be surprised if you can't find a way to make it do what you want.

7
ответ дан 6 December 2019 в 10:51
поделиться

Если вы запускаете программу из командной строки, не устанавливайте библиотеку программно: просто передайте ее в качестве аргумента, например: perl -I / location / of / my / lib myprog.pl .

Почему бы вам не сделать вашу библиотеку для вашего веб-приложения относительно местоположения самого скрипта? Затем просто установите его на каждую машину, где находятся библиотеки.

use FindBin;
use File::Spec::Functions;
use Cwd qw(abs_path getcwd);

BEGIN {
    my $curdir = getcwd;
    my $selfdir = $FindBin::Bin;
    my $libdir = abs_path(catdir($selfdir, 'lib'));

    chdir $libdir or die "can't chdir to $libdir: $@";
    use lib $libdir;
}

Конечно, самый простой вариант - не использовать разные каталоги библиотек. Почему вы не можете быть последовательными во всех ваших средах?

Редактировать. Повторите свой комментарий «Причина, по которой я должен использовать разные каталоги lib, заключается в том, что код, работающий на действующем сайте, отличается от кода, работающего на бета-сайте ... в этом смысл наличия бета-сайта». - почему бы вам не справиться с этим на уровне установщика, вместо того, чтобы заставлять сам код знать, жив ли он или бета? например, храните код в разных каталогах в дереве исходных текстов, как сейчас, но устанавливайте только соответствующий код в каждое поле. В конце концов, это именно то, что сделала бы для вас хорошая система контроля версий - вы проверяете только одну ветку за раз, и вы должны устанавливать только одну версию кода за раз (как намекал Брайан д Фой).

5
ответ дан 6 December 2019 в 10:51
поделиться

Я использую следующее во многих своих сценариях:

use strict;
use warnings;

use 5.008;

use FindBin;
use lib $FindBin::Bin;

Эту последнюю строку можно изменить как таковую:

use FindBin;
use lib "$FindBin::Bin/lib";
3
ответ дан 6 December 2019 в 10:51
поделиться

В разных средах могут быть разные настройки для переменной среды $ PERL5LIB .

2
ответ дан 6 December 2019 в 10:51
поделиться

Показанный вами код выглядит разумным. Вы можете установить одну копию этого кода в общесистемном месте, и тогда код для его вызова будет иметь вид

require '/path/to/findlib.pl';
findlib->import;

. Форма требует , которая принимает имя файла , не search @INC .

В качестве альтернативы, если вы хотите изменить множество вещей, вы можете изучить развертывание приложения таким образом, чтобы было удобнее для local :: lib использование.

1
ответ дан 6 December 2019 в 10:51
поделиться
Другие вопросы по тегам:

Похожие вопросы: