使用 Dist::Zilla 自动创建 GitHub 文件

我使用 Dist::Zilla 将我的代码发布到 CPAN。我非常喜欢它,因为只需一个命令,我就可以构建、打包和分发一个软件包。但我的大部分代码都存储在 GitHub 上。实际上,快速检查显示我有 90 个 仓库,但在 CPAN 上只有 13 个分发。因此,只有 14% 的代码被发布到 CPAN。
传统上,Dist::Zilla 在您的代码和 CPAN 和 PAUSE 工作所需文件(如包元数据、README 等)之间进行区分。基本用法如下:您编写类文件、脚本和单元测试,当您告诉 Dist::Zilla 发布分发时,它会生成所有额外文件,创建一个 tarball 并将其上传到 PAUSE。问题是,其中一些额外文件也适合放在我的 GitHub 仓库中。我不想再写另一个 readme.md
,或者花费时间将许可证文件复制到仓库中,如果 Dist::Zilla 已经可以生成一个的话。为了解决这个问题,我使用了 Ryan Thompson 的两个 Dist::Zilla 插件。
设置
要使用本文中的代码,您需要安装 Dist::Zilla 和以下两个插件模块。您可以使用 cpan
命令完成此操作。
$ cpan Dist::Zilla \
Dist::Zilla::Plugin::ReadmeAnyFromPod \
Dist::Zilla::Plugin::CopyFilesFromBuild
如果您正在安装 Dist::Zilla,请考虑使用 cpanminus,不带测试以获得更快的安装。
$ cpanm --notest Dist::Zilla \
Dist::Zilla::Plugin::ReadmeAnyFromPod \
Dist::Zilla::Plugin::CopyFilesFromBuild
自动创建 README 文件
Ryan 的模块 Dist::Zilla::Plugin::ReadmeAnyFromPod 可以自动生成 README,支持任何常见格式。它使用分发中主模块的 Pod 文本。我通过在我的 dist.ini
中添加以下文本来使用它创建我的 GitHub README 文件,以 Pod 格式。
[ReadmeAnyFromPod]
type = pod
filename = README.pod
location = root
如果使用 Dist::Zilla 构建分发,它将为我生成一个新的 README,包括作者、版权和版本信息,以及主模块中已有的文档。
$ dzil build && dzil clean
此行指示 Dist::Zilla 构建分发,生成新的 README.pod
,然后清理它生成的构建文件,留下一个干净的工作目录。
添加许可证
我使用 Ryan 的另一个模块 Dist::Zilla::Plugin::CopyFilesFromBuild 来将软件许可证从 Dist::Zilla 构建复制到我的项目目录。
[CopyFilesFromBuild]
copy = LICENSE
[GatherDir]
exclude_filename = LICENSE
这将把许可证从构建目录复制到根项目目录。存在 exclude_filename
子句,以便在 下一个 构建中,Dist::Zilla 不会将生成的许可证包含在工作目录的文件中。以与之前相同的方式运行此命令,我可以为我的分发生成任何想要的许可证文本(许可证类型在 dist.ini
中指定)。
$ dzil build && dzil clean
帮助他人
Dist::Zilla 很棒,但如果您没有它,从 GitHub 安装一个分发真的很糟糕。最近,一位朋友试图在他的 MacBook 上部署我的某些代码,但他的 Perl 安装是原始的。我不想将代码上传到 CPAN 并等待 PAUSE 索引它。在他的机器上安装 Dist::Zilla 也不是一个好选择:Dist::Zilla 是一个庞然大物。根据 Devel::Modlist,Dist::Zilla 有 178 个非核心依赖项(包括间接使用的模块)。这是您为自动化和模块化所付出的代价 - Dist::Zilla 正在努力工作,这样我们模块作者就无需如此。但对于一个几乎不了解 Perl 的人来说,在一个原始环境中安装 Dist::Zilla 可能是一个噩梦。
为了解决这个问题,我再次使用了Dist::Zilla::Plugin::CopyFilesFromBuild来将Makefile.PL和cpanfile复制到项目目录中。我的朋友随后用Git克隆了目录,并使用cpanminus安装了它。真简单!它工作得非常好,从现在起,我将在我的GitHub仓库中包含一个Makefile和cpanfile。
一个示例Dist::Zilla配置
以下是来自我的仓库的一个dist.ini示例,该仓库使用了这篇文章中的代码。由于某些指令是必须的,查看整个上下文可能很有用
name = Settlers-Game
author = David Farrell
license = FreeBSD
copyright_holder = David Farrell
copyright_year = 2015
version = 0.06
[CPANFile]
[License]
[CopyFilesFromBuild]
copy = cpanfile
copy = LICENSE
copy = Makefile.PL
[GatherDir]
exclude_filename = cpanfile
exclude_filename = LICENSE
exclude_filename = Makefile.PL
[PkgVersion]
[AutoPrereqs]
[GithubMeta]
[ChangelogFromGit]
[MetaYAML]
[MetaJSON]
[MakeMaker]
[ModuleBuild]
[ManifestSkip]
[Manifest]
[PodWeaver]
[ReadmeAnyFromPod]
type = pod
filename = README.pod
location = root
[PodSyntaxTests]
[PodCoverageTests]
[TestRelease]
[Test::EOL]
[UploadToCPAN]
[ConfirmRelease]
[Clean]
要使用这个配置与Dist::Zilla一起,你需要一些额外的插件
$ cpan Dist::Zilla::Plugin::Clean \
Dist::Zilla::Plugin::GithubMeta \
Dist::Zilla::Plugin::ChangelogFromGit \
Dist::Zilla::Plugin::PodWeaver
结论
好吧,并非一切都很顺利。复制文件方法有一个缺点:每次生成文件时都会覆盖复制的文件。这对我来说不是问题;提交差异只显示更改的行,但有些人可能不喜欢它。
有关Dist::Zilla的更多信息,请参阅官方文档。如果您想尝试将代码发布到CPAN的完全不同的方法,您可能会喜欢Module::Release。哦,如果您发现自己在一个新的开发环境中,需要为本地模块安装依赖项,David Golden有一篇有用的文章,其中包括五种不同的方法来实现。
这篇文章最初发布在PerlTricks.com上。
标签
反馈
这篇文章有什么问题吗?请通过在GitHub上打开一个问题或拉取请求来帮助我们。