2009-11-10 6 views
7

누군가가 실행을 위해 스크립트가 필요로하는 커스텀 (CPAN이 아닌) 모듈을 사용자가 알지 못하게하는 대신 어떻게 원시 (컴파일되지 않은/perl2exe/...) Perl 스크립트를 배포 할 수 있습니까?맞춤 모듈 오버 헤드없이 원시 펄 스크립트를 배포하는 방법은 무엇입니까?

문제는 사용자가 필연적으로 시스템의 어딘가에서 스크립트를 복사하고 원시 환경에서 스크립트를 가져와 더 이상 실행할 필요가없는 모듈을 찾을 수 없다는 것입니다.

모듈을 실제 스크립트에 복사하는 것으로 해결할 때가 있지만 때로는 더 깨끗한 솔루션을 선호합니다.

업데이트 : 더 명확하게 설명합니다. 백엔드에서 유사한 모듈을 사용하는 스크립트를 많이 배포합니다. 사용자는 Perl 스크립트를 실행하는 방법을 이해하지만 "스크립트를 이동하지 마십시오."라고 말하면 단순히 파일을 이동할 수있게하는 것이 좋습니다. 저항이 가장 적은 길.

+1

모듈이 특정 스크립트에 대해 비공개입니까? 아니면 여러 스크립트로 공유됩니까? 전자의 경우 일반적으로 * .pl 파일 옆에있는 lib 폴더에 모듈을 배치하여 구현됩니다. 후자는 사이트/lib 또는 PERL5LIB에있는 다른 위치에 모듈을 설치하는 것을 의미합니다. –

답변

4

클라이언트 용으로 준비된 스크립트에 "사용자 정의"모듈이 필요한 경우 모듈을 cpan에 업로드하려는 것처럼 모듈을 팩하십시오. 그런 다음 패키지를 클라이언트에 제공하면 cpan 유틸리티를 사용하여 스크립트와 모듈을 설치할 수 있습니다.

+0

흠 ... 어쩌면. 나는 "최종 사용자가 설치 후 * .pl을 이동"하는 것으로 문제를 읽습니다 (처음에는 설치 방법보다는 자체 포함 된 것으로 가정합니다). –

+4

"스크립트와 함께 모듈을 설치하는 방법"이라고 읽었습니다. 패키지가 스크립트 자체를 설치할 수도 있다는 사실은 IMHO의 또 다른 이점입니다. – innaM

+4

원래의 "설치"는 파일 간의 종속성을 인식하지 않고 "이 파일의 압축을 풀"로 구성되어 있다고 생각합니다. 설치가 더 복잡하다면 (예 : cpan을 호출하거나 설치 스크립트를 실행하면) .pl 파일을 이동하려는 유혹은 사라집니다. 필요 여부는 중요하지 않습니다. 복잡한 설치의 단순한 환영은 파일을 유지하기에 충분합니다. –

6

올바른 방법은 "하지 마!"라고 말하는 것입니다. 나는 그들이 exe 파일을 옮기고 그 프로그램이 계속 작동하기를 기대하지 않기를 바랄 것이다. 이것은 다르지 않다.

즉, 몇 가지 대안이 있습니다. 하나는 실제 스크립트에 대한 전체 경로를 알고있는 래퍼 (예 : pl2bat)로 스크립트를 대체하는 것입니다. 다른 하나는 PAR을 사용하는 것이지만 PAR 및/또는 par (PAR :: Packer의) parl을 설치해야합니다.

+0

+1 이것을 downvote 할 필요가 없습니다. OP의 요구 사항은 모순입니다. –

+0

나는 * 왜 * 누군가가 도움이되지 않는다는 점에 관해서는 의견을 보내 주시면 감사하겠습니다. –

+0

답변의 두 부분에 문제가있었습니다. 일반 IT 배경에서 볼 때 모호한 기술적 요구 사항을 수용하기 위해 알려진 사용자 동작이 변경 될 것으로 기대하는 것이 실용적이지는 않습니다. 또한 나는 공식적인 설치자가없는 exe 파일/system의 어디에서나 작동해야한다고 생각한다.프로그램에 외부 종속성이있는 경우 파일 시스템의 위치가 중요하지 않도록 적절하게 설치해야합니다. –

2

설치자을 스크립트와 함께 배포하십시오. 설치 프로그램은 루트 권한으로 실행해야하며 사용자 정의 모듈을 표준 시스템 위치 (/ usr/local/lib/perl5/site_perl 또는 기타)에 넣습니다.

나는 이것을 시도하지 않았지만 Module::Install이이 점에 도움이됩니다. 그것은 설명 것 :

독립, 확장 펄 모듈 설치

+0

응용 프로그램 관련 모듈을 시스템 전체 위치에 설치하는 것은 파일/네임 스페이스 충돌을 위험에 빠뜨릴 수있는 좋은 방법입니다. –

+2

나는 모든 것에 상충 관계가 있다고 생각하지만 약간의 사전 고려 사항은 Perl 모듈의 경우 네임 스페이스 충돌의 위험을 거의 없앨 수 있습니다. 저자는 자신의 이름이나 회사 이름을 기반으로 고유 한 가능성이 높은 최상위 네임 스페이스를 만들 수 있습니다. –

+0

Module :: Installer는 Module :: Build 또는 ExtUtils :: Makemaker에서 가져올 수없는 것을 실제로 수행하지 않습니다. –

0

당신은 단지 NeXTSTEP style application 번들을 사용할 수 있다면 정말 좋을 것이다. 번들을 사용하는 플랫폼 용으로 개발하지 않았기 때문에,해야 할 일이있을 것이다.

모든 지원 파일을 알려진 위치에두고 설정 파일 및 라이브러리에 액세스 할 수 있도록 실행 파일을 지정하십시오. 가장 쉬운 방법은 간단한 설치 프로그램을 사용하는 것입니다. 예를 들어

foo라는 응용 프로그램과 함께, 등등 /opt/xlyd_apps/foo/etc에, /opt/xlyd_apps/foo/lib에, /opt/xlyd_apps/foo에서 구성 라이브러리를 모든 필요한 파일을 넣어. 실행 파일을 /opt/xlyd_apps/foo/bin에 저장하십시오.

중요 사항은 실행 파일이 /opt/xlyd_apps/foo에서 모든 유용한 정보를 찾을 수 있는지 확인하는 것이므로 고객/클라이언트가 foo 스크립트를 새 위치로 이동하면 설치가 여전히 작동합니다.

그래서 모든 것을 자체 포함하고 재배치 할 수는 없지만 실제 호출 스크립트는 재배치 가능하게 만들었습니다.

+0

이것은 단순히 응용 프로그램에서 라이브러리 경로를 하드 코딩하는 것입니다. 이것은 플랫폼의 기능이 아니라면 아주 좋은 접근 방식이 아닌 것 같습니다. 간접적 인 단계를 추가하는 것이 사물을 건전하게 만들 수 있습니다. 사용자 정의 모듈을 some/opt ... 폴더에 넣고 사용자 정의 모듈에 대한 경로를 알고있는 시스템 라이브러리에 하나의 슈퍼 - 간단한 모듈 만 설치하십시오. 그렇게하면 경로를 여러 곳에서 하드 코딩하지 않아도됩니다. – tsee

2

"모듈을 모두 한 곳에 모아서 응용 프로그램에 알리면"여러 컴퓨터와 네트워크에서 작동하기 때문에 PAR::RepositoryPAR::Repository::Client을 확인해야합니다. 저장소 (파일 시스템 또는 https를 통해)에 연결하는 단일 바이너리 클라이언트 실행 파일을 제공하고 사용자가 요청한 저장소에서 제공하는 임의의 수의 프로그램 (임의의 모듈 세트 사용)을 실행합니다.

많은 사용자가있는 경우 유지 관리에도 이점이 있습니다. 저장소에서 제공하는 소프트웨어를 업데이트하기 만하면 다음에 프로그램을 시작할 때 시스템의 업데이트 된 코드를 사용하기 시작합니다.

+0

이런 모듈이 펄 모듈에 설치되어 있어야합니다. 아니면 완전 독립형인가? – dlamotte

+0

PAR :: Packer는 완전히 독립 실행 형 바이너리 실행 파일을 생성합니다. 그러나 모든 종속성을 응용 프로그램과 함께 패키지화합니다. 따라서 여러 응용 프로그램간에 코드를 공유하려는 경우 바람직하지 않을 수 있습니다. (PAR은이를 해결할 수있는 여러 가지 방법을 제공하지만 주석 길이가 부족합니다.) 저장소 시나리오에서는 단일 loader.exe를 제공하기 만하면 필요에 따라 저장소와 응용 프로그램을 가져올 수 있습니다. 또한 다음을 참조하십시오 : http://steffen-mueller.net/talks/appdeployment/ – tsee

-3

저는 실제로 내 자신의 해결책을 생각해 냈습니다. 어떤 종류의 응접이 있을지 궁금합니다.

필자는 perl 스크립트를 읽고 "use/require"문을 찾는 스크립트를 작성했습니다. 모듈을 찾으면 모듈이 표준 라이브러리의 일부인지 확인합니다 (/perl5/\d+./d+[\d.]+/에 대한 모듈 경로를 확인한 후) use/require 행을 다음 두 가지 방법으로 다시 작성합니다. 용법.

이 필요한 경우가 발견 : 사용가 발견

{ 
    ... inline the entire module here... 
} 

경우

BEGIN { import Module ...imports seen... } 
:

BEGIN { 
    ... inline the entire module here... 
} 

수입을 가지고 사용 경우, 바로 위에서 수행

이 점을 이해합니다. 은 XS를 사용하는 모듈에서 작동하지만,이 문제는 해결되지 않았습니다. 대부분 순수한 펄 모듈만을 지원해야합니다.

+0

Module :: ScanDeps에서 종속성 분석을하고 Module :: CoreList에서 기본 라이브러리와 함께 제공되는지 확인하십시오. – tsee

+0

CPAN 모듈을 사용하지 않는 이유 외에도 ...이 프로세스가 왜 불량입니까? 대답의 핵심은 모듈 텍스트를 스크립트에 인라인하는 것입니다. 당신은 나에게 이것이 왜 나쁜지에 대한 이유를주지 않았다. – dlamotte

+0

@xyld : 제대로 작동한다면 괜찮습니다. 하지만 XS 모듈을 포함하여 작동하지 않는 경우가 많습니다. 이 경로를 따라 갔을 때 정확한 모듈을 기억하지 못했지만 믿을만한 솔루션이 아닙니다. 당시에는 실제로 여러 가지 문제를 해결하기 위해 다소 정교한 코드를 작성했습니다. 그것을 끝내지 않고 내가 잘 알고있는 것을 잘 사용하기 위해 갔다. 나는 내 시도를 접할 때 알려주지. – tsee

관련 문제