我应该在github存储库中包含configure和makefile吗?

时间:2013-04-01 14:41:49

标签: github autoconf automake software-distribution

我们最近从subversion转移到git,然后转到Github,用于几个开源项目。 Github很不错,因为它提供了很多功能。我特别喜欢的一件事是能够将标签下载为zip.tar.gz个文件。

不幸的是,Github最近停止了下载。这应该不是问题,因为能够下载标签。但是在过去,我们没有将Makefileconfigure脚本或任何其他autoconf生成的文件放入repo中,因为当人们合并时会遇到很多冲突。

处理此问题的正确方法是什么?

  • 我应该在repo中放置autoconf和automake生成的文件,以便人们可以直接下载标签吗?
  • 或者是否应该有一个bootstrap.sh文件并告诉人们运行该文件?
  • 或者我应该只做make dist并将其放入回购广告?

由于

3 个答案:

答案 0 :(得分:13)

通过GitHub版本

发布make dist的输出

您的第一个选择 - 将Autoconf和Automake生成的文件放入存储库 - 不是一个好主意。对store generated files in source control几乎没有益处。在这种情况下,它将使用许多不必要且可能相互冲突的提交来污染您的历史记录,特别是如果并非所有贡献者都使用相同版本的Autotools。您的第三个选项 - 检查make dist的输出 - 与第一个选项完全相同的原因是一个坏主意。

您的第二个选项 - 添加一个调用Autoconf和Automake以生成configure脚本的“bootstrap”脚本 - 也是一个坏主意。这违背了Autotools的全部目的,即使您的源可以跨系统移植 - 包括那些Autotools不可用的系统! (如果有人想在他们没有root访问权限的机器上构建和安装你的软件,以及没有安装GNU Build System的地方会发生什么。一个bootstrap脚本不会帮助他们,因为他们是首先需要进行Autotools的本地安装以及可能的所有依赖项。)

发布使用Autotools的代码的正确方法是生成一个make dist(或更好,make distcheck的tarball,因为这也将运行测试并进行其他健全性检查),然后发布这个tarball 除了源存储库之外的某个地方。

您的原始问题,从2013年4月开始,声明GitHub停止下载页面。但是,在2013年7月,GitHub added a "Releases" feature不仅预先打包了源标记,还允许您将任意文件附加到每个版本。所以在GitHub上,你可以在Releases页面上发布你的make dist tarball (最好还有他们的独立GnuPG签名)。

基本步骤

  1. 当您准备发布时,请将其标记并将标记推送到GitHub: $ git tag 1.0 # Also use -s if desired $ git push --tags
  2. 使用Makefile生成tarball: $ make dist # Alternatively, 'make distcheck'
  3. 访问项目的GitHub页面,然后点击“发布”链接: Screenshot of a GitHub project showing the location of the releases link
  4. 您将进入项目的“发布”页面。第一次访问时,您将看到的是一个标记列表,并从源树中自动生成tarball: GitHub Releases page 按“草稿新版本”按钮。
  5. 然后,您将看到一个表格,您应在其中填写与该版本相关联的Git标签以及可选的标题和说明。在此之下还有一个文件选择器,标记为“通过将二进制文件放在此处或选择它们来附加二进制文件”使用它来上传您在步骤2中创建的tarball(也可能是它的独立GnuPG签名)。 Drafting a GitHub release 完成后,按“发布释放”按钮。
  6. 您项目的发布页面现在将显示该版本,包括附加文件的显着下载链接: Completed GitHub release page
  7. 如果您不想使用GitHub版本,那么as pointed out in a previous answer,您应该将tarball上传到其他地方,例如您自己的网站或FTP站点。从项目的README.md添加指向此存储库的链接,以便用户可以找到它。

答案 1 :(得分:5)

第二个更好:您希望您的仓库中的任何用户尽快启动并运行,重新生成他/她为构建您的程序所需的内容。

由于Git是 text 的版本控件(而不是artifact repo like Nexus),因此提供了一种生成最终二进制文件的方法。

答案 2 :(得分:0)

当您剪切版本时,将make distcheck的结果上传到项目的下载页面:它是一个makefile目标,用于构建tarball并验证它是否安装,卸载,通过测试和其他健全性检查。 Github错误的做法不是借口:在你的回购中创建一个这样的树:

/
/source
/source/configure.ac
/source/Makefile.am
/source/...
/releases
/releases/foo-0.1.tar.gz
/releases/...

对于开发人员,您不应该在源代码管理中生成文件。许多现代自动化项目都可以通过调用autoreconf -i来自行引导。