2009-11-15 2 views
2

나는 내 소스 코드 저장소의 lib 디렉토리에 보관 된 모듈을 사용할 수 있기를 원하며, 필자가 작성한 스크립트를 사용하는 유일한 전제 조건은 표준을 갖기를 원한다. Perl 설치, 그러나 나는 이것을 성취하는 방법을 모르겠다. 내 스크립트에서FindBin으로 @INC를 조정 한 후에도 왜 내 Perl 스크립트에서 내 모듈을 찾지 못합니까?

, 나는

use FindBin qw($Bin); 
use lib "$Bin/lib"; # store non standard modules here 
use Term::ANSIColor; 
use Win32::Console::ANSI; 
print Term::ANSIColor::colored("this should be in color\n", "bold red"); 

을하고 난 ./lib에 모듈을 넣습니다. 그 모듈의 실제 위치를 확인했습니다 (이름을 변경하고 실패하게 만듭니다). 그러나 모듈이 임의의 lib 디렉토리에 있더라도 ppm 모듈을 인식해야합니다.

ppm으로 "설치"하지 않고 lib에서 찾거나 사용할 수있는 스크립트를 가져올 수 없습니다. 나는 이것에 대한 어떤 종류의 방법이 있어야한다고 생각한다.

비정규 요청 일 수 있지만 내 목표는 비정형 인 것으로 알고 있습니다. 개발자가 체크 아웃을하고 일부 추가 명령을 실행하거나 패키지 관리자를 사용하지 않고 즉시 일부 스크립트를 사용하기를 원합니다.

어떤 통찰력에도 감사드립니다.

편집 : 전체 예제가 업데이트되었습니다. 또한 ppm을 통해 제거하면 (참조 된 디렉토리에 pm을 남겨 둡니다) 구문이 변경 될 수도 있다는 것을 알게되었습니다. 그래서 아마 전체 경로를 제공하거나 jheddings 또는 BipedalShark 제안 (예를 들어, 설치되지 않은 경우 "require"를 사용하여 ".pm"을 추가하거나 BEGIN 블록을 사용해야합니다.)

이 경우

, 그럼 내가 올바른 구문을 발견하지 않았습니다

편집 2 :. 아래의 의견을 바탕으로, 나는 결함이 가정을 가질 수 내 추론이가 실현 :. 내가 참조하는 경우 실제 코드 인 ".pm"을 직접 패키지 관리자를 사용하지 않고 사용할 수 있어야합니다. 어쩌면 그렇지 않을 수도 있고, 그렇지 않으면 어쩌면 다른 방식으로해야 할 수도 있습니다. ".pm"코드를 리팩터링해야 할 수도 있습니다.

EDIT 3 : 나는 약간의 오해를하고 있었다고 생각합니다. 내 IDE "Compilation failed in require"의 오류 메시지는 모듈을 포함하기 위해 사용하고 있던 줄과 "Win32 :: Console :: ANSI 모듈의로드 가능한 개체를 찾을 수 없습니다"라는 콘솔 오류 메시지를 강조 표시합니다.

모듈 자체를로드하는 데 문제가 있다고 읽었지만 모듈 자체가로드하려고 시도하는 것으로 인해 발생하는 것으로 보입니다. 필자가 ppm 설치를 사용하지 않았기 때문에 이것은 단지 문제라는 것에 흥미가 있습니다.

실제 모듈을 찾고 있습니다. 문제가되는 부분을 주석 처리하여 확인할 수있었습니다.

도움을 주셔서 감사합니다.하지만 시간을 좀 더 보내야 할 것입니다.

+1

귀하의 질문은 이해되지 않는다. PPM은 설치 프로그램을 제외하고는 아무런 영향을 미치지 않습니다. "작동하지 않을 때"그것은 무엇을합니까? – hobbs

+0

왜 패키지 관리자에 대해 이야기하고 있습니까? 스크립트가 모듈이 어떻게 도착했는지 아무 것도 신경 쓰지 않아야합니다. 진짜 질문은 게시 한 것 이외의 것이 뭡니까? –

+0

lib /에있는 모듈은 무엇입니까? lib/look은 무엇입니까? –

답변

3

는 ... "모듈로드 가능한 오브젝트를 찾을 수 없습니다"아래 perldoc perldiag 참조 :

(F) The module you loaded is trying to load an external library, 
    like for example, "foo.so" or "bar.dll", but the DynaLoader module 
    was unable to locate this library. See DynaLoader. 

당신은이 문제가 모듈을로드 할 무언가에서 발생되는 올 - 그게 Dynaloader입니다. 그러나 Win32::Console::ANSI에 대한 설명서는 외부 라이브러리 요구 사항을 언급하지 않습니다.

+0

"ppm install http://www.bribes.org/perl/ppm/Win32-Console-ANSI.ppd"를 실행했을 때 "C : \ Perl \ site \ lib \ auto \ Win32 \ 콘솔 \ ANSI "나는이 경로를 알지 못했고 나를 이끌었다. 나는 오후가 유일한 다운로드, 그러므로 모든 혼란이라고 생각했다. –

2

lib 디렉토리에 모듈 경로 구조를 보존하고 있습니까?
, 즉 모듈이 $Bin/lib/Some/Module.pm 경로에 있어야합니다.

+0

예, 이름을 바꿔 이름을 바꿔서 실패하게 만들 수 있습니다. lib 경로에있는 파일이 사용중인 파일이라고 확신합니다. 고마워. –

+0

필자는 ppm을 통해 "설치"하지 않으면 구문을 변경해야 할 수도 있다는 것을 알았습니다. 필자는 require, use 및 상대 경로와 절대 경로를 지정하는 Begin 블록을 사용하여 아직 해결 방법을 찾지 못했습니다. –

0

모듈을 수동으로 항상 설치하면 제대로 작동하는 것 같습니다. 디렉토리와 파일을 위치로 복사하고 표시된 것처럼 "lib 사용"지시문을 사용합니다. 때로는 파일을 놓치고 런타임 오류가 발생하여 특정 파일을 찾고 인터넷에서 파일을 찾아 올바른 위치에 배치하면 작동합니다. 귀하의 설정과 관련하여 어떤 일이 일어나는지 확실하지 않습니다. 이것은 효과가있다.

저는 대개 내 스크립트와 동일한 디렉토리에 perl 모듈을 넣은 다음 lib : "."를 사용합니다. 하지만 문제가 될지 모르겠습니다. perlfaq8의 대답에서

2

How do I add the directory my program lives in to the module/library search path?에 당신이 제대로 일을 할 나타납니다,하지만 당신은 도움을받을 것으로 예상되는 경우 당신은 우리에게 더 줄 필요가있다.

스크립트를 실행할 때 @INC으로 끝나는 것은 무엇입니까?

BEGIN { 
     use lib ...; 
     print "INC is \@INC\n"; 
     } 

출력에 원하는 디렉토리가 표시되는지 확인하십시오. 그렇지 않으면 거기에서 문제를 양분하십시오.

1

이 시도 :

BEGIN { 
    use FindBin qw($Bin); 
} 
use lib "$Bin/lib"; # store non standard modules here 
관련 문제