2014-09-02 12 views
10

Tôi đã sử dụng địa phương :: lib để xử lý cài đặt mô-đun Perl trên máy chủ để tôi có thể có được phiên bản phù hợp cho một số công việc phát triển mà không gây ô nhiễm cài đặt hệ thống.Nâng cấp tất cả các mô đun được cài đặt bởi local :: lib

Tuy nhiên, quản trị viên hệ thống gần đây đã nâng cấp Perl từ 5,16 lên 5,18 và hiện tôi đang gặp lỗi liên quan đến các mô-đun nhị phân, ví dụ:

perl -e 'use Scalar::Util' 
Perl API version v5.16.0 of List::Util does not match v5.18.0 at /usr/lib64/perl5/5.18.2/XSLoader.pm line 92. 
Compilation failed in require at /home/paul/perl5/lib/perl5/x86_64-linux/Scalar/Util.pm line 11. 
Compilation failed in require at -e line 1. 
BEGIN failed--compilation aborted at -e line 1. 

sự hiểu biết của tôi là tôi có thể sửa chữa vấn đề bằng cách buộc địa phương :: lib để xây dựng lại tất cả các module của nó, nhưng tôi không thể tìm thấy bất cứ điều gì trong tài liệu mà nói với tôi như thế nào để làm điều này, hoặc thậm chí như thế nào để có được danh sách tất cả các mô-đun đã được cài đặt bằng cách sử dụng local :: lib (nếu tôi có trong tệp văn bản 'một mô-đun trên mỗi dòng', tôi có thể dễ dàng viết một tập lệnh Bash để xử lý nó).

Điều này có thể, hoặc tôi phải xóa thư mục ~/perl5 và cài đặt lại tất cả các mô-đun từ đầu (có thể thiếu một số vì tôi không thể nhớ tất cả)?

Trả lời

5

Cập nhật: Đã tạo một cấu trúc thư mục tốt hơn tránh được sự cố này cho lượt cài đặt mới.

Và đó là lý do quy ước perl Makefile.PL INSTALL_BASE=... (và số tương ứng cho Build.PL) được sử dụng bởi cài đặt :: lib sucks.

Xóa (hoặc đổi tên thư mục để bạn có dự phòng) là giải pháp dễ nhất. Bạn có thể tìm hiểu những gì bạn đã cài đặt bằng cách tìm kiếm các tệp .pm.

cd ~ 
mv perl5{,16} 
cd perl516/lib/perl5 
find -name '*.pm' | xargs perl -MConfig -E' 
    for (@ARGV) { 
     s!^\./!!; 
     s!^5\.\d+\.\d+/!!; 
     s!^x86_64-linux/!!; 
     s!^auto/!!; 
     s!\.pm\z!!; 
     s!/!::!g; 
     say; 
    } 
' | xargs cpan 

(Thực hiện chạy khô — một mà không có các dấu | xargs cpan — đầu tiên.)

Lưu ý rằng nếu bạn không muốn được ở lòng thương xót của nâng cấp của admin, bạn có thể sử dụng perlbrew dễ dàng cài đặt một toàn bộ xây dựng của Perl trong thư mục nhà của bạn.

+1

+1 để đề cập đến bản sao lưu :-) và ['perlbrew'] (http://www.perlbrew.pl). –

+2

+1 để đề cập: 'được sử dụng bởi cài đặt :: lib sucks' :) – jm666

+1

+1 @ jm666 cho hài hước –

1

Nếu bạn đang sử dụng cpanm bạn có thể buộc nó để xây dựng lại các module ở vị trí local::lib của bạn bằng cách sử dụng các -L--reinstall tắc:

list_modules | cpanm -L ~/perl5 --reinstall

nơi list_modules là một kịch bản mà nguồn cấp dữ liệu tên của mô-đun để cpanm (cũng có một tùy chọn -f để cpanm). Kịch bản này có thể giống như @ ikegami ở trên hoặc một cái gì đó như cpan-outdated (chỉ liệt kê các mô-đun đã lỗi thời). Dưới đây là một nỗ lực hack mà hầu hết đã làm việc cho tôi gần đây (lưu ý: ikegami có thể tốt hơn) - khi nó không thành công hoặc tập lệnh cung cấp cpanm tên mô-đun mà nó không nhận ra, cpanm tiếp tục và dường như không làm hỏng bất kỳ thứ gì (nhưng thực hiện sao lưu):

cd $PERL_LOCAL_LIB_ROOT 
perl -MFile::Find -MConfig -E' 
     find { 
     wanted => sub { 
         $mod = $_ if /\.pm\z/; 
         $mod =~ s/lib\/perl5\/auto\/.*//g; 
         $mod =~ s/lib\/perl5\/\Q$Config{archname}\E\/.*//g; 
         $mod =~ s/lib\/perl5\///g; 
         push @mods, $mod unless $mod =~ /^$/; 
         },no_chdir=>1 
      },"lib/perl5"; @modhash{@mods}=(); say for sort keys %modhash ' 

bằng cách thay đổi ở đâu và những gì File::Find phát hiện với wanted() bạn có thể ăn một danh sách khác nhau của mô-đun để cpanm. Sẽ rất tuyệt nếu cpan hoặc cpanm có một số _method hoặc -switch nội bộ cho phép bạn buộc xây dựng lại local::lib các mô-đun đã cài đặt sử dụng XS. Có một điều như vậy?

Đó là cpanm, carton (và nhìn thấy những công cụ node.jsnpm trong hành động) mà cảm hứng cho tôi để làm nhiều hơn local::lib cài đặt dựa. Bây giờ CORE đi kèm với "CPAN client" mà tàu với perl (cpan) dường như nhận được nhiều automagical và dễ dàng hơn để sử dụng là tốt. Tôi thực sự thích local::lib vì nó cho phép bạn sử dụng hệ thống perl nhưng quản lý ngăn xếp mô-đun của riêng bạn mà không có đặc quyền mức hệ thống. Tuy nhiên, có thể dễ dàng hơn để quản lý các thay đổi và nâng cấp nếu bạn sử dụng perlbrew để chạy một "hệ thống không" ("địa phương") perl. Tất nhiên bạn có thể làm điều này vẫn còn có local::lib, cartonvv. quản lý một thư mục hoặc ứng dụng cụ thể chồng các mô-đun.

1). Một cách khác để nâng cấp là sử dụng perllocal để tạo danh sách các mô-đun hiện đang được cài đặt của bạn (NB Tôi không hoàn toàn chắc chắn nếu perllocal.pod được giữ ở trạng thái đáng tin cậy/hữu ích). [Chỉnh sửa: Thực tế, perllocal giữ lịch sử của các mô-đun đã cài đặt của bạn thay vì danh sách các mô-đun hiện tại được cài đặt. Bạn sẽ muốn lọc này hoặc bạn sẽ kết thúc cài đặt lại toàn bộ các phiên bản mô-đun sau cái khác!). Nút perlmonks này cho biết cách làm sạch perllocal.pod: http://www.perlmonks.org/?node_id=483020 của bạn. Tôi thích giữ lịch sử. ]

Để phân tích perllocal.pod cho đầu vào để cpanm, tìm kiếm thông qua các tập tin và tiết kiệm các trận đấu trong một mảng, sau đó tách chúng bằng hai để tạo ra một hash từ các phần tử mảng (key,value,key,value). Số cài đặt và số phiên bản gần đây thấp hơn trong tệp, vì vậy, bạn có thể tạo băm có tên mô-đun làm khóa và có các giá trị được cập nhật bởi các mục sau:

perl -ne 'push @arr, grep {defined} 
(/\A=head2.*:\s+C<Module>\s+L<(.*)\||.*C<VERSION:\s(.*)>\Z/msx); }{ 
%h = map{ split/,/,$_,2 } @arr; print "$_\@$h{$_}\n" for keys %h' perllocal.pod 

(NB: this check error - entries) trong perllocal.pod đôi khi thiếu VERSION dữ liệu và các số lẻ khác nên hãy cẩn thận.)

2). Nhưng phương thức này được so sánh với kịch bản lệnh được đề cập bởi ilmari trong # perl-help trên IRC. Nó sử dụng jq - tiện ích dòng lệnh bạn thực sự cần phải có (bạn sẽ muốn nó sau này). Nếu bạn đã sử dụng cpanm để cài đặt mô-đun của mình, nó sẽ tạo các tệp install.json. Bạn có thể tận dụng điều đó để làm cho danh sách để nuôi để cpanm cho cài đặt lại thiết lập hiện tại của bạn module:

find ~/perl5/ -name install.json -exec jq '.name + "@" + .version' {} + 

Rất nhanh, rất đơn giản và bạn có thể kết hợp nó với các phương pháp cpanm của việc sử dụng curl để tự cài đặt để xây dựng lại mô-đun của bạn.

3). Nếu bạn sử dụng perlbrew để quản lý cài đặt perl, bạn có thể easily copy and reinstall tất cả các mô-đun của mình từ một phiên bản perl sang phiên bản khác.

HTH!

+0

@ikegami cảm ơn bạn đã chỉnh sửa :-) –

+1

Tôi đã thực hiện thay đổi tương tự với tôi, nhưng tôi đã hoàn nguyên. Chúng ta muốn 'archname' của Perl được cài đặt ban đầu (' x86_64-linux'), không phải là cái hiện đang được cài đặt (có thể khác nhau). Tôi sẽ để nó cho bạn những gì bạn muốn mã của bạn được. – ikegami

+0

uh oh điều này có nghĩa là tôi phải nhớ sự khác biệt giữa '/ usr/local/lib/perl5/site_perl/5.16/mach /' và '$ HOME/perl5/lib/perl5/amd64-freebsd-thread-multi'. .. :-) Dù sao tôi thấy vấn đề về gà/trứng liên quan đến việc nâng cấp có thể xảy ra. Tôi khá thích phương pháp backup/cài đặt lại đơn giản của bạn với 'mv perl5 {, 16}' và 'find' –

Các vấn đề liên quan