2009-09-14 3 views
1

저는 현재 PAR 패커 (pp)를 사용하여 컴퓨터에 복사 할 수 있고 내 클라이언트가 CPAN에 심취 할 필요없이 "그냥 작동"할 수 있도록 pl 스크립트를 패키지합니다.PAR Packer가 독립 실행 형 스크립트를 생성 할 수 있습니까?

불행히도 PAR 패커는 깊은 종속성에 대해 작동하지 않습니다. 예를 들어, 스크립트는 CHI :: Driver :: File을 가져 오지만 CHI :: Driver :: File에 필요한 Log :: Any :: Adapter :: Null을 명시 적으로 가져 오지 않습니다. PAR는이 종속성을 선택하지 않고 생성 된 스크립트를 실행하면 다음과 같은 오류 메시지와 함께 충돌합니다 :

Can't locate Log/Any/Adapter/Null.pm in @INC (@INC contains: CODE(0x874aab8) /tmp/par-apache/cache-7b4508ab92efb43271da1629e8eb654c1572cc55/inc/lib /tmp/par-apache/cache-7b4508ab92efb43271da1629e8eb654c1572cc55/inc CODE(0x87e8f54) CODE(0x87e9194)) at (eval 215) line 3. 
Compilation failed in require at CHI/Driver/File.pm line 11. 
BEGIN failed--compilation aborted at CHI/Driver/File.pm line 11. 

내 해결 방법을 명시 적으로 "로그 :: 어떤 :: 어댑터 :: 널 (null)"를 가져 오는 것입니다 만이해야 더 나은 방법이 되십시오. 아마도 이것은 PAR Packer의 버그입니까? 최신 버전 (0.994)을 설치했습니다.

+3

패키지를 빌드하는 데 사용하는 명령 줄 옵션을 설명하십시오. –

+1

나는 각 pl 파일을 cgi로 개별적으로 컴파일하기 위해 스크립트를 사용하고있다. 다음 명령 줄 인수를 사용합니다. -I -X 및 -o – Jono

답변

1

독립 실행 형 스크립트를 독립 실행 형 바이너리 (pp의 기본 모드)가 아닌 독립 실행 형 스크립트로 만들려면 -P 옵션을 추가하십시오. 그래도 반대 할 것입니다. 최소한의 테스트를 거친 작동 모드입니다.

또한 PAR :: Packer는 깊은 종속성에 대해 작동합니다. 귀하의 질문에 대한 주제는 조금 사소한 것입니다. 사실, PAR :: Packer는 자체 의존성을 실제로 확인하지는 않지만 Module :: ScanDeps에 위임합니다. 이제 Module :: ScanDeps는 종속성 검색에 대한 경험적 접근 방식이며 종속성의 동적로드로 추악한 퍼지 (fuzzing)로 인해 손상 될 수 있습니다. (즉 런타임에 모듈 이름을 생성 한 다음 평가에서 사용함).

사실, sources for Log::Any (CHI :: Driver :: File에서 사용)을 보면 모듈의 동적로드를 사용하고 있음을 빠르게 알 수 있습니다. 이것이 :: Adapter :: Null 모듈이 선택되지 않는 이유입니다.

일반적으로 우리는 모듈 :: ScanDeps에 특별한 경우를 추가하여이 문제를 해결합니다. 저자는 모든 종류의 정적 분석을 무효화하는 것이 좋을 것이라고 생각했습니다. Module::ScanDeps의 고정 버전을 얻을 때까지 pp에 -c 또는 -x 옵션을 사용하여 종속 분석이 정적 분석에만 의존하는 대신 컴파일 또는 프로그램 실행을 사용하게 할 수 있습니다. 증강 된 Module :: ScanDeps 버전은 0.95이며 하루 내에 CPAN에서 사용할 수 있어야합니다.

+1

모듈 :: ScanDeps 0.95가 CPAN에 도착했습니다. Cf. http://search.cpan.org/dist/Module-ScanDeps/ – tsee

+1

대단히 감사합니다. Steffen, 아주 명확합니다. – Jono

+1

pp -c가 스크립트와 동일한 디렉토리에서 실행되어야한다는 것을 지적하고 싶습니다. 그렇지 않으면 잘못된 @INC로 끝날 것입니다 (다른 디렉토리에 존재하는 자신 만의 펄 모듈을 포함하고 있다는 것을 전제로합니다. BEGIN 블록을 사용하여 @INC 또는 "lib 사용"모듈을 푸시). 이렇게하면 pp -c를 사용하여 스크립트를 패키징하는 데 문제가 없습니다. – Jono

3

음, documentation을 읽으셨습니까? 의존성을 포함하는 수많은 명령 행 옵션을 제공하고 모듈을 수동으로 강제로 포함시키는 옵션조차도 제공합니다.

+0

Brad 감사합니다. 필자는 실제로 설명서를 읽었으며 문서에서 PAR 패커가 독립 실행 형 스크립트를 생성하기 위해 특정 플래그가 필요하다고 지정하지 않았습니다. 실제로 설명서에는 "PAR은 PAR에서 제공하는 압축 패키지 도구를 사용하여 Perl 프로그램에서 독립 실행 파일을 만들고 Module :: ScanDeps에서 제공하는 종속성 감지 방법을 사용합니다. 원본 파일은 컴파일없이 그대로 압축됩니다." 이것은 내가 찾고있는 것이지만 불행히도 작동하지 않습니다. 어떤 아이디어? – Jono