【问题标题】:Should I include configure and makefile in a github repository?我应该在 github 存储库中包含 configure 和 makefile 吗?
【发布时间】:2013-03-22 15:37:11
【问题描述】:

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

很遗憾,Github 最近停止了下载。由于能够下载标签,这应该不是问题。然而,过去我们没有将Makefileconfigure 脚本或任何其他自动配置生成的文件放入存储库,因为当人们合并时它们会产生很多冲突。

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

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

谢谢

【问题讨论】:

  • 接受的答案似乎没有抓住重点。似乎有更好的答案可用。

标签: github autoconf automake software-distribution


【解决方案1】:

通过 GitHub Releases 发布 make dist 的输出

您的第一个选项——将 Autoconf 和 A​​utomake 生成的文件放入存储库——不是一个好主意。这对store generated files in source control 几乎没有好处。在这种情况下,它会用大量不必要的和潜在的冲突提交污染你的历史,特别是如果不是所有的贡献者都使用相同版本的 Autotools。您的第三个选项——检查make dist 的输出——是个坏主意,原因与第一个选项完全相同。

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

使用 Autotools 发布代码的正确方法是生成带有 make dist 的 tarball(或者更好的是 make distcheck,因为这也将运行测试并进行其他完整性检查),然后发布此 tarball 源存储库以外的其他地方

您从 2013 年 4 月开始的原始问题指出 GitHub 已停止下载页面。然而,在 2013 年 7 月,GitHub added a "Releases" feature 不仅预先打包了您的源标签,还允许您将任意文件附加到每个版本。所以在 GitHub 上,发布页面是您应该发布 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 页面并点击“发布”链接:
  4. 您将被带到您的项目的发布页面。第一次访问时,您将看到的只是标签列表和源代码树中自动生成的 tarball: 按“起草新版本”按钮。
  5. 然后您将看到一个表单,您应该在其中填写与发布相关的 Git 标记以及可选的标题和描述。在此下方还有一个文件选择器,标记为“通过将二进制文件拖放到此处或选择它们来附加二进制文件”。使用它来上传您在步骤 2 中创建的 tarball(也可能是它的分离 GnuPG 签名)。 完成后,按“发布版本”按钮。
  6. 您项目的版本页面现在将显示版本,包括附加文件的显着下载链接:

如果您不想使用 GitHub Releases,那么 as pointed out in a previous answer,您应该将 tarball 上传到其他地方,例如您自己的网站或 FTP 站点。从项目的README.md 添加指向此存储库的链接,以便用户可以找到它。

【讨论】:

    【解决方案2】:

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

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

    【讨论】:

    • 谢谢。这就是我一直在做的事情,但是很多用户感到困惑。
    • @vy32 会不会有一个大的README 帮助他们开始?
    • 第二个选项(包括运行 automake 和 autoconf 的 bootstrap.sh)是个坏主意,因为这需要用户安装 GNU 构建系统(Autotools)才能构建和运行您的软件.这违背了 Autotools 的全部目的,即使您的源代码可跨系统移植——包括那些未安装或不可用 Autotools 的系统! @Jack_Kelly 的回答是正确的:如果需要,您需要在 GitHub 以外的地方发布 make dist 的输出。
    • @Psychonaut 我同意并赞成您的回答。我怀疑当时(3 年前)我提出了更多的解决方法。
    【解决方案3】:

    当您删除一个版本时,将make distcheck 的结果上传到您项目的下载页面:它是一个生成文件目标,用于构建 tarball 并验证它是否安装、卸载、通过测试和其他健全性检查。 Github 走错路不是借口:在你的 repo 中创建这样的树:

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

    对于开发人员,您不应该在源代码管理中生成文件。许多现代自动工具项目在调用 autoreconf -i 时启动良好。

    【讨论】:

    • 这在 github 上不起作用,因为 github 不再支持下载页面。
    • 我在回答中说过。如果某个工具被误读了,也许您应该重新考虑使用该工具。
    • 大声笑...您如何摆脱 Autotools 和 Git?两人的方向都错了。每个都过度设计,每个都使简单的任务变得困难。它们是允许工程师推动需求时发生的情况的示例。
    • 可以将make dist的结果直接上传到releases页面。
    猜你喜欢
    • 2020-11-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-11
    • 2019-06-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多