问题描述
我正在研究一个要在GitHub上发布的项目。这个项目需要一个特定的算法Algorithm。我以前从事的每个项目都只使用了我的代码(加上STL等),但是算法编写起来可能很麻烦,所以我想使用别人的代码。与我其余代码的大小相比,算法是一个小的子例程。
我找到了一个实现算法的GitHub存储库,但是有很多垃圾邮件。垃圾,我的意思是我不需要的代码。我想从算法中删除所有垃圾并使用它,但是我不确定如何做到这一点。理想情况下,可以清除算法并将其无缝地放在我的项目目录中,以减少对项目其他用户的依赖。
我不知道使用别人代码的礼节。我不知道该如何归功于这些许可证或如何处理这些许可证。
在我看来,关于如何使用别人的算法实现,我有五个选择。
-
include
声明了Algorithm的原始标头及其附带的所有垃圾。 (是否将标头及其所有依赖项复制到我的项目目录中?) - 创建一个新的标头和源文件,以将实现算法和所有注释保持原样,并将标头
#include
放入我的项目中(省去可能在原始标头中出现的其他函数和类)。 / li> - 修改实现算法的代码以删除剩余的垃圾。删除评论。将
C
数组更改为std::vector
个。用智能指针替换指针。更改抛出的异常。删除我的项目不需要的“选项”。更改数据表示形式以将所有内容与我的项目合并。 - 从头开始重写算法,但在现有代码之后对其进行建模,使实现符合我的风格,并进行较小的性能改进(但是,不值得将其应用于现有存储库)。
这4种情况下的礼节规则是什么?我将算法放在项目目录的哪里?我如何记下别人的工作?我如何将某人的修改工作归功于某人(例如,删除其原始评论)?如何避免将别人的工作归功于他人(假设他们可能认为使用了错误的编码做法)? GitHub的哪些功能可以促进所有这些工作?
关于许可证,如果使用某人的算法来使我的代码运行迫使我使用特定的许可证发布它,我以后可以实现自己的算法并更改许可证吗?我不知道我是否愿意这样做,但是很高兴知道。
解决方法
通常,当开发人员根据特定的许可证在Github上发布代码时,他们希望根据该许可证在其他地方使用和使用该代码。除了获得许可外,您没有任何其他负担可以安抚开发人员。
只要许可文件本身(以及您对它所做的任何更改)仍受MPL2许可,MPL2十分乐意接受该代码并将其合并到另一个项目中,甚至具有不同的许可。 MIT许可证更为宽容,在这里您可以根据需要重新许可。请注意,您仍然需要引用MIT许可证来遵循归因条款:
上述版权声明和本许可声明应包含在本软件的所有副本或重要部分中。
所以只需保持此标头完整即可。有关MPL2,请参见the FAQ。
如果您以后选择从项目中删除代码并以干净的方式重新实现相同的逻辑,则受版权保护的代码将消失,许可条款也将消失。
现在是最佳做法:
-
如果您不需要在代码中进行更大的更改,并且没有很多负担,则可以(大部分)不加修改地将其包括在内,这为您带来了以下优势:稍后轻松升级代码。期望原始实现继续进行,尤其是在错误修复方面。尝试通过保持接近原始状态来从中获利,而不是最终得到一堆现在必须维护的代码。
-
如果您对代码有实质性的总体改进,例如如您所提到的进行现代化,请考虑以拉取请求的形式将其退还。为此,同样,您需要保持原始代码的整体结构完整,这样拉取请求实际上仅包含这些改进。现在,原作者可以选择是否受益于您的改进。如果这样做,我们回到第1点:即使您对代码进行了重大更改,您仍然可以从原始作者的维护中受益。
-
如果涉及大量垃圾,对您的项目 来说是不必要的,并且您觉得这是维护负担或带有其他依赖项,或者您的更改既重要又特定到您自己的实现中,这样您就不会发现它们对原始作者有帮助(或者通常看不到成功的请求请求的可能性),然后硬着头皮并完全吸收代码。当原始项目显示为“死”时,例如,这也是最佳选择。在年龄等方面没有重大的提交活动。
关于哪种选择最好,显然没有通用的规则,因此这应该只是指导您做出决定。
请注意,还存在“如何”采用代码的技术考虑。通过在单独的存储库中所做的更改来维护代码的干净副本(例如,是自包含的,而不是更大项目的一部分),这对您可能是有益的,而该存储库是从原始存储库(“上游”)中显式分叉的Github(但您也可以使用git本身私下进行此操作)。这为您提供了git功能的优势,可以跟踪更改并将它们合并到上游和fork之间。较大项目使用的源是您自己的分支存储库,您可以与上游保持同步,也可以不保持同步。对于您对上游可能想到的任何拉取请求,此派生叉也是起点。
当您在GitHub上存储库时,原始作者可以看到您的存储库,因此正在使用他们的工作。另外,如果您发现并提交错误或提出改进建议,则可以为作者提供积极的反馈。最后,提出要求是表达您的赞赏之冠。但是,作为在GitHub上发布内容的开发人员,我从没希望收到任何内容。