作为前端,你需要了解的开源协议知识

3,427 阅读10分钟
原文链接: zhuanlan.zhihu.com
作者 百度外卖—王琬璐 @meiyu 百度外卖—游茹玉
转载请标明出处

作为前端工程师,开发中在所难免会用到一些开源框架,而每个框架都有自己的开源协议,每个开源协议之间有什么差别呢? 如果你要开源一个项目,又应该选择哪种开源协议呢?

许多开发者,对于开源协议的认知很少,本文从这些常用的前端框架入手,介绍开源常用开源协议的基础知识。

什么是开源协议?

根据 开源协议 在维基百科的定义:

开源许可是一种计算机软件和其他产品的许可类型,允许使用、修改或在定义的条款和条件下使用、修改或共享的源代码、蓝图和设计。这允许终端用户和商业公司对源代码、图纸或设计进行审查和修改,以满足自己的定制、好奇心或故障排除的需要。开源许可的软件大多是免费的,尽管这并不一定是必须的。许可证只允许非商业的重新分配或修改个人使用的源代码,通常不被认为是开源许可。然而,开源许可可能会有一些限制,尤其是对软件的起源的表达,比如要求保留作者的名字和代码中的版权声明,或要求重新分配授权软件只有在相同的许可(如copyleft许可证)。一组流行的开源软件许可证是由开源计划(OSI)根据其开源定义(OSD)批准的。

为什么要选用开源协议?

GcsSloop 写的文章 程序员不可不知的版权协议 中给出了很好的概括。

  • 首先是对作者的保护,防止知识成果被恶意利用。开源协议中一般都包含免责声明(禁止代码的作者承担代码被使用后产生的风险及后果),比如你开源了一个破解智能锁的代码,如果有人利用这个去盗窃导致他人损失,你是无需承担责任的。
  • 其次是对使用者的保护,方便使用者。使用者一看就知道自己允许进行哪些操作,不允许进行哪些操作。未添加协议的代码默认是作者保留所有权利的(对此不同国家的法律可能稍微存在区别),这就像一颗定时炸弹,如果你在项目中使用了这一份没有协议的代码,原作者只要能证明你未经许可使用了他的代码,是能够起诉你的。


当前主流开源许可证(GPL、BSD、MIT、Mozilla、Apache、LGPL)和它们的异同?

相关概念解析:

协议和版权信息(License and copyright notice):在代码中保留作者提供的协议和版权信息
声明变更(State Changes):在代码中声明对原来代码的重大修改及变更
公开源码(Disclose Source):代码必需公开。如果是基于LGPL协议 下,则只需使用的开源代码公开,不必将整个软件源码公开
库引用(Library usage):该库可以用于商业软件中
责任承担(Hold Liable):代码的作者承担代码使用后的风险及产生的后果
商标使用(Use Trademark):可以使用作者的姓名,作品的Logo,或商标
附加协议(Sublicensing):允许在软件分发传播过程中附加上原来没有的协议条款等

当前前端主流框架选取的开源协议

纵观比较常用的前端框架,用的最广泛的便是 MIT 开源协议。

列举的框架开源协议都是 MIT 。那么为什么选择 MIT 呢?
MIT是一种简短而简单的许可,只需要保留版权和许可通知。许可的作品、修改和更大的作品可以在不同的条件下分发,并且没有源代码。MIT允许别人用作者的代码做任何事情,但必须保证作者的所有权,并且作者无须承担代码使用产生的风险。

其中,要重点说一下 React 的开源协议,从 github 的提交历史来看,React 的开源协议经历了一个动荡的过程。从 LICENCE 的提交历史看,Facebook 对专利的重视程度可见一斑。

去年知乎上一个《如何看待百度要求内部全面停止使用 React / React Native?》的文章引起了前端界的热议,事情的起因是大家发现了 Facebook 专利许可证上的描述暗藏玄机。在技术开源的世界,对于开发者而言,许可证就是他们使用开源软件的 “用户协议”。而 Facebook 的开源方式跟其他家都不太一样,别家一般用的都是开源社区公认通用的许可证,而 Facebook 使用的是两个许可证,第一个是通用的 BSD 许可证,第二个是自己写的专利许可证 (patent grant)。
而在 React 的开源协议中这么写到:

意思就是:
当发生下列情况时,facebook 有权益吊销你的 React 使用权:

  • 与 facebook 及其附属机构发生利益冲突
  • 同任何一个和 facebook 有关的组织发生了法律纠纷
  • 同任何与 React 有关的组织发生利益冲突

翻译成大白话就是:如果你觉得 Facebook 侵犯了你的知识产权,同时你的核心产品是基于 React 实现,如果你想起诉 Facebook,就要权衡一下了,因为根据条款它有权利吊销你的 React 使用权。或者说你用 React 做了一个产品并且在某些领域对 Facebook 构成了利益冲突,那么它就可以强制你的产品下线。

可以说,一旦你开始使用 React 去构建你的核心产品,你的公司就被 facebook 埋下了一颗定时炸弹,并且,炸弹的引爆按钮就握在 facebook 手中。

其实这种事情,从去年就在前端技术圈开吵,后来愈演愈烈,形势每况日下:开源社区在更多 Facebook 开源的热门项目中发现了相同的许可证模式和条款。开发者认为 Facebook 的这种许可证模式正在毒害社区,污染开源精神。而且 Apache 软件基金会宣布所有使用 Apache 开源协议的软件都不得使用带有 Facebook BSD + 专利许可证模式的组件。

不过 Facebook 最后还是意识到了这些问题,修改了开源协议。

如何为我们的项目选择一个开源协议?

首先,我们要清楚我们选择开源的目的是什么?
作为个人,在开源的情况下,我们可以帮助他人,也可以获得他人的帮助,还是一个提升个人代码质量的好方法,同样,也是一个展示自己能力的好方法。世界上开源软件协议的种类非常之多,并且同一款协议有很多变种,协议太宽松会导致作者丧失对作品的很多权利,太严格又不便于使用者使用及作品的传播,所以开源作者要考虑自己对作品想保留哪些权利,放开哪些限制。
作为公司,代码开源后,会提升公司的地位,树立一个良好的品牌形象,也可以帮助公司发掘潜在员工。
那么,我们如何选择适合我们的开源许可证呢?

由一张图直观了解如何选取所需要的开源许可证。(原著:乌克兰程序员Paul Bagwell,翻译:阮一峰)

举例来说:

  • 如果我只是想专心的写代码,那么可以选择 MIT ,MIT在保证了作者的所有权的前提下允许别人使用作者的代码,且作者不需要承担使用时的风险。
  • 如果我想保护我的代码、专利,那么可以选择 Apache ,Apache 与 MIT 的区别就是提供了专利贡献者的授权,使用者需要明确这一点。

Github 专门发布了一个网站 Choosing an OSS license doesn’t need to be scary 来帮助开源项目开发者。

  1. 我想要一个简单宽松的许可证建议: MIT 许可证。这是一个宽松的、简明扼要的许可证,只要用户在项目副本中包含了版权声明和许可声明,他们就可以拿你的代码做任何想做的事情,你也无需承担任何责任。
    使用该许可证的项目:jQuery、Rails
  2. 我比较关心专利
    建议: Apache许可证。这类似于 MIT 许可证,但它同时还包含了贡献者向用户提供专利授权相关的条款。
    使用该许可证的项目:Apache、SVN和NuGet
  3. 我关心项目的共享改进
    建议:GPL( V2或 V3)许可证。这是一种 copyleft 许可证,要求修改项目代码的用户再次分发源码或二进制代码时,必须公布他的相关修改。V3版本与V2类似,但其进一步约束了在某些限制软件更改的硬件上的使用范围。
    使用该许可证的项目:Linux、Git
  4. 我的开源项目不是代码
    建议: Creative Commons。这是一个相对宽松的版权协议。它只保留几种了权利(some rights reserved)。使用者可以明确知道所有者的权利,不容易侵犯对方的版权,作品可以得到有效传播。作为作者,你可以选择以下1~4种权利组合:
    1) 署名(Attribution,简写为BY):必须提到原作者。
    2) 非商业用途(Noncommercial,简写为NC):不得用于盈利性目的。
    3) 禁止演绎(No Derivative Works,简写为ND):不得修改原作品, 不得再创作。
    4) 相同方式共享(Share Alike,简写为SA):允许修改原作品,但必须使用相同的许可证发布。
  5. 更多选择
    Licenses - http://ChooseALicense.com,这里提供了Apache/ GPL/ MIT/ Artistic/ Eclipse/ BSD/ LGPL/ Mozilla/ No License/ Public Domain Dedication 协议的适用情形、许可内容、禁止内容,及协议全文。

如何为代码添加开源协议?

GitHub

  1. 首先需要注册一个 GitHub 账号,并登录
  2. 在 GitHub 上选择创建一个新的 repository

3. 进入创建 repository 页面后,输入基本信息后,点击右下角的 Add a license 选择开源协议,默认是 none。对应的 license 可以直接选择,也可以输入自己想要的 license

4. 点击最下方 Create repository,就创建成功了。

5. 创建成功后,代码库中就可以看到自动生成了一个 LICENSE 文件。

参考文献

选择一个开源软件协议

程序员不可不知的版权协议

开源许可证都有什么区别,一般开源项目用什么许可证?

都在封杀 React/React Native ,那我到底还该不该继续学呢?

React开源协议之争知多少?

how to choose a license