Определение символического пути - PullRequest
0 голосов
/ 02 января 2019

Я использовал 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

Как видите, он возвращает абсолютный путь (как и должно быть), поэтому мне нужно знать, как я могу универсально определить, какой путь использовать для ulvr_env.pl в зависимости от того, запущен ли скрипт в prod, dev, qa или уат. этот (эти) сценарии должны работать одинаково независимо от того, используется ли полный путь для выполнения или используется относительный путь. Я пытался использовать:

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" без необходимости поддерживать различный код для каждого местоположения?

1 Ответ

0 голосов
/ 02 января 2019

Возможно, это не лучший способ сделать это, но он решает проблему с переносимостью кода:

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"; 

Выход QA-сервера:

$ ./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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...