走向开放、拥抱开源 —— 如何为代码选择一个合适的开源协议

目录

一. 前言

二. 开源协议选择

2.1. 何为 LICENCE?

2.2. 快速选择开源协议

三. 主流开源许可协议(Open Source License)

3.1. 常用开源协议

3.2. MIT 协议

3.3. BSD 协议

3.4. Apache Licence 协议

3.5. LGPL 协议

3.6. GPL

四. 更多开源协议对比


一. 前言

    对于很多刚踏入开源软件这个行业的小伙伴来说,在编码过程中难免会用到其他人的成果,如果你足够细心,很容易注意到即使是一小段代码,优秀的作者都会在文件开头附上一段关于版权的声明,比如 Licensed under the MIT license。同时,一些博客(如 CSDN)也会标明“此文章采用 CC BY 4.0 CN 协议”。

    如果我们拷贝了别人的代码或文章却没注意版权问题,在国外法律意识特别强的环境下(国内版权意识也在逐步加强),那么我们的作品会因触犯别人的权益而违法。即使是最开放的开源协议,最低要求也是保留原作者对代码的声明,所以开源不等于免费,也不等于没有约束

二. 开源协议选择

2.1. 何为 LICENCE?

    LICENCE 是软件的授权许可,详细说明了获得代码后拥有的权利,哪些操作是允许的,哪些操作是禁止的。软件的版权许可证有很多方式,本文仅限于讨论开源软件协议 Open Source License。

    对于大多数人来说,没必要花大把时间去写许可协议,选择一种比较流行的开源协议就足够了,省时省力,更便于自己作品的传播,于人于己都有利。

PS:
说句题外话,很多国外开发者在尊重他人劳动成果方面做得很好,
如果 A 的作品是因为 B 的作品的启发而来,A甚至都没有使用 B 任何一句代码,
但 A 会在他的作品里面指明是受到了 B 的启发:Inspired by XXX link: http://www.xxxx.com。

2.2. 快速选择开源协议

如果你不想了解太多,只是想要一个简直直接的答案,下面给出的建议或许适合你。

1. 简单宽松的协议:

    如果你只想要一个简单点的协议不想太麻烦的话。MIT 协议相对宽松,此协议允许别人以任何方式使用你的代码同时署名原作者,但原作者不承担代码使用后的风险,当然也没有技术支持的义务。

2. 考虑有专利的情况:

    如果你的作品中涉及到专利相关。Apache 协议也是个相对宽松的协议,与 MIT 类似,但它指明了作者对用户专利上的一些授权(我的理解是软件作品中含有专利,但它授权你可以免费使用)。

3. 促进代码分享:

    如果你在乎作品的传播和别人的修改,希望别人也以相同的协议分享出来。GPL(V2 或 V3)协议要求代码分发者或者以此代码为基础开发出来的衍生作品需要以同样的协议来发布,也必须开源,因此,该协议具有“传染性”。

乌克兰程序员 Paul Bagwell 画了一张分析图,说明应该怎么选择。只用两分钟,你就能搞清楚这六种开源协议之间的最大区别:

汉化后的版本:

三. 主流开源许可协议(Open Source License)

3.1. 常用开源协议

世界上的开源许可协议(Open Source License)大概有上百种,常用的开源软件协议大致有:GPL、LGPL、BSD、MIT、Mozilla、Apache。

由宽松到严紧排序,常用的开源协议为:MIT < BSD < Apache < LGPL < GPL。

主要区别:

  1. MIT、BSD 开源协议都源自大学,体现了简单、开放和包容的特点。
  2. MIT、BSD、Apache 三者都支持闭源的后续开发。
  3. GPL、LGPL 传染性开源,编译的代码里用了这里的代码,都必须开源。

3.2. MIT 协议

    来源于大学,MIT 开源协议是史上最为简洁、慷慨的开源协议之一。作者只想保留版权,而无任何其他了限制。也就是说,你必须在你的发行版里包含原许可协议的声明,无论你是以二进制发布的还是以源代码发布的。

特点:

  1. 用户可以拿你的代码做任何想做的事情。
  2. 用户在项目副本中要包含版权声明和许可声明。
  3. 你无需承担任何责任。

代表作品: jQuery、Rails 等。

3.3. BSD 协议

    BSD 许可证也来源于大学,与 MIT 差不多,也非常简单、慷慨。BSD 有两种:BSD-2-Clause、BSD-3-Clause。

    BSD 开源协议是一个给予使用者很大自由的协议。基本上使用者可以“为所欲为”,可以自由地使用、修改源代码,也可以将修改后的代码作为开源或者专有软件再发布。前提是当你发布使用了BSD 协议的代码,或者以 BSD 协议代码为基础开发自己的产品时,需要满足三个条件:

  1. 如果再发布的产品中包含源代码,则在源代码中必须带有原代码中的 BSD 协议。
  2. 如果再发布的只是二进制类库/软件,则需要在类库/软件的文档和版权声明中包含原来代码中的 BSD 协议。
  3. 不可以用开源代码的作者/机构名字和原来产品的名字做市场推广。

    BSD 开源协议鼓励代码共享,但需要尊重代码作者的著作权。BSD 开源协议允许使用者修改和重新发布代码,也允许使用或在 BSD 代码上开发商业软件发布、销售,是对商业集成很友好的协议。因此,很多公司在选用开源产品的时候都首选 BSD 协议。

3.4. Apache Licence 协议

    来自 Apache,类似 MIT 开源协议,但它重视专利权。Apache 协议有三种:Apache License, Version 1.0、Apache License, Version 1.1、Apache License, Version 2.0。

    Apache Licence 是著名的非盈利开源组织 Apache 采用的协议。该协议和 BSD 类似,同样鼓励代码共享和尊重原作者的著作权,同样允许修改代码、再发布(作为开源或商业软件)。需要满足的条件也和 BSD 类似:

  1. 需要为使用代码的用户提供一份 Apache Licence 。
  2. 如果你修改了代码,需要在被修改的文件中说明。
  3. 在延伸的代码中(修改和由源代码衍生的代码中)需要带有原来代码中的协议、商标、专利声明和其他原作者规定需要包含的说明。
  4. 如果在发布的产品中包含一个 Notice 文件,则在 Notice 文件中需要带有 Apache Licence 。你可以在 Notice 中增加自己的许可,但不可对 Apache Licence 构成更改。

    Apache Licence 也是对商业应用友好的许可,使用者也可以在需要的时候修改代码来满足需要并作为开源或商业产品发布/销售。

代表作品:echarts、superset、dubbo、spark。

3.5. LGPL 协议

    LGPL(GNU LESSER GENERAL PUBLIC LICENSE)来自于自由软件联盟 GNU,可以翻译为更宽松的 GPL 协议,也属于传染性开源协议。

    LGPL 是 GPL 的一个主要为类库使用设计的开源协议。和 GPL 要求任何使用/修改/衍生之 GPL类库的的软件必须采用 GPL 协议不同,LGPL 允许商业软件通过类库引用(link)方式使用 LGPL类库而不需要开源商业软件的代码。这使得采用 LGPL 协议的开源代码可以被商业软件作为类库引用并发布和销售。

    但是如果修改 LGPL 协议的代码或者衍生,则所有修改的代码,涉及修改部分的额外代码和衍生的代码都必须采用 LGPL 协议,因此,LGPL 协议的开源代码很适合作为第三方类库被商业软件引用,但不适合希望以 LGPL 协议代码为基础,通过修改和衍生的方式做二次开发的商业软件采用。

    GPL/LGPL 都保障原作者的知识产权,避免有人利用开源代码复制并开发类似的产品。

3.6. GPL

    GPL(GNU GENERAL PUBLIC LICENSE)来源于自由软件联盟 GNU,GPL/LGPL 侧重于代码及衍生代码的开源与免费使用。

    GPL 协议的主要内容是只要在一个软件中使用(“使用”指类库引用,修改后的代码或者衍生代码)GPL 协议的产品,则该软件产品必须也采用 GPL 协议,既必须也是开源和免费。这就是所谓的“传染性”

    由于 GPL 严格要求使用了 GPL 类库的软件产品必须使用 GPL 协议,对于使用 GPL 协议的开源代码,商业软件或者对代码有保密要求的部门就不适合集成/采用作为类库和二次开发的基础。

    我们很熟悉的 Linux 就是采用了 GPL。GPL 协议和 BSD、Apache Licence 等鼓励代码重用的许可很不一样。GPL 的出发点是代码的 开源/免费使用/引用/修改 和衍生代码的 开源/免费使用,但不允许修改后和衍生的代码做为闭源的商业软件发布和销售。其它细节和 BSD/Apache 等协议类似。

代表作品:Linux

四. 更多开源协议对比

下方表格中出现的用词的解释:

  • 协议和版权信息(License and copyright notice):在代码中保留作者提供的协议和版权信息。
  • 声明变更(State Changes):在代码中声明对原来代码的重大修改及变更。
  • 公开源码(Disclose Source):代码必需公开。
  • 库引用(Library usage):该库可以用于商业软件中。
  • 责任承担(Hold Liable):代码的作者承担代码使用后的风险及产生的后果。如果禁止,那么作者将不会承担责任,可以理解为免责条款。
  • 商标使用(Use Trademark):可以使用作者的姓名,作品的Logo,或商标。
  • 附加协议(Sublicensing):允许在软件分发传播过程中附加上原来没有的协议条款等。
协议描述要求允许禁止
Apache一个比较宽松且简明地指出了专利授权的协议。1. 协议和版权信息
2. 声明变更
1.商用
2.分发
3.修改
4.专利授权
5.私用
6.附加协议
1.责任承担(作者免责)
2.商标使用
GPL应用最广泛的开源协议,拥有较强的版权自由(copyleft)要求。衍生代码的分发需开源并且也要遵守此协议。此协议有许多变种,不同变种的要求略有不同。1. 公开源码
2. 协议和版权信息
3. 声明变更
1.商用
2.分发
3.修改
4.专利授权
5.私用
1.责任承担
2.附加协议
MIT此协议宽松简单。在适当标明来源及免责的情况下,它允许你对代码进行任何形式的使用。1. 协议和版权信息1.商用
2.分发
3.修改
4.私用
5.附加协议
1.责任承担
ArtisticPerl社区最钟爱此协议。要求更改后的软件不能影响原软件的使用。1. 协议和版权信息
2. 声明变更
1.商用
2.分发
3.修改
4.私用
5.附加协议
1.责任承担
2.商标使用
BSD较为宽松的协议,有两个变种BSD 2-Clause 和 BSD 3-Clause,两者都与MIT协议只存在细微差异。1. 协议和版权信息1.商用
2.分发
3.修改
4.私用
5.附加协议
1.责任承担
Eclipse对商用非常友好的协议,可以用于软件的商业授权。包含对专利的优雅授权,也可以对相关代码应用商业协议。

1. 公开源码

2. 协议和版权信息

1.商用
2.分发
3.修改
4.专利授权
5.私用
6.附加协议
1.责任承担
LGPL主要用于一些代码库。衍生代码可以以此协议发布(也可以用其他协议),但与此协议相关的代码必需遵循此协议。

1. 公开源码

2. 库引用

3. 协议和版权信息

1.商用
2.分发
3.修改
4.专利授权
5.私用
6.附加协议
1.责任承担
MozillaMozilla Public License(MPL 2.0)是由Mozilla基金创建维护的,旨在较为宽松的BSD协议和更加互惠的GPL协议中找一个拆衷点。

1. 公开源码

2. 协议和版权信息

1.商用
2.分发
3.修改
4.专利授权
5.私用
6.附加协议

1.责任承担

2.商标使用

No license作者保留所有权利,不允许他人分发,复制或者创造衍生物。当你将代码发表在一些网站上时需要遵守该网站的协议,此协议可能包含了一些对你劳动成果的授权许可。比如将代码发布到GitHub,那么就必须同意别人查看和fork。1. 协议和版权信息

1.商用

2.私用

1.分发
2.修改

3.附加协议

Public domain dedication在许多国家,默认版权归作者自动拥有,所以Unlicense协议提供了一种通用的模板。此协议表作者放弃版权,将劳动成果无私贡献出来,会丧失作品全部权利,包括在MIT/X11中定义的无担保权利。1. N/A

1.商用
2.分发
3.修改

4.私用

1.责任承担

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/352032.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MATLAB提取矩阵中的一部分

MATLAB对矩阵的操作十分灵活&#xff0c;下面对最近遇到的进行总结&#xff1a; 格式A(m,n)&#xff0c;用于提取矩阵A中符合m,n要求的部分 1、提取某个元素&#xff0c;则m,n为数字标量&#xff0c;如A&#xff08;2,3&#xff09;为第二行第三列的元素。 2、提取某行某列 A…

garch模型python步骤_GARCH模型的建模步骤?

泻药&#xff0c;我将建立道琼斯工业平均指数(DJIA)日交易量对数比的ARMA-GARCH模型来演示建模步骤。原文链接&#xff1a;R语言&#xff1a; GARCH模型股票交易量的研究道琼斯股票市场指数​tecdat.cn获取数据load(fileDowEnvironment.RData)日交易量每日交易量内发生的 变化。…

JavaScript里面的居民们1-数据

编码 首先练习数字相关的一些操作&#xff1a; <div><label>Number A:<input id"radio-a" type"radio" name"math-obj" value"a"></label><input id"num-a" type"text"> <label…

GCC + pthread

多线程介绍POSIX 1003.1-2001 定义了多线程编程的标准API。这个API就是广为人知的pthreads。它的目的在于为跨平台编写多线程程序提供便利。本文介绍了Linux 和 WIN32 平台下的多线程程序的编写方法Linux 系统对 pthreads 提供了良好的支持。一般地安装完Linux系统后在/usr/inc…

MATLAB的size、length函数

size&#xff08;&#xff09;&#xff1a;获取矩阵的行数和列数 &#xff08;1&#xff09;ssize(A), 返回一个行向量&#xff0c;该行向量的第一个元素是矩阵的行数&#xff0c;第二个元素是矩阵的列数。 &#xff08;2&#xff09;[r,c]size(A), 当有两个输出参数…

python两个时间内的工作日_如何在Python中找到两个日期之间的星期一或任何其他工作日的数目?...

这是高效的-即使在开始和结束之间有一万天的时间-而且仍然非常灵活(它在sum函数内最多迭代7次)&#xff1a;def intervening_weekdays(start, end, inclusiveTrue, weekdays[0, 1, 2, 3, 4]):if isinstance(start, datetime.datetime):start start.date() # make a date from …

JS--继承

构造函数、原型、实例、原型链之间的联系 描述&#xff1a;每个构造函数都有一个原型对象&#xff1b; 每个原型对象都有一个指针&#xff0c;指向构造函数&#xff1b; 每个实例对象都有一个内部指针&#xff0c;指向原型对象&#xff1b; 若此时的原型对象是另一个类型的实例…

Linux C/C++多线程pthread实例

inux中C/C开发多线程程序多遵循POSIX线程接口&#xff08;也就是pthread&#xff09;&#xff0c;pthread涉及函数很多个&#xff08;更多参见pthread.h头文件&#xff09;&#xff0c;常用的有pthread_create、pthread_dispath、pthread_mutex_lock&#xff08;互斥锁定&#…

python 横向合并_使用Python横向合并excel文件的实例

起因&#xff1a;有一批数据需要每个月进行分析&#xff0c;数据存储在excel中&#xff0c;行标题一致&#xff0c;需要横向合并进行分析。数据示意&#xff1a;具有多个代码&#xff1a;# -*- coding: utf-8 -*-"""Created on Sun Nov 12 11:19:03 2017author:…

javafx游戏_JavaFX游戏(四连环)

javafx游戏这是我的第一个JavaFX游戏教程&#xff0c;也是我关于JavaFX面板的第一篇博客文章。 我仅用200几行代码就完成了这四款连接游戏&#xff0c;足以应付一个简单的游戏。 我在这里使用GridPane面板对磁盘进行布局&#xff0c;GridPane是JavaFX布局窗格之一&#xff0c;但…

Matlab的sort函数

1、Matlab自带排序函数sort用法 [Y,I] sort(X,DIM,MODE) sort函数默认Mode为ascend为升序&#xff0c;sort(X,descend)为降序排列。 sort(X)若X是矩阵&#xff0c;默认对X的各列进行升序排列 sort(X,dim) dim1时等效sort(X)dim2时表示对X中的各行元素升序…

django HttpResponse的用法

一、传json字典 def back_json(rquest):#JsonResponse父类是HttpResponse&#xff0c;原码里调用了json.dumps()from django.http import JsonResponseback_msg {name:name,age:123}return JsonResponse(back_msg) 二、传列表 def back_json(rquest):#JsonResponse父类是HttpR…

gcc/g++ 链接库的编译与链接

程序编译一般需要经预处理、编译、汇编和链接几个步骤。在实际应用中&#xff0c;有些公共代码需要反复使用&#xff0c;就把这些代码编译成为“库”文件。在链接步骤中&#xff0c;连接器将从库文件取得所需的代码&#xff0c;复制到生成的可执行文件中&#xff0c;这种库称为…

Speedment 3.0的新功能

如果您关注我的博客&#xff0c;那么您会知道我已经参与开源项目Speedment已有一段时间了。 在夏季和秋季&#xff0c;我完成了工具包的下一个3.0.0大型发行版的大量工作。 在这篇文章中&#xff0c;我将展示我们已经在平台中内置的一些很酷的新功能&#xff0c;并说明如何入门…

Matlab在坐标点上按顺序标序号

程序一&#xff1a; clear x[1 3 7 10]; y[2 4 9 43]; plot(x,y,r-) hold on for i1:4%用这个循环cnum2str(i);c[ ,c];text(x(i),y(i),c) end axis([0 10 0 50]) 程序二&#xff1a; xrand(10,1)*10; yrand(10,1)*10; %x,y表示任意10个点的坐标 plot(x,y,*); for i1:10text(x(…

python表情符号编码大全_Emoji的编码以及常见问题处理

我在虎嗅上看过一篇关于Emoji的趣闻, 特别有意思, 在这里跟大家分享一下。里面提到了Emoji是怎么诞生的。1999年前后&#xff0c;日本一个名叫栗田穰崇的年轻人&#xff0c;和许多直男一样&#xff0c; 给女友发的短信经常会被误解。比如&#xff0c;“知道了”被解读成“生气了…

机器学习套路三步走

机器学习的套路 1.model如何对现实的场景进行抽象2.model如何对参数进行求解3.model的效果如何评价1.抽象 例如线性回归&#xff0c;就是认为预测变量y和特征X之间存在线性关心&#xff0c;老掉牙的例子就是房价和地区收入&#xff0c;人口密度等等的线性关系 线性回归的数学假…

C及opencv指针释放问题

一个图像处理的项目运行时没有问题&#xff0c;最后关掉显示的图片时提醒触发一个断点&#xff0c;点击继续则出现以下画面&#xff1a;断点停留在释放指针的那一行。究其原因如下&#xff1a; 1.错用free释放IplImage* IplImage* input cvLoadImage("data/LOGO/2_1.jpg&…

gcc/g++基本命令简介

gcc & g现在是gnu中最主要和最流行的c & c编译器 。 g是c的命令&#xff0c;以.cpp为主&#xff0c;对于c语言后缀名一般为.c。这时候命令换做gcc即可。其实是无关紧要的。 其实编译器是根据gcc还是g来确定是按照C标准还是C标准编译链接。 下面以Test.cpp为例&#x…

python返回长度值_Python 文件 truncate() 方法(截断返回截取长度)

概述Python 文件 truncate() 方法用于截断文件并返回截断的字节长度。指定长度的话&#xff0c;就从文件的开头开始截断指定长度&#xff0c;其余内容删除&#xff1b;不指定长度的话&#xff0c;就从文件开头开始截断到当前位置&#xff0c;其余内容删除。语法truncate() 方法…