2010-07-12 61 views
5

我对Perl编程非常陌生。我刚刚读完了这本书,到目前为止,我已经在Bash中编写脚本,但是我想尝试一下Perl,它比Bash脚本编写有好处。Perl编程和发布

我创建一个使用多种标准模块(例如的Getopt)的脚本和一些不那么标准模块(如PerlMagick

在某些时候,我想我的分发Perl代码,我想它可以被不熟悉Perl或编程的人使用。显然标准模块应该总是在那里(我使用“使用5.010”来保证这一点),但是什么是非标准模块呢?

我想有两种可能性: 1)我应该告诉最终用户安装缺少的模块吗? 2)我应该创建一个测试模块的安装脚本,如果它们不在那里,然后安装它们? 如果选择了选项2,我应该下载模块并安装它们吗?或者用我的主代码分发它们? 我只是不知道礼仪这样的事情是什么?

非常感谢你对所有的意见, 本

回答

5

如果你设计你的应用程序作为一个Perl的分布(如在CPAN使用),然后你可以使用Perl工具链来为你处理这种事情。您只需确保您所依赖的模块已在您的Makefile.PL中正确列出,然后有人只需编写cpan YourApp::Name以获取您的应用程序及其所需的一切内容。或者,如果他们从CPAN以外的地方下载应用程序,并且他们正在手动构建它,则make进程可以找到它们的依赖关系(这就是为什么Module::AutoInstall并非完全死亡并且不值得成为IMO)的原因。

对于Windows用户,在步骤cpan YourApp::Name之前必须添加的唯一内容是“安装Strawberry Perl”。

您还可以选择捆绑(无论是涉及PAR还是仅包含安装程序或存档,同时包含您的应用程序和所有必要模块,可能还有perl本身),但这种技术有一个主要缺点:它意味着您不能使用任何 XS代码,否则您必须为您希望应用支持的每个不同平台提供单独的软件包。 CPAN路线不会遇到这个问题。

1

如果您不想用prelccperlapp进行编译 - 那么任何可能性都可以使用。

  • 您检查前人的精力目前正确 版本的模块,为您的Perl代码 不要求像一些错误信息: “在@INC 无法找到数据/ UUID.pm(@公司包含:...)“。例如:

    eval { use Data::UUID; }; 
    if([email protected]) { 
         print "Data::UUID not found\n"; 
    } 
    

    eval { use Text::ParseWords 3.23; }; 
    if([email protected]) { 
         print "Text::ParseWords 3.23 not found\n"; 
    } 
    
  • 您可以尝试使用CPAN模块(或UNIX CPAN程序)。喜欢,你可以 尝试shell命令:

    cpan Data::UUID 
    

    或将Perl脚本:

    #!/usr/bin/perl 
    use CPAN; 
    CPAN::install("Data::UUID"); 
    
+0

Downvote:这不起作用,因为'use'在编译时运行。另外,我们已经有完美的依赖追踪+安装工具链,就像hobbs的回答所描述的那样,不需要这个hackery。 – daxim 2010-08-15 23:58:26