【问题标题】:Internal CPAN - what module内部 CPAN - 什么模块
【发布时间】:2013-11-15 19:38:26
【问题描述】:

我想设置内部 CPAN 来分发我们的内部代码。

所以我按照推荐的hereCPAN::Mini。但看起来还有其他选择,如CPAN::SiteCPAN::DarkDist::Zilla ...

我对所有这些选项有点不知所措。人们最常使用/推荐什么?

我需要一种将内部模块推送到可以从多台机器访问的存储库的方法。

【问题讨论】:

  • Dist::Zilla 不属于这个列表,因为它是关于打包模块,而不是分发它们。您可以使用 dzil 来帮助打包您的代码,并使用一个插件将其上传到您的内部 CPAN,但您仍然需要一些其他模块来实际管理您的内部 CPAN。

标签: perl cpan


【解决方案1】:

快速回答是,您想使用 CPAN::Mini 创建 CPAN 上所有当前内容的本地镜像,然后使用 CPAN::Mini::Inject 向其中添加您自己的发行版。

答案很长,有助于理解 CPAN 镜像是如何构建的。从广义上讲,它只是一个包含两个子目录的目录。

“模块”目录依次包含两个文件,即 03modlist.data.gz,现代 CPAN 客户端会忽略其内容,但有假设该文件存在的旧代码,因此只需从现有镜像复制它即可。另一个是02packages.details.txt.gz,后面会讲到。

“authors”目录包含一个文件“01mailrc.txt.gz”,这是另一个过去的遗物,其内容可以忽略,所以只需从另一个镜像复制它,它包含“id”目录。这又包含子目录和分布,其名称遵循模式。例如,我的 PAUSE id 是 DCANTRELL,而我的发行版之一是 XML-Tiny-2.06.tar.gz,因此该文件位于 .../authors/id/D/DC/DCANTRELL/XML-Tiny-2.06。 tar.gz.

02packages.details.txt.gz 文件是将模块名称映射到发行版的索引,此必须是最新的,您的镜像才能正常工作。它由几个标题行组成,必须存在且正确,然后是一个空行,然后是每个模块的一行。这些行是由空格分隔的三个字段:

  • 模块名称
  • 模块版本
  • 分发文件名

例如

  XML::Tiny 2.06 D/DC/DCANTRELL/XML-Tiny-2.06.tar.gz

(您可能还会看到 .tgz、.zip 和 coupla 其他文件)

一个分布可能出现在多行中,它包含的每个模块一次。例如

  XML::Tiny::DOM 1.1 D/DC/DCANTRELL/XML-Tiny-DOM-1.1.tar.gz
  XML::Tiny::DOM::Element 1.1 D/DC/DCANTRELL/XML-Tiny-DOM-1.1.tar.gz

在一个普通的 CPAN 镜像中,一个发行版可能有多个版本,一个模块的多个版本 - 例如,当前版本和几个旧版本,或者当前稳定版本和开发版本。索引文件包含最新的稳定版本。您可以告诉发行版的开发版本,因为它们的版本中有一个下划线,或者包含字符串“-TRIAL”。

因此,了解所有这些后,您就可以构建一个类似 CPAN 的类,包含您的代码。但是使用 CPAN::Mini 和 CPAN::Mini::Inject 将你的东西添加到“真正的”CPAN 的工作量较少。

一旦您创建了 CPAN-a-like,您可以在 HTTP 上公开它并使用任何客户端正常访问它,或者您可以将它放在文件系统中并配置 CPAN 客户端以使用file:/// 网址。

【讨论】:

    【解决方案2】:

    您也可以考虑Pinto。 Pinto 允许您管理自己的稳定 CPAN 存储库,其中可以包含任意数量的公共和私有发行版。 Pinto 还可以帮助您在依赖项随时间演变时管理更改。

    【讨论】:

      【解决方案3】:

      DrHyde 对这个问题给出了很好的回答。但如果您不想想要维护 CPAN 镜像,可以将 MyCPAN::App::DPANMyCPAN::Indexer 一起使用。

      Cave:两个发行版都在开发中。并非所有组合都有效。我使用的是 github 上最新版本的 MyCPAN::App::DPAN (1.28_11) 和 MyCPAN::Indexer 版本 1.28_10(更高版本不适用于 MyCPAN::App::DPAN)。

      MyCPAN::App::DPAN 将根据您提供的发行版在您的本地磁盘上创建一个类似 CPAN 的目录结构。您需要为其创建一个配置文件(例如,.dpanrc):

      # contents of .dpanrc
      indexer_id  Edward Baudrez <my.email.address@example.org>
      dpan_dir    /home/ebaudrez/rsync.net/dpan
      merge_dirs  /home/ebaudrez/rsync.net/dpan/dists
      report_dir  /home/ebaudrez/rsync.net/dpan/indexer_reports
      

      将您的分发压缩包放在目录merge_dirs 中(我认为该目录没有理由应该驻留在dpan_dir 下,但我现在懒得弄清楚)。然后拨打dpan

      dpan -f $HOME/.dpanrc
      

      dpan 将在dpan_dir 中创建一个类似CPAN 的结构(特别是包含authorsmodules)。然后可以将此目录与cpanm 一起使用(例如):

      cpanm --mirror $HOME/rsync.net/dpan --mirror http://search.cpan.org/CPAN
      

      请注意,我使用真正的 CPAN 作为后备,因为根据定义,DarkPAN 是不完整的。如果你也有一个迷你 CPAN 镜像,你也可以在这里使用它:

      cpanm --mirror $HOME/rsync.net/dpan --mirror $HOME/mirrors/minicpan --mirror-only
      

      请注意,要使此方案起作用,您需要从源代码创建分发 tarball。我喜欢并使用Dist::Zilla,但请注意,您也可以从Makefile.PL 生成tarball,因此您绝对不需要使用Dist::Zilla。但它处理了很多细节。

      从您的源代码创建一个真正的发行版似乎需要做很多工作,但 Dist::Zilla 有助于减轻负担,并且在未来的某一天过渡到一个真正的 CPAN 模块 ;-),也得到了简化很多时候你已经有一个发行版。

      【讨论】:

        猜你喜欢
        • 2018-02-01
        • 2020-02-12
        • 1970-01-01
        • 2012-04-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-10-02
        • 2014-10-22
        相关资源
        最近更新 更多