2008-12-11 41 views
26

Tôi muốn một nhà phát triển khác chạy một kịch bản Perl mà tôi đã viết. Kịch bản lệnh sử dụng nhiều mô-đun CPAN phải được cài đặt trước khi kịch bản có thể chạy được. Có thể tạo kịch bản (hoặc số nhị phân perl) để kết xuất danh sách tất cả các mô-đun bị thiếu không? Perl in ra tên của các mô-đun còn thiếu khi tôi cố gắng chạy tập lệnh, nhưng điều này là tiết và không liệt kê tất cả các mô-đun bị thiếu cùng một lúc. Tôi muốn làm điều gì đó như:Làm cách nào để tìm phụ thuộc vào mô-đun của tập lệnh Perl?

$ cpan -i `said-script --list-deps` 

Hoặc thậm chí:

$ list-deps said-script > required-modules # on my machine 
$ cpan -i `cat required-modules` # on his machine 

Có một cách đơn giản để làm điều đó? Đây không phải là trình hiển thị, nhưng tôi muốn làm cho cuộc sống của nhà phát triển khác dễ dàng hơn. (Các mô-đun được yêu cầu được rải rác trên nhiều tệp, để tôi không dễ dàng tạo danh sách bằng tay mà không bỏ sót bất kỳ thứ gì. Tôi biết về PAR, nhưng có vẻ hơi quá phức tạp đối với những gì tôi muốn.)


Cập nhật: Cảm ơn, Manni, điều đó sẽ làm. Tôi không biết về %INC, tôi chỉ biết về @INC. Tôi giải quyết với một cái gì đó như thế này:

print join("\n", map { s|/|::|g; s|\.pm$||; $_ } keys %INC); 

nào in ra:

Moose::Meta::TypeConstraint::Registry 
Moose::Meta::Role::Application::ToClass 
Class::C3 
List::Util 
Imager::Color 
… 

Trông như thế này sẽ làm việc.

Trả lời

18

Bạn có thể đổ %INC ở cuối tập lệnh. Nó sẽ chứa tất cả các mô-đun được sử dụng và được yêu cầu. Nhưng tất nhiên, điều này sẽ chỉ hữu ích nếu bạn không yêu cầu các mô-đun có điều kiện (yêu cầu Foo nếu $ bar).

24

Khám phá Module::ScanDeps và tiện ích "scandeps.pl" đi kèm với nó. Nó có thể thực hiện phân tích tĩnh (và đệ quy) mã của bạn cho các phụ thuộc cũng như phần trăm% INC sau khi biên dịch hoặc chạy chương trình.

Xin lưu ý rằng quét nguồn tĩnh luôn luôn sai lệch ở phía bên trong bao gồm quá nhiều phụ thuộc. (Đây là máy quét phụ thuộc được sử dụng bởi PAR và nhằm mục đích dễ dàng nhất đối với người dùng cuối.)

Cuối cùng, bạn có thể chọn phân phối tập lệnh dưới dạng phân phối CPAN. Nghe có vẻ phức tạp hơn nhiều so với thực tế. Bạn có thể sử dụng một cái gì đó như Module::Starter để thiết lập bộ xương cơ bản của một ứng dụng dự kiến ​​:: Phân phối MyScript. Đặt tập lệnh của bạn vào thùng/thư mục con và chỉnh sửa Makefile.PL để tham chiếu tất cả các phụ thuộc trực tiếp của bạn. Sau đó, để phân phối bạn làm:

  1. perl Makefile.PL
  2. làm
  3. làm quận

Bước cuối cùng tạo ra một đẹp App-YourScript-VERSION.tar.gz Bây giờ, khi khách hàng muốn cài đặt tất cả các phụ thuộc, anh ta thực hiện như sau:

  1. Cài đặt máy khách CPAN chính xác. Đơn giản chỉ cần chạy nó và trả lời các câu hỏi. Nhưng dù sao thì bạn cũng cần nó.
  2. "tar -xz App-YourScript-VERSION.tar.gz & & cd App-YourScript-VERSION"
  3. Chạy "cpan".

Máy khách CPAN sẽ tự động cài đặt tất cả các phụ thuộc trực tiếp và phụ thuộc của các bản phân phối đó. Tùy thuộc vào cách bạn thiết lập nó, nó sẽ hoặc là làm theo các điều kiện tiên quyết đệ quy tự động hoặc nhắc nhở với một y/n mỗi lần.

Ví dụ về điều này, bạn có thể xem một số bản phân phối ứng dụng :: * trên CPAN. Tôi nghĩ App :: Ack là một ví dụ tốt. Có thể một trong các bản phân phối ứng dụng :: * từ thư mục CPAN của tôi (SMUELLER).

+0

Không, quét nguồn tĩnh không phải lúc nào cũng sai về phía bao gồm quá nhiều phụ thuộc. Nó cũng có thể bỏ lỡ những thứ như 'eval 'yêu cầu $ module" ', trong đó' $ module' được tính theo thời gian chạy dựa trên một số tiêu chí. – cjm

13

Để sử dụng nhanh và không thường xuyên, %INC là cách tốt nhất để sử dụng. Nếu bạn phải làm điều này với thử nghiệm tích hợp liên tục hoặc một cái gì đó mạnh mẽ hơn, có một số công cụ khác để trợ giúp.

Steffen đã đề cập đến Mô-đun :: ScanDeps.

Mã trong Test::Prereq thực hiện điều này, nhưng nó có lớp bổ sung đảm bảo rằng Makefile.PL hoặc Build.PL liệt kê chúng dưới dạng phụ thuộc. Nếu bạn tạo scripts look like a normal Perl distribution, điều này giúp bạn kiểm tra các phụ thuộc mới một cách khá dễ dàng; chỉ cần chạy lại bộ thử nghiệm.

Ngoài ra, bạn có thể sử dụng công cụ như Module::Extract::Use, phân tích mã tĩnh tìm kiếm sử dụng và yêu cầu câu lệnh (mặc dù nó sẽ không tìm thấy chúng trong chuỗi evals). Điều đó giúp bạn chỉ có các mô-đun bạn đã nói với kịch bản của bạn để tải. Ngoài ra, một khi bạn biết mô-đun nào bạn đã tải, bạn có thể kết hợp với công cụ CPANdeps của David Cantrell đã tạo ra cây phụ thuộc cho hầu hết các mô-đun CPAN.

Lưu ý rằng bạn cũng phải suy nghĩ về các tính năng tùy chọn. Mã của bạn trong trường hợp này tôi không có họ, nhưng đôi khi bạn không tải một mô-đun cho đến khi bạn cần nó:

 
sub foo 
    { 
    require Bar; # don't load until we need to use it 
    .... 
    } 

Nếu bạn không tập thể dục tính năng mà trong chạy thử hoặc kiểm tra, bạn sẽ không thấy rằng bạn cần Bar cho tính năng đó. Một vấn đề tương tự xuất hiện khi một mô-đun tải một tập các mô-đun phụ thuộc khác nhau vào một môi trường khác (ví dụ: mod_perl hoặc Windows, v.v.).

Không có cách nào tốt, tự động kiểm tra các tính năng tùy chọn như vậy để bạn có thể nhận được các phụ thuộc của họ. Tuy nhiên, tôi nghĩ rằng nên có trong danh sách Công việc của tôi vì nó có vẻ như là một vấn đề thú vị.

6

Một công cụ khác trong khu vực này, được sử dụng bởi Dist :: Zilla và plugin AutoPrereqs, là Perl::PrereqScanner. Nó cài đặt một chương trình scan-perl-prereqs sẽ sử dụng PPI và một vài plugin để tìm kiếm hầu hết các loại khai báo trước, sử dụng các phiên bản tối thiểu bạn xác định. Nói chung, tôi đề nghị điều này qua quét %INC, có thể mang lại các yêu cầu không có thật và bỏ qua các phiên bản.

+0

Điều này phù hợp với luồng công việc của tôi tốt hơn nhiều so với 'scandeps'.Nó chỉ cho tôi những cái tên mà tôi đã cố ý đưa vào. (Phụ thuộc phần lớn là không quan tâm, kể từ khi trình cài đặt hiện đại xử lý chúng cho bạn.) –

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