2013-08-27 2 views
1

나는 컴퓨터에서 기계로 이동하는 수제 #Perl 라이브러리를 가지고 있으며 경로는 장소에 따라 다릅니다. 특히, 이전 머신에서는/home/foo/lib /에 있었고, 새 머신에서는/group/bar/apps/lib로 이동했습니다. 이제는/home/나/dev/Tools/lib.Perl에서 조건 라이브러리를 사용하는 방법은 무엇입니까?

우리는 lib 라인을 여러 개 사용했습니다./가정/foo는 새로운 시스템에서 사용할 수 없습니다, 및/그룹/바는 기존의 시스템에 디렉토리가 아니다, 그래서 볼 때이 -

use lib '/home/foo/lib/' ; 
use lib '/group/bar/apps/lib' ; 
use Tools::Foo ; 

- 모든 것이 괜찮습니다.

문제는 서로 연결되어 있고/home/me/dev/Tools/lib에/group/bar/apps/lib의 프로그램을로드하지 않고 이동했을 때 이 제품을 제작하려면 ~/me/dev을 가리키는 것을 원하지 않습니다. preferrably, 나는 그것을 생산에 옮길 때 코드를 수정할 필요가 없기 때문에, 모든 것이 전개 될 때 diff /group/bar/apps/lib/Tools/Foo.pm /home/me/dev/Tools/lib/Tools/Foo.pm은 비어있게된다.

그래서 여러 조건부 라이브러리 위치를 설정하려면 어떻게해야합니까?

답변

2

메인 프로그램 형태

#! /usr/bin/env perl 

use strict; 
use warnings; 

use lib_first_of (
    "/home/foo/lib", 
    "/group/bar/apps/lib", 
); 

use MyModule; 

print "done.\n"; 

어느 경로가 존재하는 경우가 있습니다, 프로그램은 오류가

my-program: no suitable library path found at my-program line 7 
BEGIN failed--compilation aborted at my-program line 9.
10

옵션 :

  1. 제대로 모듈을 설치합니다. 스크립트

    use FindBin qw($RealBin); 
    use lib "$RealBin/../lib"; # Or whatever. 
    
  2. 사용 환경 변수 PERL5LIB보다는 use lib

  3. 놓습니다 모듈의 상대적인 위치를 설정합니다.

  4. 진술은 sitecustomize.pl (에 대한 지원이 활성화 된 경우 perl이 작성되었을 때)에 배치 될 수 있습니다. 다음 pragma를

    package lib_first_of; 
    
    use lib(); 
    use strict; 
    use warnings; 
    
    use Carp; 
    
    sub import { 
        foreach my $path (@_) { 
        if (-d $path) { 
         lib->import($path); 
         return 1; 
        } 
        } 
    
        croak "$0: no suitable library path found"; 
    } 
    
    1; 
    

    를 사용

+1

을 닮은 실패 +1'sitecustomize.pl'도 사용할 수 있습니다. 비슷한 효과를 내기 위해 빌드 옵션에 의존한다. – pilcrow

+0

@pilcrow, 감사합니다. 답변에 추가되었습니다. – ikegami

관련 문제