写点什么

因许可证不兼容,50 万 + 项目受到影响,Rails 替换了出问题的库

  • 2021-03-31
  • 本文字数:1719 字

    阅读完需:约 6 分钟

因许可证不兼容,50 万+项目受到影响,Rails 替换了出问题的库

上周,一个名为 mimemagic 的 Ruby 库因开源许可证不兼容的问题导致 50 万 + 项目陷入混乱。


上周三,shared-mime-info 软件库的维护者 Bastien Nocera 给 Ruby 库 mimemagic 的维护者 Daniel Mendler 发送了消息:“你之前交付的 mimemagic 库采用了我的代码,使用了不兼容的软件许可证。”


shared-mime-info 库是在 GPLv2 许可证下授权的 ,而 mimemagic 是在 MIT 许可证下授权的,事实上这两种开源许可确实是不兼容的。Nocera 在 GitHub 的 Issues 上发帖:“使用 GPL 文件作为源文件,会使整个代码库都变成衍生代码,并且全部代码都应遵循 GPL 许可,所以如果有人在纯 MIT 代码库中或者是闭源应用程序中使用了 GPL 代码,应该及时纠正这个问题。”


得知此事之后,Mendler 先是向 Nocera 表示了感谢,并将最新的 0.4.0 和 0.3.6 版本移到 GPLv2 下,并从包注册表 RubyGems.org 上撤销了之前发布的版本,将 mimemagic GitHub 代码库存档。


虽然补救动作比较及时,但 Ruby on Rails 由于依赖 mimemeagic 0.3.5 仍然受到了影响。同时,还有 172 个其它软件包、共 577148 个不同的软件仓库也受到了影响。当然,并不是所有项目都会立即受到影响,但是任何试图从 RubyGems.org 获取 mimemagic 已撤销版本的构建过程都会失败,除非之前就已经实现了依赖缓存。

如何解决?


面对已经发生的开源许可不兼容的问题,我们应该如何解决呢?开源许可顾问 Paul Berg 表示:“这件事对于 Rails 造成了很大的影响。目前,有很多应用程序都是使用 Rails 开发的,由于 Rails 之前采用的是较为宽松的开源许可 MIT,所以这些应用程序自然不可能遵守 GPL 的条款。如果,我们将 Rails 改为采用 GPL 许可,那么成千上万的团队都可能要做出调整,这是不切实际的,我们必须寻找其它的办法。”


Ruby on Rails 团队讨论了很多解决方案,例如使用替代产品,比如 2-clause BSD 授权的 libmagic 或实现一个 mime 数据库的 Ruby 版本,但这些方法的工作量很大。


上周四,mimemagic 发布了 0.4.1 版本,删除了 GPL 覆盖的代码,恢复了 MIT 许可,用户现在必须自己提供 mime 类型数据库。对于 0.3.6 和 0.4.0 版本的撤销,许多人感到遗憾。


上周五,Rails 团队经过讨论最终决定将 mimemagic 换成另一个名为 Marcel 的库。Rails 5.2.5、6.0.3.6 和 6.1.3.1 发布了带有 ActiveStorage 服务的修订版,用 Marcel 1.0.0 取代了它的 mimemagic 依赖。


Basecamp 的开发人员 George Claghorn 在发布新版本的博客文章中解释说:“在 1.0.0 之前,根据 MIT 许可证的条款发行的 Marcel(和 Rails 一样)间接依赖在不兼容的 GNU 通用公共许可证下发布的 mime 类型数据。而 Marcel 1.0.0 则是直接打包从 Apache Tika 改编的 mime 类型数据,这些数据是在许可且兼容的 Apache 许可证 2.0 下发布的。”


要做到这一点需要费一些功夫。Marcel 本质上是 mimemagic 的包装,因此它的某些部分必须经过修改才能被 MIT 许可。现在,Marcel 的 mime 签名数据表(称为魔术数字签名)来自 Apache Tika,因此不需要遵循 GPLv2。

后记:开源许可的兼容性


目前经过 Open Source Initiative(OSI)认证的开源许可证共有 80 余种。中国信通院云计算与大数据研究所开源运营主管郭雪将这些开源许可证根据使用条件的不同,分为了四类:开放性开源许可证、弱传染型开源许可证、传染型开源许可证和强传染型许可证。


  • 开放性开源许可证是最基本的类型,用户可以修改代码后闭源。常见的许可证包括:MIT、BSD、Apache 等;

  • 弱传染型开源许可证是指如果一个软件包含该协议下部分代码,完全发布时某些部分必须适用该许可证,其它部分可在其它写协议下发布。常见的许可证包括:LGPL、MPL、EPL 等。

  • 弱传染型开源许可证明确修改版本必须以同一许可证发布,如果一个软件包含该协议下的代码,完全发布时必须作为整体适用该协议。常见的许可证为 GPL;

  • 强传染型许可证在传染型许可证要求的基础上,还要求使用开源软件提供云服务时也必须提供源代码。常见的许可证为 AGPL。


当一个开源软件使用了一个许可证,而你想把它的代码整合到你发布的开源项目中时,我们应该如何判断两个许可证的兼容性呢?大家可以参考信通院发布的这张图:



参考链接:


https://www.theregister.com/2021/03/25/ruby_rails_code/

2021-03-31 14:117275

评论

发布
暂无评论
发现更多内容

在线问题反馈模块实战(八)​:实现图片上传功能(上)

bug菌

springboot 项目实战 10月月更

从零到一搭建一个属于自己的博客系统(弌)

木偶

django 前端 10月月更

银斯微推出跨平台APP生成、发布Non-Stop云服务“W-Hive”

科技热闻

Vue中的diff算法深度解析

yyds2026

Vue

Webpack插件核心原理

Geek_02d948

webpack

【小程序】一文读懂微信小程序登录流程及获取手机号

言程序

小程序 前端 10月月更

Sonatype Nexus 管理员初始密码

HoneyMoose

数据量剧增怎么办?Redis切片集群了解一下

芥末拌个饭吧

后端 redis 底层原理 10月月更

Fabric8 Docker Maven Plugin 如何让部署的时候执行 Docker 打包推送

HoneyMoose

React源码中的dom-diff

夏天的味道123

React

Webpack中的高级特性

Geek_02d948

webpack

在线问题反馈模块实战(九)​:实现图片上传功能(下)

bug菌

springboot 项目实战 10月月更

你知道Redis有哪些潜在的阻塞点吗

芥末拌个饭吧

后端 redis 底层原理 10月月更

Visual Studio (VS2017)提交代码到Git服务器流程(GitCode)

DS小龙哥

10月月更

Maven docker-maven-plugin 插件 Push 413 错误

HoneyMoose

“程”风破浪的开发者|慢慢踏上算法学习之旅

六月暴雪飞梨花

学习方法 算法 10月月更 “程”风破浪的开发者

CentOS部署Harbor镜像仓库

程序员欣宸

Docker 10月月更 habor

Vue虚拟dom是如何被创建的

yyds2026

Vue

IP报文在阿里云上的神奇之旅:同地域内云上通信

阿里技术

通信 IP 路由

在线问题反馈模块实战(七):安装部署swagger2

bug菌

springboot 项目实战 10月月更

ScheduledThreadPoolExecutor踩过最痛的坑

小小怪下士

Java 程序员

Qt|模态窗口如何实现进入页面等待加载数据效果

中国好公民st

c++ qt 10月月更

深度解读Webpack中的loader原理

Geek_02d948

webpack

Python继承还不会,看这篇就够了

芥末拌个饭吧

继承 python 3.5+ 10月月更

Webpack完整打包流程分析

Geek_02d948

webpack

CentOS 上安装 Sonatype Nexus 仓库

HoneyMoose

“程”风破浪的开发者|镜像仓库迁移的方法

琦彦

学习方法 Harbor 10月月更 “程”风破浪的开发者

Webpack中的plugin插件机制

Geek_02d948

webpack

HashMap源码分析(三)

知识浅谈

HashMap底层原理 10月月更

深入浅出--Linux基础命令知识(总结,配图文解释)

木偶

Linux ubuntu 10月月更

因许可证不兼容,50 万+项目受到影响,Rails 替换了出问题的库_开源_田晓旭_InfoQ精选文章