2009-09-14 18 views
21

Có bất kỳ điều gì tương đương hoặc gần về chức năng với Python virtualenv, nhưng đối với Perl?Làm cách nào để cài đặt các môi trường chuyên biệt cho các ứng dụng Perl khác nhau?

Tôi đã thực hiện một số phát triển bằng Python và khả năng cài đặt các phiên bản mô-đun không thuộc hệ thống trong môi trường riêng mà không tạo bất kỳ mớ hỗn độn nào là lợi thế lớn. Bây giờ tôi phải làm việc trên một dự án mới trong Perl, và tôi đang tìm một cái gì đó như virtualenv, nhưng đối với Perl. Bạn có thể đề nghị bất kỳ tương đương hoặc thay thế Perl nào cho virtualenv của python không?

Tôi đang cố gắng thiết lập X bộ gói Perl không thuộc hệ thống khác nhau để Y triển khai các ứng dụng khác nhau. Thậm chí tệ hơn, các ứng dụng này có thể yêu cầu các phiên bản khác nhau của cùng một gói, vì vậy mỗi ứng dụng có thể yêu cầu phải được cài đặt trong một môi trường mô-đun/thư viện riêng biệt. Bạn có thể muốn làm điều này bằng tay cho X < Y < 3. Nhưng bạn không nên làm điều này bằng tay trong vòng 10> Y> X.

Lý tưởng nhất là những gì tôi đang tìm kiếm nên làm việc như thế này:

perl virtualenv.pl my_environment 
. my_environment/bin/activate 
wget http://.../foo-0.1.tar.gz 
tar -xzf foo-0.1.tar.gz ; cd foo-0.1 
perl Makefile.pl 
make install # <-- package foo-0.1 gets installed inside my_environment 
perl -MCPAN -e 'install Bar' # <-- now package Bar with all its deps gets installed inside my_environment 
+0

Bạn có thể giải thích những gì bạn đang cố gắng làm không? –

+0

Tôi đang cố gắng thiết lập X bộ gói perl không thuộc hệ thống khác nhau để Y triển khai các ứng dụng khác nhau. Thậm chí tệ hơn, các ứng dụng này có thể yêu cầu các phiên bản khác nhau của cùng một gói, vì vậy mỗi ứng dụng có thể yêu cầu phải được cài đặt trong môi trường mô-đun/thư viện riêng biệt. Bạn có thể muốn làm điều này bằng tay cho X Y> X. Tôi đang tìm kiếm một công cụ sẽ tự động hóa và đơn giản hóa điều này, và nó xuất hiện mà địa phương :: lib chính xác là công cụ đó. – abbot

+0

Tôi không nghĩ rằng địa phương :: lib là những gì bạn đang tìm kiếm. Nếu bạn muốn mỗi ứng dụng trên cùng một máy chủ không chia sẻ bất kỳ thứ gì, nó sẽ không xử lý điều đó cho bạn mà không có nhiều công việc. –

Trả lời

21

Có một công cụ gọi là local::lib kết thúc tốt đẹp tất cả công việc cho bạn, giống như virtualenv. Nó sẽ:

  • Thiết lập @INC trong quá trình sử dụng.
  • Đặt PERL5LIB và những thứ khác cho quy trình con.
  • Đặt các biến phù hợp để thuyết phục CPAN, MakeMaker, Module::Build, v.v. để cài đặt thư viện và cấu hình cửa hàng trong thư mục cục bộ.
  • Đặt PATH để có thể tìm thấy các tệp nhị phân đã cài đặt.
  • Biến môi trường in thành giá trị khi sử dụng từ dòng lệnh để bạn có thể đặt eval $(perl -Mlocal::lib) trong số .profile và sau đó chủ yếu là quên nó.
+1

'perlbrew' đáng giá; http://perlbrew.pl –

1

Chương trình có thể sửa đổi những thư mục mà họ kiểm tra thư viện uwith use lib. Thư mục lib này có thể liên quan đến thư mục hiện tại. Các thư viện từ các thư mục này sẽ được sử dụng trước các thư viện hệ thống, vì chúng được đặt ở đầu mảng @INC.

Tôi tin rằng cpan cũng có thể cài đặt thư viện vào các thư mục cụ thể. Cấp, cpan rút ra từ CPAN site để cài đặt mọi thứ, vì vậy đây có thể không phải là lựa chọn tốt nhất.

+0

'@ LIB' không làm gì cả. ITYM '@ INC' – hillu

+0

Tôi biết về các tùy chọn này. Có, tôi biết, tôi có thể viết một số kịch bản đơn giản để khởi tạo cấu trúc thư mục và môi trường, thậm chí tôi có thể thuyết phục CPAN sử dụng cấu trúc thư mục đó và tôi có thể làm nhiều điều thú vị khác. Nhưng tôi cần phải làm điều này bằng tay. Một trong những tính năng chính của virtualenv là phần 'không tạo ra bất kỳ mớ hỗn độn' nào. Nó ẩn tất cả các bước thiết lập cấp thấp này và đơn giản hóa rất nhiều bằng cách sử dụng các môi trường như vậy. Tôi đang tìm cái gì đó tương tự cho Perl. Tôi chỉ đơn giản là không thể tin rằng nó không tồn tại. – abbot

+0

@hillu: er ... Rất tiếc, braino về phía tôi. – Powerlord

1

Tôi không chắc liệu điều này có giống với điều đó virtualenv điều bạn đang nói đến hay không, nhưng hãy tìm biến đặc biệt @INC trong trang man perlvar.

0

Điều tôi làm là bắt đầu vỏ CPAN (cpan) và cài đặt Perl 5.10 của riêng mình từ số (Tôi tin rằng lệnh này được cài đặt perl-5.10). Điều này sẽ yêu cầu cấu hình khác nhau cài đặt; Tôi chắc chắn để làm cho nó trỏ đến đường dẫn dưới/usr/local (hoặc một số vị trí cài đặt khác không phải là mặc định).

Sau đó, tôi đặt vị trí kết quả của nó trong $ PATH thực thi của tôi trước chuẩn perl và sử dụng vỏ CPAN để cài đặt các mô-đun tôi cần (thường là rất nhiều). Các tập lệnh Perl của tôi đều bắt đầu bằng dòng

#!/usr/bin/env perl 

Không bao giờ có vấn đề với cách tiếp cận này.

+0

Cài đặt Perl của riêng bạn không có trong tùy chọn nếu bạn cần 5-10 môi trường khác nhau. – abbot

+1

Bạn có nghĩa là nó không hoàn toàn tự động? Vâng, đó là một nhược điểm. Tôi chắc chắn rằng nó sẽ được dễ dàng để tự động hóa (chỉ là vấn đề tìm ra cách để cung cấp các lựa chọn cấu hình để cài đặt Perl), nhưng tôi không bao giờ làm điều đó. – reinierpost

+0

BTW Tôi luôn cài đặt phần mềm trong một thư mục con theo phiên bản cụ thể, sau đó sử dụng một cái gì đó như sắp xếp để liên kết một phiên bản vào một vị trí trong đường dẫn của tôi. Bằng cách đó tôi vẫn có thể sử dụng các phiên bản cụ thể khi cần thiết. – reinierpost

1

Tôi đã sử dụng schroot cho mục đích này. Đó là một chút nặng hơn virtualenv nhưng bạn có thể chắc chắn rằng không có gì sẽ bị rò rỉ trong đó không nên.

Schroot quản lý môi trường chroot cho bạn, nhưng gắn kết thư mục chính của bạn trong chroot để nó xuất hiện như phiên trình bao bình thường, chỉ sử dụng các tệp nhị phân và thư viện trong chroot.

Tôi nghĩ rằng đó có thể là debian/ubuntu.

Sau khi thiết lập các schroot, kịch bản của bạn ở trên sẽ giống như

schroot -c my_perl_dev 
wget ... 

Xem http://www.debian-administration.org/articles/566 cho một bài viết thú vị về nó

0

Dường như bạn chỉ cần sử dụng cấu hình INSTALL_BASE cho Makefile.PL (hoặc tùy chọn --install_base cho Build.PL)? Chính xác thì bạn cần giải pháp để làm gì cho bạn? Có vẻ như bạn chỉ cần tải mô-đun đã cài đặt ở đúng nơi. Bạn đã trình bày vấn đề của mình dưới dạng một số XY Problem bằng cách chỉ định suy nghĩ của bạn là giải pháp thay vì cho phép chúng tôi giúp bạn thực hiện nhiệm vụ của mình. Ví dụ:

Xem ví dụ How do I keep my own module/library directory? trong perlfaq8.

Nếu bạn đang tải xuống mô-đun từ CPAN, lệnh cpan mới nhất (trong App::Cpan) có công tắc -j để cho phép bạn chọn tệp cấu hình CPAN.pm thay thế. Trong các tệp cấu hình này, bạn có thể đặt các tùy chọn CPAN.pm để cài đặt ở bất cứ đâu bạn muốn.

Dựa trên làm rõ của bạn, có vẻ như địa phương :: lib có thể hoạt động cho bạn trong một trường hợp đơn giản, nhưng tôi làm điều này cho triển khai cường độ công nghiệp nơi tôi thiết lập CPAN tùy chỉnh cho mỗi ứng dụng và cài đặt trực tiếp từ CPAN tùy chỉnh. Xem mô-đun MyCPAN::App::DPAN của tôi, ví dụ. Từ đó, tôi sử dụng các cấu hình CPAN.pm tùy chỉnh phân tích môi trường của chúng và đặt các giá trị thích hợp cho mỗi ứng dụng có thể cài đặt mọi thứ trong một thư mục chỉ dành cho ứng dụng đó.

Bạn cũng có thể xem xét phân phối ứng dụng của mình dưới dạng Tác vụ ::. Bạn cài đặt nó giống như bất kỳ mô-đun Perl nào khác, nhưng các phụ thuộc chia sẻ cùng một thiết lập đó (tức là INSTALL_BASE).

+1

Tôi biết về tất cả những thứ này, nhưng nó khá thấp. Tôi muốn có một công cụ có thể nhanh chóng thực hiện tất cả các bước thiết lập/cấu hình mức thấp này chỉ với một lệnh đơn giản. Tôi biết rằng tôi đã trình bày điều này như một vấn đề XY, nhưng nếu bạn kiểm tra câu trả lời được chấp nhận thì bạn sẽ thấy rằng nó hoạt động gần như chính xác như tôi đã mô tả. Bạn nên tự mình thử giải pháp đó nếu bạn chưa làm. – abbot

+0

Tôi không thấy cách nó hoạt động cho bạn nếu bạn muốn cài đặt hơn 10 thiết lập khác nhau trên cùng một máy, như bạn nói trong nhận xét cho câu hỏi của riêng bạn. –

1

Ngoài ra thanh toán perl-virtualenv, điều này có vẻ là bao bọc xung quanh địa phương :: lib theo đề xuất của Hobbs, nhưng tạo thùng/kích hoạt và bin/hủy kích hoạt để bạn có thể sử dụng nó giống như công cụ python.

Tôi đã sử dụng nó khá thành công trong một tháng hoặc lâu hơn mà không nhận ra nó không phải là tiêu chuẩn như có lẽ nó nên.

Nó giúp dễ dàng thiết lập virtualenv làm việc cho perl hơn trong khi địa phương: lib sẽ cho bạn biết bạn cần đặt biến nào, vv. Perl-virtualenv tạo tập lệnh kích hoạt cho bạn.

2

Trong khi điều tra, tôi phát hiện ra điều này và một số trang khác (this one is too old và bỏ qua các công nghệ mới, this reddit post is a slight misdirect).

Vấn đề với perlbrew và plenv là chúng dường như thay thế cho pyenv, chứ không phải virtualenv. Như đã lưu ý here pyenv là để quản lý các phiên bản python, virtualenv là để quản lý các phiên bản mô-đun cho mỗi dự án. Vì vậy, vâng, theo một số cách tương tự như local::lib, nhưng với khả năng sử dụng tốt hơn.

Tôi đã không nhìn thấy một câu trả lời đúng cho câu hỏi này, nhưng từ những gì tôi đã đọc, có vẻ như là giải pháp tốt nhất là một cái gì đó dọc theo dòng:

  • Perl phiên bản quản lý: plenv/perlbrew (với hầu hết mọi người ưu bash plenv dựa hiện đại hơn so với perl dựa perlbrew từ những gì tôi có thể nhìn thấy)
  • Mô-đun phiên bản quản lý: Carton
  • cài đặt module: CPAN (tốt, cpanminus bất kỳ cách, YMMV)

Thành thật mà nói, đây không phải là một lý tưởng thiết lập, mặc dù tôi vẫn đang học, vì vậy nó có thể chưa được cấp trên. Nó không cảm thấy đúng. Nó chắc chắn không giống như thay thế cho virtualenv.

Có một vài bài đăng mà tôi đã tìm thấy "itispossible" nhưng chưa được thêm nữa.

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