【问题标题】:How can I distribute perl modules with my script?如何使用我的脚本分发 perl 模块?
【发布时间】:2012-05-07 23:34:13
【问题描述】:

这是个好主意吗?我写了一个脚本,它使用了一些不受欢迎的模块。安装它们需要很长时间,所以我认为最好将它们与我的应用程序一起分发。我该怎么做?

【问题讨论】:

    标签: perl module distribution distribute


    【解决方案1】:

    习惯上在您的发行版的inc 目录中发布依赖项。我之前在how do I link PerlIO Perl package without "installing it"automatically install missing modules from CPAN 中讨论过这个问题。

    这个问题很模糊,所以不是代码,而是建议:我假设您根本不需要安装。将解压后的依赖项放入inc 目录。在运行时使用use lib 'inc'; 访问它。

    就是这样。

    【讨论】:

      【解决方案2】:

      当然。在 Apache 许可下,您可以重新分发模块。

      这些是不导入任何函数的面向对象模块吗?然后,您无需执行任何操作。只需从主程序中删除use My::Module;,然后将My::Module 附加到主程序的末尾即可。

      如果您不使用面向对象的代码,并且它通过@EXPORT 数组导出函数,您将不得不采取一些额外的措施:

      在这里,我必须添加Local::Foo->import qw(foo) 才能将foo 函数导入主程序即使它是通过@EXPORT 而不是@EXPORT_OK 导出的。我还必须在模块中的导出声明周围使用 BEGIN。否则,我的主程序将找不到要导入的内容:

      原创节目:

      主程序:

      #! /usr/bin/env perl
      # test.pl
      
      use warnings;
      use strict;
      use Local::Foo;
      
      use feature qw(say);
      
      my $bar = foo("bar");
      
      say "Bar is '$bar'";
      

      模块本地::Foo

      #! /usr/bin/env perl
      # Local/Foo.pm
      #
      package Local::Foo;
      
      use Exporter qw(import);
      our @EXPORT = qw(foo);
      
      sub foo {
          my $value = shift;
          return "FOOOOOO $value";
      }
      1;
      

      联合计划

      #! /usr/bin/env perl
      # test.pl
      
      use warnings;
      use strict;
      # use Local::Foo;
      
      # Force importation of `foo`
      
      Local::Foo->import qw(foo);
      
      use feature qw(say);
      
      my $bar = foo("bar");
      
      say "Bar is '$bar'";
      
      #-----------------------------------------------------------------------
      #! /usr/bin/env perl
      # Local/Foo.pm
      #
      package Local::Foo;
      
      # Add BEGIN clause to module
      
      BEGIN {
          use Exporter qw(import);
          our @EXPORT = qw(foo);
      }
      
      sub foo {
          my $value = shift;
          return "FOOOOOO $value";
      }
      1;
      

      【讨论】:

      • 谁说过 Apache? (绝大多数 Perl 模块都是 GPL1/Artistic1 双重许可的,也就是“与 Perl 本身的条款相同”。) - 我对手动组合不满意,你应该推荐 fatpacker。
      • @daxim 我对fatpacker一无所知。我找到了 App::Fatpacker。是这样吗?文档的方式并不多。您能否提供一个解释如何使用 fatpacker 的答案?我会对此感兴趣。
      猜你喜欢
      • 2017-07-17
      • 2011-01-29
      • 2021-03-23
      • 1970-01-01
      • 2010-09-26
      • 2012-01-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多