我们如何识别属于给定分布的所有模块

时间:2012-03-14 06:00:44

标签: perl

我们如何识别属于给定分布的所有模块。

e.g。 XML :: LibXML发行版提供了一组以下模块 https://metacpan.org/release/XML-LibXML

我们如何通过cpan / ppm或每个包的任何标准获得此列表。

实际上我们正在为用Perl编写的代码编写单元测试框架。要验证模块,我们需要一种方法来查找给定模块名称的分发名称。

1 个答案:

答案 0 :(得分:6)

MetaCPAN API通过JSON Web服务(http://api.metacpan.org)提供此问题的解决方案。

在命令行或http://explorer.metacpan.org/上的网络表单上使用curl轻松尝试不同的查询

如果您知道要搜索的版本的名称, 您可以执行此类查询以获取模块名称列表:

/module/_search
{
  "query" : { "match_all" : {} },
  "size" : 1000,
  "fields" : [ "module.name" ],
  "filter" : {
    "and": [
      { "term" : { "module.authorized" : true } },
      { "term" : { "module.indexed" : true } },
      { "term" : { "release" : "XML-LibXML-1.95" } },
      { "term" : { "status" : "latest" } }
    ]
  }
}

您也可以将"release": "XML-LibXML-1.95"替换为"distribution": "XML-LibXML"

如果您从模块名称开始并需要首先确定发布的名称,请尝试以下操作:

/module/_search
{
  "query" : { "match_all" : {} },
  "size" : 1000,
  "fields" : [ "release", "distribution" ],
  "filter" : {
    "and": [
      { "term" : { "module.name" : "XML::LibXML" } },
      { "term" : { "status" : "latest" } }
    ]
  }
}

该查询语法是ElasticSearch DSL,因为api使用ElasticSearch来索引数据。

要从perl进行查询,有一个MetaCPAN::API 模块,虽然我自己没有使用它。

由于它只是一个网络请求,您可以使用LWP或任何其他HTTP模块。

您可能还想查看 ElasticSearchElasticSearch::SearchBuilder 模块,提供更完整的perl接口来查询ElasticSearch数据库。

以下是使用LWP的perl的完整示例:

use JSON qw( encode_json decode_json );
use LWP::UserAgent;
my $ua = LWP::UserAgent->new;
my $res = $ua->post("http://api.metacpan.org/module/_search",
  Content => encode_json({
    query  => { match_all => {} },
    size   => 1000,
    # limit reponse text to just the module names since that's all we want
    fields => ['module.name'],
    filter => {
      and  => [
        { term => { "module.authorized" => 1 } },
        { term => { "module.indexed"    => 1 } },
        { term => { "distribution" => "XML-LibXML" } },
        { term => { "status" => "latest" } }
      ]
    }
  })
);
my @modules =
  # this can be an array (ref) of module names for multiple packages in one file
  map { ref $_ ? @$_ : $_ }
  # the pieces we want
  map { $_->{fields}{'module.name'} }
  # search results
  @{ decode_json($res->decoded_content)->{hits}{hits} };
print join "\n", sort @modules;

如需更多帮助,请访问#metacpan上的irc.perl.org, 或者在https://github.com/CPAN-API/cpan-api/wiki查看维基。

如果您再解释一下您正在做什么和/或尝试实现目标,您可能会找到其他方法。