2014-09-15 8 views
4

저는 현재 회사의 설치 프로그램을 작성 중이므로 새 시스템을 쉽게 설치할 수 있습니다. 그 중 하나는 개별 perl -MCPAN -e 'install "Module::Name"' 명령을 통해 설치된 일련의 CPAN 모듈입니다. bash 스크립트에서 foreach 루프를 통해 설치된 모듈 배열 (약 200 개)을 만들었습니다. 그러나 새로운 모듈을 시작하기 전에 모듈 설치의 종료 상태를 확인하고 싶습니다. 이것이 가능합니까? 여기에 지금까지 시도 내용은 다음과 같습니다perl -MCPAN -e의 반환 값/종료 상태를 어떻게 확인할 수 있습니까?

for i in "${CPANmodules[@]}" 
do 
    echo -e "\033[1;32mInstalling CPAN module $i \033[0m" 
    perl -MCPAN -e "install \"$i\"" 
    if [ $? -ne 0 ] 
    then 
     echo "Error installing module $i" 
    fi 
done 

는 또한 성공하지, 다음을 시도했다 : 그러나

perl -MCPAN -e 'install "Madeup::Modulename"' 
perl -e 'print $?' 

이 항상 모듈도 존재하지 않는 경우에도, 0을 반환합니다.

도움을 주시면 감사하겠습니다.

+1

추측 : Madeup :: Modulename을 설치하거나 1 '을 종료 할 수 있습니까? –

+0

그러나 좋은 제안은 아무 것도 변경하지 않습니다. – Bifrost

+0

@TomFenech의 제안에 대한 빠른 테스트는 CentOS 5 머신에서 수행되었습니다 (CPAN 설정을 실행 한 후에는 이전에이 머신에서 사용하지 않았 음). –

답변

2

를 설치합니다. 불행히도 failed은 실패 횟수를 반환하지 않고 단순히 결과를 STDOUT에 인쇄합니다.

perl -MCPAN -wE ' 
    CPAN::Shell->install("Foo::Bar"); 
    open my $buffer, ">", \my $failed or die $!; 
    my $stdout = select $buffer; 
    CPAN::Shell->failed; 
    select $stdout; 
    close $buffer; 
    exit 1 unless $failed =~ /Nothing failed in this session/' 

(코드를 다른 SO 질문에 simbabque's answer에서 가져온 변수에 STDOUT 리디렉션에 대한) :

이 아마이 할 수있는 더 좋은 방법이지만, 다음과 같은 해킹으로 출력을 필터링하는 것은 작동하는 것 같다

CPAN에서 모듈을 찾을 수없는 경우 make 단계까지 도달하지 않으므로 0이 반환됩니다. 나이가 설치하는 경우

perl -MCPAN -wE ' 
    $name = "Foo::Bar"; 
    CPAN::Shell->install($name); 
    $mod = CPAN::Shell->expandany($name); 
    exit(! defined $mod || ! $mod->uptodate)' 

이것은 물론 작동하지 않습니다 :

또한 지정된 모듈이 설치되어있는 경우 1을 반환하고 최신하면 uptodate 명령을 사용할 수 있습니다 버전의 모듈 (그리고 나는 개발 버전에 대해 확신하지 못합니다). 다른 설치 프로그램을 시도 할 의사가 있다면


cpanm 실제로 제정신 값을 반환 발견하거나 설치에 실패하지 않는 모듈의 성공적인 설치하고 업그레이드 0, 1.

+0

답변 해 주셔서 감사합니다. 내가 의도 한 기능을 원한다면 나는 cpanm으로 전환해야 할 것 같다. – Bifrost

+0

@Bifrost 개인적으로, 필자는 기본적으로'cpan'보다 훨씬 덜 장황하기 때문에 *'cpanm'을 선호합니다. – ThisSuitIsBlackNot

0

사용 CPAN의이 양식은 현재 세션에서 make, test, 또는 install에 실패한 모든 모듈을 표시합니다 failed 명령을 사용할 수있는 방법을

sudo perl -MCPAN -e 'CPAN::Shell->install("Devel::Cover") or exit 18' 
+1

편집 : 이것은 항상 18을 반환합니다. 구성된 이름, 이미 설치된 모듈 및 아직 설치되지 않았지만 성공적으로 설치된 모듈로 시도합니다. 모두는 돌려 보냈다 18. – Bifrost

+0

나의 이전 코멘트를 편집했다. 답변 주셔서 감사합니다. – Bifrost