2009-09-12 38 views
5

Tôi có một kịch bản Perl (foo.pl) mà tải Foo.pm từ cùng một thư mục bằng cách sử dụng đòi hỏi cơ chế:Làm cách nào để phân phối ứng dụng Perl của tôi dưới dạng một tệp?

require "./Foo.pm"; 
... 
my $foo = new Foo::Bar; 

Các Foo.pm tuân thủ các định dạng mô-đun tiêu chuẩn:

package Foo::Bar; 
... 
1; 

Thay vì phân phối ứng dụng của tôi dưới dạng hai tệp (foo.pl và Foo.pm), tôi chỉ muốn phân phối một tệp. Cụ thể hơn, tôi muốn làm cho phần Foo.pm của tập lệnh foo.pl.

Làm cách nào để đạt được điều đó?

Cách tiếp cận nhỏ nhặt đơn giản là hợp nhất hai tệp (cat foo.pl Foo.pm> foo2.pl) không hoạt động.

Trả lời

3

Mã của bạn không làm việc (mặc dù nó đã rất hữu ích để nêu được thông báo lỗi (s) mà bạn đã nhận được) vì bạn đã cố gắng sử dụng Foo :: Bar trước khi nó được xác định. Hãy thử điều này:

use strict; 
use warnings; 
my $foo = Foo::Bar->new(); 
# more code... 

# end code 

# begin definitions 
BEGIN { 
    package Foo::Bar; 
    use strict; 
    use warnings; 
    # definitions... 
    1; 

    package Foo::Baz; 
    # more stuff, if you need to define another class 
} 

bổ sung:

2

Sơ đồ tổng thể sẽ thay thế "yêu cầu ..." của bạn bằng nội dung của những gì bạn đang yêu cầu. Có nhiều hơn thế (BEGIN {} có thể cần thiết), và tôi không chắc chắn những gì có liên quan. Để chắc chắn, bạn muốn tự động hóa nó.

Dưới đây là một sự thay thế: tạo ra một tập tin thực thi duy nhất mà module bạn phụ thuộc vào được đóng gói bên trong nó bằng cách sử PAR/pp

+0

Hi wrang-wrang! Cảm ơn vì những lời khuyên. Thật không may khi tạo một tệp thực thi không phải là một tùy chọn vì cùng một tập lệnh sẽ được sử dụng trên nhiều nền tảng. – knorv

+1

knorv: Nếu bạn không bao gồm bất kỳ mô-đun nào có thành phần XS/C/được biên dịch, PAR có thể tạo các tệp .par là nền tảng chéo. Đây không phải là tệp nhị phân có thể thực thi được với "pp -o foo.exe foo.pl". – tsee

4

Một tập tin có thể chứa nhiều gói. Đặt lớp học của bạn lên trước, theo sau là tập lệnh chính:

package Foo::Bar; 

sub new { 
    my $class = shift; 
    return bless {}, $class; 
} 

#... 

package main; 

my $foo = Foo::Bar->new(); 
print ref $foo; # Foo::Bar 
+3

Câu lệnh 'package' không tạo ra một phạm vi mới, vì vậy bạn có thể muốn sử dụng' {package Foo :: Bar; REST_OF_THE_CODE} 'để giữ cho các công cụ không bị rò rỉ giữa hai gói. –

2

Bạn đã có một vài câu trả lời hay. Ngoài ra, có thể tạo mô-đun hơn là có thể chạy trực tiếp dưới dạng tập lệnh.

package Foo; 

__PACKAGE__->run(@ARGV) unless caller(); 

sub run { 
    # Do stuff here if you are running the Foo.pm as 
    # a script rather than using it as a module. 
} 

Để biết thêm chi tiết, xem brian d foy's How a Script Becomes a Module.

5

Nếu bạn quan tâm đến đóng gói lên kịch bản Perl của bạn thành một nhị phân với tất cả các module nó phụ thuộc vào bao gồm, bạn có thể sử dụng PAR Packager:

pp -o binary_name foo.pl 
Các vấn đề liên quan