如何在Perl脚本中共享ENV变量

时间:2017-06-23 13:42:09

标签: perl

我有两个Perl脚本和GIT钩子脚本。在那里我正在验证GIT工作流程。这是调用堆栈的脚本。

预推 - > unpush-changes - >依赖关系的树

在unpush-changes perl脚本中有一个for循环,它将调用dependency-tree perl脚本。

预推

system("unpushed-changes");
  my $errorMsg = $ENV{'GIT_FLOW_ERROR_MSG'}// '';
  if($errorMsg eq "true"){
     print "Error occured!";
   }

unpush-changes.pl

  for my $i (0 .. $#uniqueEffectedProjectsList) {
      my $errorMsg = $ENV{'GIT_FLOW_ERROR_MSG'}// '';
      if($errorMsg ne "true"){
        my $r=system("dependency-tree $uniqueEffectedProjectsList[$i]");
     }else{
        exit 1;
     }

   }

dependency-tree.pl

if(system("mvn clean compile  -DskipTests")==0){
     print "successfully build"; 
     return 1;
 }else{
      $ENV{'GIT_FLOW_ERROR_MSG'} = 'true';
      print "Error occured";
      return 0;
  }

在我的依赖关系树脚本中,如果发生错误,我设置了 ENV 变量,并且将在 unpush-changes <中的每次迭代中检查/ strong> script.But它的ENV值为空而不是 true 。我也尝试返回一些值,如果失败并尝试验证它,但似乎它也没有工作。所以我的要求是我如何在所有脚本之间共享一个全局变量。如果有更好的方法,请告诉我。

2 个答案:

答案 0 :(得分:8)

通常,子进程从其父进程继承环境的单独副本,并且子进程所做的更改不会传播到父进程的环境。 Env::Modify为实现perlfaq所讨论的"shell magic"的此问题提供了一种解决方法。

典型用法:

use Env::Modify 'system',':bash';

print $ENV{FOO};                   #   ""
system("export FOO=bar");
print $ENV{FOO};                   #   "bar"
...
print $ENV{GIT_FLOW_ERROR_MSG};    #   ""
system("unpushed-changes");
print $ENV{GIT_FLOW_ERROR_MSG};    #   "true"
...

答案 1 :(得分:1)

正如@mob所提到的,有两种方法可以实现这一目标。Env::Modify或perl lib。所以我选择lib而不是Env::Modify。因为我想要在每台机器上运行此脚本,无论是否安装了Env::Modify包。

我写了 Utils.pm ,将unpush-changesdependency-tree功能捆绑在一起,我将其保存在 /c/lib/My/Utils.pm

<强> Utils.pm

package My::Utils;
use strict;
use warnings;

use Exporter qw(import); 
our @EXPORT_OK = qw(build deploy);

sub build {
 system("mvn clean compile  -DskipTests")
 //Do  other things
}

sub deploy {
 //Do  things
}

1;

然后我在我的pre-push钩子中使用了以前创建的库。

<强>预推

#!/usr/bin/perl
use strict;
use warnings;
use File::Basename qw(dirname);
use Cwd  qw(abs_path);
use lib dirname(dirname abs_path $0) . '/lib'; 
use My::Utils qw(build deploy); // or use lib '/c/lib';

build();
deploy();

不再需要担心ENV变量。Reference