Perl 如何动态设置用户指定库的目录

Perl 如何动态设置用户指定库的目录,perl,Perl,我有一些相当复杂的库,它们相互连接以完成一些工作,虽然它们主要运行在我们的服务器上,但它们连接到一些高性能服务器以处理数据 在我们的服务器上,线路是 use lib '/home/ourgroup/lib' ; use HomeGrown::Code ':all' ; 在高性能集群上,它更像是 use lib '/scratch/ourgroup/lib' ; use HomeGrown::Code ':all' ; 对于使用模块的程序来说,这是一件相当容易设置的事情,但是我不想在代码库

我有一些相当复杂的库,它们相互连接以完成一些工作,虽然它们主要运行在我们的服务器上,但它们连接到一些高性能服务器以处理数据

在我们的服务器上,线路是

 use lib '/home/ourgroup/lib' ;
 use HomeGrown::Code ':all' ;
在高性能集群上,它更像是

use lib '/scratch/ourgroup/lib' ;
use HomeGrown::Code ':all' ;

对于使用模块的程序来说,这是一件相当容易设置的事情,但是我不想在代码库中进行特定于服务器的更改。我希望能够按原样复制目录。那么,我如何告诉我的模块使用我的库目录而不用像这样硬编码呢?

通常通过在不同的机器上设置不同的
PERL5LIB
环境变量来实现这一点。是的,这不是一个纯粹的Perl解决方案,但它只能在每台服务器上执行一次,而不是在每次部署时执行一次。

通常通过在不同的机器上对
PERL5LIB
环境变量进行不同的设置来实现。是的,这不是一个纯粹的Perl解决方案,但它只能在每台服务器上执行一次,而不是在每次部署时执行一次。

下面是我们要做的

use lib '/home/ourgroup/lib' ;
use lib '/scratch/ourgroup/lib' ;

如果一台机器上不存在/home/ourgroup/lib,那就这样吧。如果另一个上不存在/scratch/ourgroup/lib,就这样吧。它不会抱怨,所以这就是我们要做的。

这是我们要做的

use lib '/home/ourgroup/lib' ;
use lib '/scratch/ourgroup/lib' ;

如果一台机器上不存在/home/ourgroup/lib,那就这样吧。如果另一个上不存在/scratch/ourgroup/lib,就这样吧。它不会抱怨,所以这就是我们正在做的。

您还可以拥有一个模块,用于检测环境并为您提供正确的目录

要使用它,只需执行以下操作:

use VarLogRant::FindLibs; 
use Stuff;
并编写模块:

package VarLogRant::Findlibs;

sub select_lib_dirs {

    my @libs;

    push @libs, '/home/ourgroup/libs' if need_home();
    push @libs, '/scratch/ourgroup/libs' if need_scratch();

    # Any other magical logic you want.

}

# It is critical that use lib comes AFTER the functions are defined.
use lib select_lib_dirs();

1;

您还可以使用一个模块来检测环境,并为您提供正确的目录

要使用它,只需执行以下操作:

use VarLogRant::FindLibs; 
use Stuff;
并编写模块:

package VarLogRant::Findlibs;

sub select_lib_dirs {

    my @libs;

    push @libs, '/home/ourgroup/libs' if need_home();
    push @libs, '/scratch/ourgroup/libs' if need_scratch();

    # Any other magical logic you want.

}

# It is critical that use lib comes AFTER the functions are defined.
use lib select_lib_dirs();

1;

我没想到,但这很有道理。非常感谢。现在就开始测试。我没想到,但这很有意义。非常感谢。现在就测试它。问题是,除非VarLogRant::FindLibs与应用程序在同一个目录中,或者在@INC中列出的某个地方,否则您必须像处理东西一样乱。两行“use lib”似乎是一种更简单的方法。在我必须将其移植到我的第九种计算机类型之前。@VarLogRant,如果您将此模块打包为CPAN样式库,并将其作为常规Perl部署的一部分进行安装,它将遍布您需要的任何地方。我无权在其他群集上执行此操作。@VarLogRant然后在所有系统上选择一个公共位置并将文件放在那里。也许这个策略对你不起作用,但对我来说效果很好。像这样设置环境:PER5LIB=~varlogrant/commonperl,或者围绕perl编译一个包装器,设置enivonment,或者在命令行中添加
-I/common/perl/libs
,并将其用作项目解释器,你必须把事情弄得一团糟。两行“use lib”似乎是一种更简单的方法。在我必须将其移植到我的第九种计算机类型之前。@VarLogRant,如果您将此模块打包为CPAN样式库,并将其作为常规Perl部署的一部分进行安装,它将遍布您需要的任何地方。我无权在其他群集上执行此操作。@VarLogRant然后在所有系统上选择一个公共位置并将文件放在那里。也许这个策略对你不起作用,但对我来说效果很好。像这样设置环境:PER5LIB=~varlogrant/commonperl,或者围绕perl编译一个包装器,设置enivonment,或者向命令行添加
-I/common/perl/libs
,并将其用作项目解释器。