我一直在使用Cwd'abs_path'来获取包含共享参数值和函数的脚本的确切位置,以便它们可以在我们的dev / qa / uat / prod环境中互换。
代码示例:
#!/usr/bin/perl
use strict;
use Cwd 'abs_path';
my $script_path = abs_path($0);
my @folders = split(/\//,$script_path);
my $env = $folders[3];
my $file_loc "/prod/ops/$env/env_shared/ulvr_env.pl";
print "$0\n";
print "$script_path\n";
print "$env\n";
print "file location: $file_loc\n";
$ env可以解析为'dev','qa','uat'或'prod',具体取决于脚本所在的目录。到目前为止,这段代码对我们来说一直很好。我们的生产服务器仍然具有绝对路径“ / prod”,但是由于篇幅所限,我们已经通过符号链接将脚本从“ / prod”移动到了“ / data / prod”。
结果:
$ ./test_path.pl
/prod/ops/prod/test_path.pl
prod
file location: /prod/ops/prod/env_shared/ulvr_env.pl
如您所见,它返回绝对路径(应有),因此我需要知道如何根据脚本是否在prod,dev,qa中运行来通用确定用于ulvr_env.pl的路径。或uat。无论使用完整路径还是使用相对路径,这些(这些)脚本都需要工作相同。我尝试使用:
use File::Spec;
my $script_path = File::Spec->rel2abs( $0) ;
在运行脚本以指定完整符号路径时有效,但是在尝试从cwd运行时无效
$ /prod/ops/qa/test_path.pl
/prod/ops/qa/test_path.pl
ops
file location: /prod/ops/qa/env_shared/ulvr_env.pl
$ ./test_path.pl
/data/prod/ops/qa/test_path.pl
ops
file location: /prod/ops/ops/env_shared/ulvr_env.pl
使它返回“ qa”,“ uat”或“ prod”而不必为每个位置维护不同代码的最佳方法是什么?
答案 0 :(得分:1)
这可能不是最好的方法,但是它确实解决了代码可移植性的问题:
use File::Spec;
my $script_path = File::Spec->rel2abs( $0) ;
print "script path: $script_path\n";
$script_path =~ s/^\/data//; # replace /data at beginning of string with nothing
my @folders = split(/\//,$script_path);
my $curr_env = $folders[3];
print "$curr_env\n";
my $file_loc = "/prod/ops/$curr_env/env_shared/ulvr_env.pl";
print "file location: $file_loc\n";
质量检查服务器输出:
$ ./test_path.pl
script path: /data/prod/ops/qa/test_path.pl
qa
file location: /prod/ops/qa/env_shared/ulvr_env.pl
PROD服务器输出:
$ ./test_path.pl
script path: /prod/ops/prod/test_path.pl
prod
file location: /prod/ops/prod/env_shared/ulvr_env.pl