2011-08-26 3 views
1

CGI.pm의 약간 수정 된 버전을 사용하는 Perl로 작성된 사용자 정의 사이트가 있습니다. 서버 업데이트 중에 CGI.pm이 업데이트되면 덮어 쓸 수 있습니다. 내 목표는 사이트에 영향을주지 않고 서버를 업데이트 할 수있게하는 것입니다. 즉, 수정 된 CGI.pm에 의존하는 코드를 변경하는 것입니다. 불행하게도 나는 펄 구문이나 모범 사례에 익숙하지 않다.CGI.pm에서 사용자 정의 코드 가져 오기

--- CGI.pm.orig Tue Nov 7 12:14:09 2006 
+++ CGI.pm  Tue Nov 7 12:13:29 2006 
@@ -3386,7 +3386,7 @@ sub read_multipart { 
       if (defined $self->{'.upload_hook'}) 
       { 
        $totalbytes += length($data); 
-     &{$self->{'.upload_hook'}}($filename ,$data, $totalbytes, $self->{'.upload_data'}); 
+     &{$self->{'.upload_hook'}}($filename ,$data, $totalbytes, $self->{'.upload_data'}, $param, $header{'Content-Type'}); 
       } 
       print $filehandle $data if ($self->{'use_tempfile'}); 
      } 

이 DIFF에 의존하는 코드는 다음과 같습니다 :

my %file_hash =(); 
my $page = new CGI(\&file_reader, \%file_hash, 0); 

my $session = &get_session($page); 


foreach my $param_name (keys %file_hash) { 
     my $notes_param = $param_name . "_notes"; 
     &store_file($file_hash{$param_name}, $page->param($notes_param), 
        &get_session_name($session)); 
} 
여기

수정 된 CGI.pmn의 DIFF (줄 번호는 CGI.pm의 최신 버전에서 꺼져)입니다

diff가 없으면 파일을 저장할 때 $ param_name 변수가 비어있는 것으로 보입니다.

이 문제를 해결하는 가장 좋은 방법은 무엇입니까? 이전에 말했듯이 내 주요 목표는 서버 업데이트를 단순화하는 것입니다. 어떤 방법이에 하나

A) (바람직))) CGI.pm B의 수정 된 버전없이 제대로 작동하려면 %의 file_hash를 얻을 수 CGI.pm 업데이트를 방지 (이것은 나쁜 생각

+0

CGI.pm은 혼란스럽고 당신 말이 맞습니다. 수정 된 버전이 없으면 더 낫습니다. diff에 대해서''$ param' 변수를 참조하는 다른 부분이 있습니까? 무엇이 포함되어 있습니까? 더 나은 방법은 수정 된 CGI를 스크랩하고 문제를 살펴 보는 것입니다. 무슨 일을 하려니, 왜'$ file_hash {param_name}'변수가 필요한가요? –

답변

6

원하는 개선 사항으로 CGI RT에 제출해 보셨습니까? 콜백에 및 \%header ($header{'Content-Type'} 대신)을 전달하는 것이 합당한 것으로 보입니다.

질문에 대답하려면 CGI를 로컬 디렉토리에 설치할 수 있습니다. PERL5LIB env var의 디렉토리가 먼저 검색되므로 우분투가 설치 한 디렉토리 대신 CGI 버전이 검색됩니다.

+0

이 정보는 도움이됩니다. PERL5LIB env 변수를 확인하려면 어떻게해야합니까? 'env'는 그 변수를 표시하지 않기 때문에 perl 환경 변수라고 가정합니다. 또한 CGI RT 큐는 어디에서 찾을 수 있습니까? 기본 질문에 대해 유감 스럽지만 Perl에 대한 경험이 거의 없습니다. – JohnB

+0

@ JohnB, Perl은 항상 그것을 확인하므로, 채우는 것 외에는 아무 것도 할 필요가 없습니다. CGI를'~/perl5/lib'에 설치하면 (이 경우'CGI.pm'을 넣기 만하면됩니다),'export PERL5LIB = "$ HOME/perl5/lib"'를 로그인 스크립트에 추가하십시오. 'PERL5LIB'는 [perlrun] (http://perldoc.perl.org/perlrun.html)에 문서화되어 있습니다. – ikegami

+1

@ JohnB, ug, 웹 서버에서 스크립트를 실행할 때 도움이되지 않습니다.'use lib "/ home/johnb/perl5/lib"; "를 스크립트에 추가하는 것은'PERL5LIB'를 사용하는 것의 대안이 될 것입니다. – ikegami

0

저는 CGI.pm 관리자입니다. CGI의 로컬 복사본을 사용하는 것보다 더 나은 옵션이 있다고 생각합니다. 대신 하위 클래스를 만들고 응용 프로그램에서 my 하위 클래스를 사용하십시오.

package My::CGI; 
use parent 'CGI'; 

sub my_sub_that_modified { 
    ... 
} 

1; 

그래서 수정 한 서브 루틴을 복사하면됩니다. CGI.pm을 업그레이드 할 때 수정 된 서브 루틴이 변경되지 않으면 응용 프로그램을 만질 필요가 없습니다.

"로컬 lib"옵션을 사용하면 보안 업데이트와 로컬 복사본에 추가 할 수있는 다른 변경 내용을 수동으로 병합해야합니다. 서브 클래스 라우트는이를 최소화합니다.

이 접근법의 예는 서브 클래스에서 몇 가지 변경을 수행하는 Bugzilla::CGI입니다.

관련 문제