解除mimemagic和理解MIT和GNU GPL

159 阅读8分钟

TLDR:一艘名为Mimemagic的船只搁浅,阻断了一条重要的贸易路线,并使所有其他船只的交通停止,一些船只被迫改道六天。

玩笑归玩笑,上周在Rails发生的事情是前所未有的,至少从我开始使用Rails 4以来是如此。除非它确实发生了,而我错过了。

据我所知,这是一个关于许可的问题。对于一些人来说,许可不是一个值得关注的问题;一些人抓住任何可用的开源代码,并以任何方式使用它。我曾经是这些人中的一员,但我已经学会了更多地关注我所使用的那种依赖关系以及附加在它们身上的许可。

这篇博文是对我认为正在发生的事情的一个总结。这篇文章是一个事件时间表的汇编,人们已经找到了规避撤销mimemagic 的解决方案,以及开源许可证是如何运作的。

那么,发生了什么?

虽然完全不相关,但六天前,一艘巨大的货船被困在苏伊士运河里。与船的备忘录是基于这艘船,Ever Given。不过,人们无法发货的原因与这艘船无关。

shared-mime-info 的维护者,Bastien Nocera,在mimemagic上提交了一个问题,以解决一些许可不一致的问题。shared-mime-info 是一个包,包含了mimemagic 使用的常见MIME类型的核心数据库。

现在,shared-mime-info 是在GNU通用公共许可证(GPL)下,而mimemagic,在0.3.7版本之前,是错误地在MIT下授权。

当Bastien报告了这一违规行为时,Daniel Mendler,mimemagic 的创建者,短暂地将mimemagic 的许可证改为GPL-2.0,迫使他将所有早期版本的gem,即MIT下的版本删除。

巴斯蒂安报告了一个违规行为。丹尼尔随后修复了这个问题,使所有使用ActiviaStorage(依赖于marcel ,而后者依赖于mimemagic )的Rails应用程序的CI构建陷入停滞。

你的软件包被锁定为mimemagic(0.3.5),但在你的Gemfile中列出的任何来源中找不到该版本。如果你没有改变来源,这意味着mimemagic(0.3.5)的作者已经删除了它。你需要将你的软件包更新到mimemagic(0.3.5)以外的一个没有被删除的版本,才能安装。捆绑器

对一些人来说,依赖关系的层次结构是这样的:

    rails (~> 6.0.3, >= 6.0.3.4) was resolved to 6.0.3.4, which depends on
      activestorage (= 6.0.3.4) was resolved to 6.0.3.4, which depends on
        marcel (~> 0.3.1) was resolved to 0.3.3, which depends on
          mimemagic (~> 0.3.2)

有一个短暂的时刻,出现了混乱。一些人开始要求和命令,好像有人欠了他们什么似的。其他人则试图帮忙。

这里需要注意的一个重要问题是,MIT许可的代码与GPL兼容,但GPL许可的代码却与MIT不兼容。这意味着你可以在一个GPL许可的应用程序中包含MIT许可的代码,但你不能在一个MIT许可的应用程序中包含GPL许可的代码。稍后会有更多关于这个问题的内容。

开发人员如何解决这个问题

我听到有人建议,如果你的应用程序不使用ActiveStorage,就把它去掉。

一些人通过Homebrew在他们的系统上获得了MIME类型的数据库,并更新了mimemagic ,该网站查找了一些路径,包括Homebrew可能安装数据库的地方:

brew install shared-mime-info
bundle update nokogiri marcel mimemagic

Linux用户为他们的发行版做了同样的事情。

其他人建议抓取一份mimemagic ,并将其放入/vendor/gem ,然后将Gemfile更新为类似的内容:

gem "mimemagic", path: "vendor/gems/mimemagic-0.3.6"

另一个解决方法是参考被砍掉的宝石。Yanking gem只是将代码从主机Rubygems中移除。Github会保留另一份副本:

gem 'mimemagic', github: 'mimemagicrb/mimemagic', ref: '01f92d86d'

Rails核心团队删除了Mimemagic

有了所有这些漂浮在空中的灵活的临时修复方法,Rails核心团队正在努力找出一个更持久的解决方案。他们最终做的是在Rails 6.1.3.1版本中提供一个错误修复版本,在marcel ,删除了对ActiveStorage的依赖性mimemagic

Rails核心团队选择了Apache Tika。Apache Tika提供了从Internet Assigned Numbers Authority的MIME类型分类中识别1400多种文件类型的能力,类似于share-mime-info ,但有一个允许的许可--Apache License-2.0。

开源许可101

在你开始这一节之前,这里有一个免责声明:我没有上过法学院,也不是开源许可专家。从这一点上看,几乎所有的东西都参考了我在文章末尾链接的其他资源。

说了这么多,软件许可是法律权利的拥有者(通常是代码的创造者)对软件(许可人)的许可,允许另一个人或实体(被许可人)利用该软件做一些事情。

开放源码许可的根本目的是拒绝任何人独家利用一项工作的权利。Andrew M St. Laurent

当用户购买了一个包装好的产品时,他们往往会受到所谓的 "收缩包装合同 "或收缩包装许可证的约束。收缩包装许可宣称,通过打开产品的塑料包装,消费者受到合同的约束,根据该合同他们不能:

  • 复制该作品。
  • 在包装内容的基础上创造派生作品。
  • 授权任何人做上述任何一点。

开放源代码许可的基础是废除这些限制。复制作品和从别人的作品中创造衍生品的自由对不同的人群意味着不同的东西。这就在开源领域产生了各种各样的许可证。

在众多的许可证中,有MIT和GPL,它们属于不同的许可证类别。允许性和自由复制性。

允许性许可证与复制性许可证

允许性软件许可证对软件如何使用、修改和再分配的限制最小;如MIT。换句话说,这种类型的许可证允许你对软件做任何你想做的事情,只要你提供出处,并且在出现问题时不要求软件的创造者承担责任。

另一方面,还有一种复制权许可。这种许可证的一个例子是GPL。Copyleft许可证的限制性更强一些。这类许可证允许你修改和自由发布软件,但有了这种自由,你就必须在衍生品中保留这些同样的权利,即基于你的工作的代码。

简而言之,允许性许可证允许 "专有化"。自由复制许可则禁止这种行为。有了允许性许可,你就有了对某人的作品进行商业利用的独家权利。

可以看出,允许性许可和自由复制许可的区别在于再许可的权利。这意味着,被许可人或第二方不能再许可GPL许可的代码,也就是说,你不能将GPL代码库抓取并使用到你的MIT代码库中。

GNU GPL的简史

Richard Stallman,GPL许可证的最初作者,曾在Symbolics公司(一家现已倒闭的计算机制造商)要求使用的Lisp解释器上工作。Stallman把他的Lisp工作版本交给了Symbolics公司,授予他们所有权利

当Stallman想看看Symbolics是如何改进Lisp解释器的时候,他们拒绝了。Stallman说:"WTF!!!你们从我这里继承了自由软件。现在你却拒绝让我看到你对我的软件做了什么?这事必须停止!"

也就是说,将不允许专有的修改。我想确保GNU的所有版本都保持自由。理查德-斯托尔曼

Stallman的行为使 "copyleft "的概念成为主流,因此我们现在有GNU GPL这样的保护性许可证来对抗Apache和MIT这样的允许性许可证。要求衍生作品的许可证以原作为基础的原则被称为代际限制

Rails没有违反许可证的规定

你不能把发生在mimemagic 的事情归咎于Rails,原因有二:

  • Rails包含了一个在MIT下许可的宝石(不正确)
  • Rails不是mimemagic 的派生作品

1976年的美国版权法,17 USC.第101条规定。衍生作品 "是基于一个或多个先前存在的作品的作品。我相信这个定义在其他司法管辖区也是如此,根据我的理解,Rails并没有违反GPL,因为它导入了一个GPL衍生的库。Rails本身并不是一个衍生品,他们可以随时剪掉那些 "有污点 "的库。

直到最近,mimemagic 直接将shared-mime-info 数据库导入到 gem 中,使其成为shared-mime-info 的衍生品。Daniel Mendler 为保护自己而砍掉mimemagic 的早期版本是正确的,即使他在没有通知的情况下这样做。

对那些维持开源的人表示感谢

在短暂的争吵中,出现了Jon Wood,他单枪匹马地背着许多开发者找到了解决方案。Rails社区很高兴有这样的人在身边。对于他的努力,我们表示感谢。

当然,Rails核心团队一如既往地迅速找到了一个具有许可权的数据库,以避免问题的发生。为Rails团队点赞!