Làm cách nào để sử dụng CPAN với tư cách là người dùng không phải root?


81

Tôi muốn cài đặt mô-đun perl trên một máy chủ dùng chung mà tôi không có quyền truy cập root. Tôi có thể làm cái này như thế nào? Họ dường như cũng có phiên bản CPAN cũ hơn (nó phàn nàn về điều đó khi chạy lệnh), liệu có thể cập nhật lệnh CPAN đang được sử dụng từ tài khoản của tôi mà không yêu cầu quyền truy cập root không?


Câu trả lời:


139

Phương pháp đơn giản nhất mà tôi tìm thấy cho đến nay là nói

wget -O- http://cpanmin.us | perl - -l ~/perl5 App::cpanminus local::lib
eval `perl -I ~/perl5/lib/perl5 -Mlocal::lib`
echo 'eval `perl -I ~/perl5/lib/perl5 -Mlocal::lib`' >> ~/.profile
echo 'export MANPATH=$HOME/perl5/man:$MANPATH' >> ~/.profile

Điều này giả định hồ sơ của bạn được đặt tên .profile, bạn có thể cần phải thay đổi đó là .bash_profile, .bashrc, vv Sau đó bạn có thể cài đặt các module bằng cách nói

cpanm Module::Name

và chỉ cần sử dụng chúng giống như cách bạn làm nếu chúng được cài đặt trong thư mục gốc.


Những gì sau đây là một giải thích ngắn gọn về những gì các lệnh trên làm.

wget -O- http://cpanmin.ustìm nạp phiên bản mới nhất của cpanmvà in phiên bản STDOUTđó sau đó được chuyển đến perl - -l ~/perl5 App::cpanminus local::lib. Thông báo đầu tiên -cho biết perlmong đợi chương trình đi vào hoạt động STDIN, điều này làm cho perlchạy phiên bản cpanmchúng tôi vừa tải xuống. perlchuyển phần còn lại của các đối số tới cpanm. Đối -l ~/perl5số cho biết cpanmnơi cài đặt mô-đun Perl và hai đối số còn lại là hai mô-đun cần cài đặt. [App::cpanmins] 1 là gói cài đặt cpanm. local::liblà một mô-đun trợ giúp quản lý các biến môi trường cần thiết để chạy các mô-đun trong thư mục cục bộ.

Sau khi các mô-đun đó được cài đặt, chúng tôi chạy

eval `perl -I ~/perl5/lib/perl5 -Mlocal::lib`

để đặt các biến môi trường cần thiết để sử dụng các mô-đun cục bộ và sau đó

echo 'eval `perl -I ~/perl5/lib/perl5 -Mlocal::lib`' >> ~/.profile

để đảm bảo chúng tôi sẽ có thể sử dụng chúng vào lần đăng nhập tiếp theo.

echo 'export MANPATH=$HOME/perl5/man:$MANPATH' >> ~/.profile

hy vọng sẽ khiến người đàn ông tìm thấy các trang người dùng cho các mô-đun cục bộ của bạn.


1 cho cpanminus ... không bao giờ sử dụng nó vì vậy không thể có cảm giác như tôi nên khuyên nó, nhưng tôi thích nó từ những gì tôi thấy trên SO cho đến nay
DVK

7
Điều này đã được làm việc tuyệt vời cho tôi. Chỉ cần một lưu ý nhỏ là xóa đầu tiên mọi biến môi trường PERL5LIB hiện có đã có trong ~ / .profile của bạn (hoặc bất cứ thứ gì). Nếu không local :: lib sẽ không cài đặt được khi chạy lệnh đầu tiên.
Juan A. Navarro

@juannavar Điểm tốt, tôi có xu hướng cài đặt nó trên các máy mới cài đặt, vì vậy tôi không gặp trường hợp đó.
Chà. Owens

Ví dụ tuyệt vời sử dụng wget thay vì curl - nhiều hệ thống không đi kèm với curl theo mặc định mặc dù chúng có wget, vì vậy điều này rất hữu ích cho những người không có root để cài đặt các gói mới.
AndrewPK

1
@HielkeWalinga Các quy trình con không thể sửa đổi môi trường của các quy trình mẹ. Để giải quyết vấn đề này, các lệnh như perl -I ~/perl5/lib/perl5 -Mlocal::libhoặc lệnh ssh-agentcần thiết lập các biến môi trường cho quy trình mẹ sẽ in ra các lệnh cần được chạy trong quy trình mẹ và sau đó cho bạn evalchúng. Bạn thực sự không cần đến evalchúng. Bạn có thể nói perl -I ~/perl5/lib/perl5 -Mlocal::lib > /tmp/commands; source /tmp/commands, nhưng phương thức eval sạch hơn (không có tệp nào để dọn dẹp hoặc vô tình ghi đè).
Chà. Owens

12

http://web.archive.org/web/20120427144232/http://perl.jonallen.info/writing/articles/install-perl-modules-without-root

http://novosial.org/perl/life-with-cpan/non-root/

Bước chính trong cả hai bộ hướng dẫn liên quan đến mô-đun local :: lib

AFAIK, logic CPAN được chứa trong mô-đun Perl (CPAN.pm), có nghĩa là bạn cũng có thể dễ dàng cài đặt mô-đun mới hơn trong thư mục cục bộ của mình như cách bạn làm với bất kỳ mô-đun Perl nào khác.


Ngoài ra, khi bạn cài đặt mô-đun của mình ở vị trí không chuẩn, hãy xem hai câu hỏi sau về tải thư viện từ các vị trí không chuẩn (một số thông tin đã có sẵn trong liên kết ở trên):

Làm thế nào để một chương trình Perl biết nơi để tìm tệp chứa mô-đun Perl mà nó sử dụng?

Perl's @INC được xây dựng như thế nào? (hay còn gọi là Tất cả các cách ảnh hưởng đến nơi mà các mô-đun Perl được tìm kiếm là gì?)


Tiết lộ - Tôi là tác giả của cả hai câu hỏi SO được liên kết trong câu trả lời này.
DVK

2
Có ít nhất bốn cách khác nhau để cài đặt mô-đun từ CPAN: bằng tay, mô-đun CPAN (và dòng lệnh tương đương cpan), CPANPLUSmô-đun (và dòng lệnh tương đương của nó cpanp) và cài đặt bản phân phối App :: cpanminus mới cpanm. Trong số này, tôi thấy cpanmlà dễ cài đặt và sử dụng nhất. cpancpanpđược cài đặt theo mặc định, nhưng yêu cầu thiết lập quan trọng để hoạt động chính xác.
Chà. Owens

404: Không tìm thấy URL / write / posts / install-perl-modules-without-root được yêu cầu trên máy chủ này.
harschware

6

Cho đầy đủ, đây là quá trình cài đặt của cpanmtrên OSX nếu bạn muốn giữ bạn perl5dưới ~/Library.

curl -L http://cpanmin.us | perl - -l ~/Library/perl5 App::cpanminus local::lib
eval `perl -I ~/Library/perl5/lib/perl5 -Mlocal::lib=~/Library/perl5`
echo 'eval `perl -I ~/Library/perl5/lib/perl5 -Mlocal::lib=~/Library/perl5`' >> ~/.bash_profile

2

Nếu bạn cũng muốn có thể đọc các trang người dùng cho các mô-đun được cài đặt cpanminus, bạn cũng nên đảm bảo rằng thư mục con chính xác của đường dẫn thư viện đã chọn nằm trong MANPATH. Vì vậy, giải pháp trên cho thấy quá trình cài đặt cpanm cần thêm lệnh sau:

 export MANPATH=$HOME/Library/perl5/man:$MANPATH' >> ~/.bash_profile

0

chúng tôi đã sử dụng func sau đây trong suốt 6 tháng qua trên hơn 20 lần triển khai, triển khai tự động thành công cho aws ... được gọi từ cung cấp chính như sau , về cơ bản chỉ là bản sao dán của các câu trả lời ở trên, nhưng trong một lần tái tập lệnh bash có thể sử dụng:

 #! /usr/bin/env bash                                                                                                                                                     │··  
                                                                                                                                                                           │··
  # a bash wrapper for check-installing required perl modules as non-root  
main(){                                                                                                                                                                  │··
     doSetVars                                                                                                                                                             │··
     doCheckInstallPreReqs                                                                                                                                                 │··
     perl $PRODUCT_INSTANCE_DIR/src/perl/my-perl-script.t                                                                                                                          │··
  }                                                                                                                                                                        │··
                                                                                                                                                                           │··
  doSetVars(){                                                                                                                                                             │··
     #set -x                                                                                                                                                               │··
     umask 022    ;                                                                                                                                                        │··
     set -u -o pipefail                                                                                                                                                    │··
     run_unit_bash_dir=$(perl -e 'use File::Basename; use Cwd "abs_path"; print dirname(abs_path(@ARGV[0]));' -- "$0")                                                     │··
     export PRODUCT_INSTANCE_DIR=$run_unit_bash_dir/../..                                                                                                                  │··
  }                                                                                                                                                                        │··
                                                                                                                                                                           │··
  doCheckInstallPreReqs(){                                                                                                                                                 │··
     eval `perl -I ~/perl5/lib/perl5 -Mlocal::lib`                                                                                                                         │··
     perl -e '                                                                                                                                                             │··
        use JSON ;                                                                                                                                                         │··
        use Data::Printer;                                                                                                                                                 │··
        use Test::Most ;                                                                                                                                                   │··
        use Test::Mojo;                                                                                                                                                    │··
        use Data::Printer ;                                                                                                                                                │··
        use FindBin;                                                                                                                                                       │··
        use JSON::Parse ;                                                                                                                                                  │··
        use IPC::System::Simple ;                                                                                                                                          │··
        use Mojolicious ;                                                                                                                                                  │··
     ' || {                                                                                                                                                                │··
           curl -L http://cpanmin.us | perl - -l ~/perl5 App::cpanminus local::lib                                                                                         │··
           eval `perl -I ~/perl5/lib/perl5 -Mlocal::lib`                                                                                                                   │··
           echo 'eval `perl -I ~/perl5/lib/perl5 -Mlocal::lib`' >> ~/.bashrc                                                                                               │··
           cpanm --local-lib=~/perl5 local::lib && eval $(perl -I ~/perl5/lib/perl5/ -Mlocal::lib)                                                                         │··
           export PERL_MM_USE_DEFAULT=1                                                                                                                                    │··
           cpanm JSON Data::Printer Test::Most Test::Mojo Data::Printer FindBin JSON::Parse \                                                                              │··
              IPC::System::Simple                                                                                                                                          │··
           sudo curl -L cpanmin.us | perl - Mojolicious                                                                                                                    │··
     }                                                                                                                                                                     │··
                                                                                                                                                                           │··
  }                                                                                                                                                                        │··
                                                                                                                                                                           │··
  main
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.