2

我希望我生成的 Makefile 有这些新的 linting 任务:

perl:
    -for f in **/*.pl; do perl -MO=Lint -cw $$f 2>&1 | grep -v "syntax OK"; done
    -for f in **/*.pm; do perl -MO=Lint -cw $$f 2>&1 | grep -v "syntax OK"; done

perlcritic:
    -perlcritic . | grep -v "source OK"

lint: perl perlcritic

我尝试编写一个Makefile.PL,但是当我运行它时,生成的 Makefile 仍然缺少该lint任务。

use ExtUtils::MakeMaker;

sub MY::lint {
  return <<'END';
lint:
    echo "Linting!!!!!!!!!!!1"

END
}

WriteMakefile;

我尝试阅读 CPAN 文档,但像大多数文档一样,它们提供的片段没有足够的上下文,所以我什至不确定是否应该在之前或之后声明 subs WriteMakefile

也发布在Reddit上。

4

2 回答 2

4

感谢briandfoy:

$ cat Makefile.PL 
#!/usr/bin/env perl

use strict;
use warnings;
use ExtUtils::MakeMaker;

WriteMakefile;

sub MY::postamble {
  return <<'END';
perlwarn:
    -find . -type f -name '*.pl' -exec perl -MO=Lint -cw {} 2>&1 \; | grep -v "syntax OK" | grep -v "Can't locate"
    -find . -type f -name '*.pm' -exec perl -MO=Lint -cw {} 2>&1 \; | grep -v "syntax OK" | grep -v "Can't locate"
    -find . -type f -name '*.t' -exec perl -MO=Lint -cw {} 2>&1 \; | grep -v "syntax OK" | grep -v "Can't locate"

perlcritic:
    -perlcritic . | grep -v "source OK"

lint: perlwarn perlcritic
END
}
于 2014-02-12T19:51:50.167 回答
1

一个可行且更易于维护的解决方案是将 make 目标放在单独makefile的 .

# In Makefile.PL
use File::Slurp;

sub MY::postamble {
    my $targets = read_file('./script/additional.make');
    return $targets;
}

# In /script/additional.make
perl:
    for f in **/*.pl; do perl -MO=Lint -cw $$f 2>&1 | grep -v "syntax OK"; done
    for f in **/*.pm; do perl -MO=Lint -cw $$f 2>&1 | grep -v "syntax OK"; done

perlcritic:
    perlcritic . | grep -v "source OK"

lint: perl perlcritic

以后的读者注意:我正在使用Module::Install并且有必要::用作分隔符,因为它似乎Module::Install禁止混合:::。它也不允许使用-.

于 2018-09-09T16:23:08.950 回答