2009-09-12 4 views
5

I必要な機構を使用して同じディレクトリからFoo.pmをロードするPerlスクリプト(foo.pl)を有する:Perlアプリケーションを1つのファイルとして配布するにはどうすればよいですか?

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

Foo.pmが標準モジュール形式に準拠:

package Foo::Bar; 
... 
1; 

私のアプリケーションを2つのファイル(foo.plとFoo.pm)として配布するのではなく、1つのファイルしか配布しません。具体的には、foo.pmをfoo.plスクリプトの一部にしたいと思います。

どのように達成できますか?

単純に2つのファイル(cat foo.pl Foo.pm> foo2.pl)をマージする簡単な方法は機能しません。

答えて

3

を使用して、その中にパックされている単一の実行可能ファイルを生成する(あなたのことをエラーメッセージ(複数可)を述べることを参考にされているだろうが、受け取った)あなたがFoo :: Barを定義しようとする前にそれを使用しようとしたからです。

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 
} 

追加:

2

全体的な計画は、あなたの必要としているものの内容とあなたの「必要な」を置き換えることです。それよりも多くのことがあります(BEGIN {}が必要な場合があります)。何が関係しているのか正確にはわかりません。確かに、あなたはそれを自動化したいでしょう。

ここでの代替です:あなたが依存モジュールはあなたのコードは動作しませんでしたPAR/pp

+0

こんにちはwrang-wrangは!ヒントをありがとう。残念ながら、同じスクリプトが複数のプラットフォームで使用されるため、実行可能ファイルの作成はオプションではありません。 – knorv

+1

knorv:XS/C /コンパイル済みコンポーネントを含むモジュールを含まない場合、PARはクロスプラットフォームである.parファイルを作成できます。これは、 "pp -o foo.exe foo.pl"のように実行可能なバイナリではありません。 – tsee

4

ファイルには、複数のパッケージを含めることができます。あなたのクラスを最初に入れ、メインスクリプトを続けてください:

package Foo::Bar; 

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

#... 

package main; 

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

'package'ステートメントは新しいスコープを作成しないので、' {package Foo :: Bar; REST_OF_THE_CODE} 'を実行して、2つのパッケージの間に物が漏れないようにします。 –

2

あなたはすでにいくつかの良い答えがあります。さらに、スクリプトとして直接実行できるモジュールを作ることも可能です。

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. 
} 

詳細については、brian d foyのHow a Script Becomes a Moduleを参照してください。

5

あなたはそれが含まに依存するすべてのモジュールとのバイナリにあなたのPerlスクリプトを梱包に興味があるなら、あなたはPAR Packagerを使用することができます。

pp -o binary_name foo.pl 
関連する問題