我有两个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 。我也尝试返回一些值,如果失败并尝试验证它,但似乎它也没有工作。所以我的要求是我如何在所有脚本之间共享一个全局变量。如果有更好的方法,请告诉我。
答案 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-changes
和dependency-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