我采取使用Perl一个CLI工具。 什么是我们可以按照这里的最佳实践?
Answer 1:
作为序言,我花了3年的工程和实施在Perl一个相当复杂的命令行工具集的一个主要的金融公司。 下面的想法基本上都是我们团队的设计指导方针的一部分。
用户界面
命令行选项:让尽可能多的有默认值。
对于具有多于2个选择任何命令NO位置参数。
有可读的名称选项。 如果命令行的长度对于非交互式通话功能的关注(例如,一些未命名的遗留炮弹对命令行短的限制),提供短期的别名 - getopt的::长允许,很容易。
最起码,打印默认值‘ - 帮助’消息的所有选项。
更妙的是,打印所有选项‘当前’值(例如,如果一个参数的值与‘-help’供应以来,帮助信息将打印的命令行参数的值)。 这样,人们可以组装命令行字符串为复杂的命令,并通过附加“-help”,实际运行前进行验证。
按照与错误终止非零返回码当且仅当程序退出的UNIX标准惯例。
如果你的程序可能会产生有益的(例如,值得拍摄/ grepping /诸如此类的东西)输出,确保任何错误/诊断消息去STDERR使它们容易分离。
理想的情况下,允许用户通过命令行参数指定的,而不是强迫输入/输出文件,“<” /“>”重定向 - 这使得更简单的生活谁需要使用命令来构建复杂的管道人。 同上错误消息 - 有日志文件选项。
如果一个命令有副作用,有一个“WHATIF / no_post”选项通常是一个很好的主意。
履行
如前所述,不要重新发明轮子。 使用标准的命令行参数的处理模块 - MooseX ::的Getopt,或:: Getopt的龙
对于的Getopt ::龙,将所有的参数到一个哈希,而不是单个变量。 许多有用的模式包括:使该CLI ARGS散列为对象构造。
确保你的错误信息是明确和翔实的......例如包括“$!” 在任何IO相关的错误消息。 这是值得花费在你的代码中加入额外1分钟,2号线有一个单独的“找不到文件”与“文件不可读”的错误,而不是花费在生产应急30分钟因为非可读的文件错误是由生产误诊操作为“无输入文件” - 这是一个活生生的例子。
没有真正CLI特有的,但验证所有参数,最好让他们之后。 CLI不允许像的Web程序的“前端”的验证,所以做超级格外警惕。
如上所讨论的,模块化的业务逻辑。 并没有那么困难,如果逻辑已经是一个设计合理的烫发模块 - 在已经上市的其他原因,有时,我不得不给量为网络应用的广阔重新实现现有的CLI工具。
有趣的链接
CLI设计模式-我认为这是ESR的
我会尝试,因为我记得他们增加更多的子弹。
Answer 2:
用POD来记录你的工具,请按照手册页的指导方针; 包括至少以下部分:NAME,概要,描述,作者。 一旦你有适当的POD可以产生与pod2man将手册页,查看在用的perldoc your-script.pl控制台的文档。
使用该处理命令行选项,你的模块。 我真的很喜欢使用的Getopt ::龙会同波德::使用这种方式调用--help将显示一个很好的帮助信息。
请确保您的脚本返回正确的退出值,如果它是成功还是失败。
这里有一个脚本,做所有这些的小骷髅:
#!/usr/bin/perl
=head1 NAME
simplee - simple program
=head1 SYNOPSIS
simple [OPTION]... FILE...
-v, --verbose use verbose mode
--help print this help message
Where I<FILE> is a file name.
Examples:
simple /etc/passwd /dev/null
=head1 DESCRIPTION
This is as simple program.
=head1 AUTHOR
Me.
=cut
use strict;
use warnings;
use Getopt::Long qw(:config auto_help);
use Pod::Usage;
exit main();
sub main {
# Argument parsing
my $verbose;
GetOptions(
'verbose' => \$verbose,
) or pod2usage(1);
pod2usage(1) unless @ARGV;
my (@files) = @ARGV;
foreach my $file (@files) {
if (-e $file) {
printf "File $file exists\n" if $verbose;
}
else {
print "File $file doesn't exist\n";
}
}
return 0;
}
Answer 3:
一些教训我已经学会:
1)始终使用的Getopt ::龙
2)通过--help使用情况提供帮助,最好用的常见方案的例子。 它可以帮助人不知道或忘记了如何使用工具。 (也就是说, 你在六个月内)。
3)除非是作为为什么不(> 5秒),没有输出给用户去很长一段很明显给用户。 喜欢的东西“打印‘行$行... \ n’除非($行%1000)”走一段很长的路要走。
4)对于长时间运行的操作,使得如果可能,用户恢复。 它真的很烂通过一百万50万就搞定了,死了,重新开始。
5)分离的你在做成模块是什么逻辑,离开实际特等脚本准系统成为可能; 解析选项,显示帮助,调用基本方法等你不可避免地会找到你想要重用的东西,这使得它容易得多赫克。
Answer 4:
最重要的是要有标准选项 。
不要试图聪明 ,简单地用一致的现有工具 。
如何做到这一点也很重要 ,但只是排第二 。
其实,这是很普通的所有CLI界面。
Answer 5:
有一对夫妇在模块的CPAN ,这将使编写CLI程序轻松了不少:
- 应用:: CLI
- 应用:: Cmd的
如果您的应用程序基于同样穆斯看看MooseX ::的Getopt和MooseX :: Runnable接口
Answer 6:
以下几点是不特定的Perl,但我发现很多的Perl脚本CL要在这些领域缺乏:
使用普通的命令行选项。 要显示的版本号执行-v或--version不--ver。 对于递归处理-R(或者-R虽然在我的GNU / Linux的经验-r为多见)没有--rec。 人们会使用你的脚本,如果他们能记住的参数。 可以很容易地学习新的命令,如果你能记住“它的工作原理,如grep”或其他一些熟悉的工具。
很多命令行工具过程中的“当前目录”内的“东西”(文件或目录)。 虽然这可能是方便确保您还添加命令行选项的文件或目录明确标识工艺。 这使得它更容易把你的工具在管道中,而无须发出一堆CD命令,并记住他们在哪个目录开发商。
Answer 7:
您应该使用Perl模块 ,使您的代码可重用性和易于理解。
应该看看Perl的最佳实践