当前位置: 首页 > news >正文

开源协议概览

身为程序员,我们不可避免的要和开源项目打交道,不管是我们自己做了些开源项目,还是使用开源项目,对各种开源协议的了解是必要的。

OSI(Open Source Initiative)

OSI,开发源代码组织,是一个旨在推动开源软件发展的非盈利组织。目前受到OSI承认的开源协议一共83种,具体协议可以在OSI 官网查看。

在 Github 上如何添加开源协议

我们在 Github 上创建一个开源项目时,新建一个名为 LICENSE 的文件时,就会弹出选择开源协议的按钮,我们点进去就可以看到,Github 默认支持的协议模板。点击协议会有详细的介绍。

开源协议一览表

开源协议特点共享修改衍生商业化例子
Apache允许商业使用和闭源,但需要保留版权声明和使用许可条款可以自由地查看、使用、修改和共享源代码,但修改后的项目必须开放源代码库的链接可以自由选择协议进行修改和衍生项目可以自由选择协议进行商业化Hadoop分布式计算框架、Apache Tomcat Web服务器等
GPL最严格和强大的,要求任何使用、修改或衍生代码的项目都必须采用GPL协议可以自由地查看、使用、修改和共享源代码必须使用GPL协议进行修改和衍生项目必须使用GPL协议进行商业化Linux操作系统、GIMP图像编辑器等
BSD简洁和慷慨的,允许商业使用和闭源,但需要保留版权声明可以自由地查看、使用、修改和共享源代码可以自由选择协议进行修改和衍生项目可以自由选择协议进行商业化FreeBSD操作系统、Nginx Web服务器等
MIT简单和宽松的,允许商业使用和闭源,但需要保留版权声明可以自由地查看、使用、修改和共享源代码可以自由选择协议进行修改和衍生项目可以自由选择协议进行商业化React JavaScript库、TensorFlow机器学习框架等
Mozilla旨在保护用户隐私和自由,允许商业使用和闭源,但需要保留版权声明可以自由地查看、使用、修改和共享源代码必须使用MPL协议进行修改和衍生项目必须使用MPL协议进行商业化Firefox浏览器、Rust编程语言等
LGPL允许商业使用和闭源,但需要保留版权声明和使用许可条款,并开放源代码库的链接可以自由地查看、使用、修改和共享源代码,但修改后的项目必须开放源代码库的链接必须使用LGPL协议进行修改和衍生项目,并开放源代码库的链接必须使用LGPL协议进行商业化,并开放源代码库的链接Qt开发框架、GTK+图形界面库等

三、Apache 2.0
3.1 关键词
修改代码需要说明

3.2 关键点
需要保留原有作者的声明
如果修改了代码,需要进行说明
不承担责任
可以新增许可,但不能对 Apache 协议造成更改
3.3 商业化
可用于商业

3.4 举个栗子
小益使用 Apache 协议开源了一个 Android 类库,只要小张引用类库时保留了原作者的声明,并对修改的源码进行说明,那后续项目开源与否,都是符合协议的。

3.5 使用此协议的开源项目
hadoop,tomcat

四、BSD 2
4.1 关键词
声明协议

4.2 关键点
再发布的产品中包含源代码,则在源代码中必须带有原来代码中的BSD协议
如果再发布的只是二进制类库/软件,则需要在类库/软件的文档那个和版权声明中包含原来代码中的BSD协议
4.3 商业化
允许闭源商业软件的发布和销售

4.4 使用此协议的开源项目
brew

五、BSD 3
5.1 关键词
声明协议

5.2 关键点
相比 BSD 2.0 新增协议如下: 不可以用开源代码的“作者/机构的名字”或“原来产品的名字”做市场推广

5.3 商业化
允许闭源商业软件的发布和销售

5.4 举个栗子
小益使用 BSD 协议开源了一个 Android 类库,只要小张引用类库时保留了原作者的声明,并对修改的源码进行说明,那后续项目开源与否,都是符合协议的。

5.5 使用此协议的开源项目
flask,redis,numpy

六、MIT
6.1 关键词
许可声明

6.2 关键点
软件中必须包含许可声明
6.3 商业化
允许商业化

6.4 举个栗子
小益使用 MIT 协议开源了一个 Android 类库,只要小张引用类库时保留包含了许可声明,那后续项目开源与否,都是符合协议的。

6.5 使用此协议的开源项目
vue,react,bootstrap,vscode,electron,axios,terminal

七、GPL 2.0
7.1 关键词
感染

7.2 关键点
使用 / 修改 / 衍生 GPL 类库的代码或软件,必须也采用 GPL 协议进行开源
项目开源后可以再增加其他开源协议,但是协议必须比 GPL 宽泛
不提供品质担保,使用采用此协议的软件产生的任何后果都不会负责
7.3 商业化
可以用于商业,但是必须开放源码

7.4 举个栗子
小益使用 GPL 协议开源了一个 Android 类库,这个时候小张做开发时,本着不重复造轮子的想法,在项目中引用了小益的类库。项目开发完成以后,小张想把项目上架到 GooglePlay,但是不想开源,这个时候就违反了 GPL 协议。 为了不违反协议,小张索性将项目开源,而在选择开源协议的时候,小张必须选择 GPL 协议。

GPL 的本质就是生生不息,不断衍生。

7.5 使用此协议的的开源项目
Linux,GCC,scapy

八、GPL 3.0
GPL 3.0 相比 2.0 新增了一些条例:

任何向 GPL 项目贡献的成果将永远以 GPL 协议发行
GPL 软件设备的用户有权更改软件
使用此协议的的开源项目
GIMP,Bash,YouCompleteMe

九、LGPL
9.1 关键词
引用类库无需开源

9.2 关键点
LGPL 允许商业软件通过引用(link)的方式使用 LGPL 类库,而不需要开放源代码
但是如果修改或衍生 LGPL 协议代码,则必须采用 LGPL 协议
9.3 商业化
适合商业软件

9.4 举个栗子
小益使用 LGPL 协议开源了一个 Android 类库,小张做开发时引用了此类库。之后小张将项目上架到 GooglePlay 而不开源,是没有违反协议的。但是小张引用类库时,是以源码的形式引用的,那就必须要将项目开源了。

9.5 使用此协议的的开源项目
alibaba/jvm-sandbox

十、AGPL 3.0
10.1 关键词
网络交互

10.2 关键点
AGPL 在 GPL 的基础上,增加了一条限制,通过网络与用户交互,也需要提供源代码

10.3 商业化
可以用于商业,但是必须开放源码

10.4 使用此协议的开源项目
octotree

十一、EPL 2.0
11.1 关键词
修改源码需要开源

11.2 关键点
修改源码后发布需要开源
软件贡献者再次将源码开源发布时,需要使用 EPL 协议,除非得到作者授权
项目中引用了 EPL 协议的代码,项目开源时可以使用其他协议,但是引用的那部分代码仍然需要使用 EPL 协议
11.3 商业化
允许闭源商业软件的发布和销售

11.4 使用此协议的开源项目
che

十二、MPL
12.1 关键词
版权集中

12.2 关键点
修改后的代码版权归软件的发起者,可以免费使用
12.3 商业化
允许闭源商业软件的发布和销售

12.4 举个栗子
小益使用 MPL 协议开源了一个 Android 类库,小张对源码进行修改以后重新发布,修改后的源码版权也属于小益。

12.5 使用此协议的开源项目
syncthing,firefox-ios

如何选择开源协议

如果想省事,不关系别人用自己的代码去做什么,直接选 MIT 或者 BSD 就好
如果想代码修改以后做出声明,选择 Apache 协议
如果想“繁衍”后代,那么使用 GPL 协议
其实看了上述介绍,了解了各个协议之间的区别,我们基本上也就清楚项目该选哪种协议了。如果还不清楚,可参照此网站。

参考

GNU通用公共许可证
GNU General Public License, version 1
GNU通用公共许可协议
LGPL 与GPL的区别

相关文章:

开源协议概览

身为程序员,我们不可避免的要和开源项目打交道,不管是我们自己做了些开源项目,还是使用开源项目,对各种开源协议的了解是必要的。 OSI(Open Source Initiative) OSI,开发源代码组织,是一个旨在推动开源软件…...

分布式缓存

分布式缓存 缓存雪崩 缓存雪崩我们可以简单的理解为:由于原有缓存失效,新缓存未到期间所有原本应该访问缓存的请求都去查询数据库了,而对数据库 CPU 和内存造成巨大压力,严重的会造成数据库宕机。从而形成一系列连锁反应&#xf…...

BSC/平衡记分卡

一、Balanced Score Card BSC即平衡计分卡(Balanced Score Card),是常见的绩效考核方式之一,是从财务、客户、内部运营、学习与成长四个角度,将组织的战略落实为可操作的衡量指标和目标值的一种新型绩效管理体系。 是…...

论文阅读_训练大模型用于角色扮演

英文名称: Character-LLM: A Trainable Agent for Role-Playing 中文名称: 角色-LLM:训练Agent用于角色扮演 文章: [https://arxiv.org/abs/2310.10158](https://arxiv.org/abs/2310.10158) 作者: Yunfan Shao, Linyang Li, Junqi Dai, Xipeng Qiu 机构: 复旦大学…...

v-if控制div内容显示,克隆这个div但是v-if没有效果

问题描述: 我的子页面打印的时候通过isPdf来隐藏“选择参加人员”按钮。 我子页面有个el-dialog,el-dialog里面有个大的div它的id为app-pre-meet-add,在子页面我通过isPdf来显示我想要的内容。现在我在父页面先通过this.$refs.child.control…...

flutter的状态管理学习

文章目录 1.flutter widget分类2. 代理组件又分为3. 状态 state 数据4. 刷新 数据变化5. code 1.flutter widget分类 组合渲染代理 2. 代理组件又分为 Positioned向父组件传递数据InheritedWidget向子组件传递数据 3. 状态 state 数据 状态就是用到了向子组件传递数据&#xff…...

开源免费虚拟化KVM的部署及其虚拟机资源变更、快照、克隆等常见运维操作

实践说明:基于RHEL9(AlmaLinux9.1)部署,同类系统(CentOS9,RockyLinux9等)适用,但适用场景是不限于此的。 文档说明:本文档旨在帮助快速应用KVM虚拟化技术,重在实践操作,提供了简要参考。 文档形成时期&…...

阿里云git clone超时报错解决方法

参考:引用文章...

力扣刷题-二叉树-合并二叉树

617.合并二叉树(经典) 合并二叉树是操作两棵树的题目里面很经典的,如何对两棵树遍历以及处理? 给定两个二叉树,想象当你将它们中的一个覆盖到另一个上时,两个二叉树的一些节点便会重叠。 你需要将他们合并…...

了解JavaScript 加密、混淆和生成签名

分析并理解网站的 JavaScript 加密、混淆和生成签名的方法是 JavaScript 逆向工程中的一个重要方面。这些技术通常用于保护代码免遭未授权的访问和修改,或确保数据在传输过程中的安全性。 加密 目的:加密用于保护敏感数据,使得只有拥有正确密…...

Go语言的指针(深度解析)

指针是Go语言中的一个重要概念,它提供了对内存地址的直接访问和操作能力。通过指针,我们可以高效地传递和修改变量的值,避免了值传递所带来的拷贝开销。在本文中,我们将深入探讨Go语言指针的概念、使用方法和注意事项。 指针的本…...

HTB-SAU

信息收集 # cat port.nmap # Nmap 7.94 scan initiated Thu Jan 11 19:26:51 2024 as: nmap -sS --min-rate 10000 -p- -oN port.nmap 10.10.11.224 Nmap scan report for 10.10.11.224 (10.10.11.224) Host is up (0.28s latency). Not shown: 65531 closed tcp ports (r…...

AI创新之美:AIGC探讨2024年春晚吉祥物龙辰辰的AI绘画之独特观点

🎬 鸽芷咕:个人主页 🔥 个人专栏:《粉丝福利》 《linux深造日志》 ⛺️生活的理想,就是为了理想的生活! ⛳️ 推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下…...

Linux的SSH服务

一.SSH服务简介 1.什么是SSH SSH(Secure Shell)是一种安全通道协议,主要用来实现字符界面的远程登录、远程复制等功能。SSH 协议对通信双方的数据传输进行了加密处理,其中包括用户登录时输入的用户口令,SSH 为建立在应…...

MySQL连续案例续集

01)查询学过「张三」老师授课的同学的信息 SELECT s.*, c.cname, t.tname, sc.score FROM t_mysql_teacher t, t_mysql_course c, t_mysql_student s, t_mysql_score sc WHERE t.tid c.tid AND c.cid sc.cid AND sc.sid s.sid AND t.tname ‘张三’ 02&#x…...

【STM32读取HX711的函数】

[两个普通IO读取HX711数据的函数-主芯片是STM32F407] 以下是.h文件中的内容: #ifndef __hx711_h #define __hx711_h #define HX711CH1_DIO_GROUP GPIOA #define HX711CH1_CLK_GROUP GPIOA #define HX711CH1_DIO_PIN GPIO_Pin_1 #define HX711CH1_CLK_PIN GPIO_Pin…...

MATLAB对数据隔位抽取和插值的几种方法

对于串行的数据,有时我们需要转成多路并行的数据进行处理,抽取;或者是需要对数据进行隔点抽取,或对数据进行插值处理。此处以4倍抽取或插值为例,MATLAB代码实现。 文章目录 抽取方法一:downsample函数方法…...

[NSSCTF Round#16 Basic] CPR

打着玩玩,比赛很简单。 Crypto pr 一个RSA题,n1p*q,n2q*r给了两个c和p,r而且flag经过pad用单因子无法解出。分别用p,r解完再取crt from Crypto.Util.number import * import randomflagplaintext NSSCTF{****************} charset abcdefghijklmn…...

LAMMPS 文献:9 种熔化温度模拟方法的总结与比较:两相法、单相法以及缺陷法

记录一下检索到一篇通过LAMMPS模拟熔化温度的总结文章:单相方法、过热–过冷方法、Z 方法、修正 Z 方法、孔洞方法、修正孔洞方法、两相方法、夹层方法以及修正两相法。 感谢论文的原作者! 文章题目: A comprehensive investigation on the…...

JSR-107 (JCACHE)

JSR107 Specification 1.1.1 Maintenance Release https://docs.google.com/document/d/1ijduF_tmHvBaUS7VBBU2ZN8_eEBiFaXXg9OI0_ZxCrA/edit?pli1 What is JSR-107? JSR-107 is a standardized API for temporary, in-memory caching in Java applications. It defines a s…...

第19节 Node.js Express 框架

Express 是一个为Node.js设计的web开发框架,它基于nodejs平台。 Express 简介 Express是一个简洁而灵活的node.js Web应用框架, 提供了一系列强大特性帮助你创建各种Web应用,和丰富的HTTP工具。 使用Express可以快速地搭建一个完整功能的网站。 Expre…...

Linux 文件类型,目录与路径,文件与目录管理

文件类型 后面的字符表示文件类型标志 普通文件:-(纯文本文件,二进制文件,数据格式文件) 如文本文件、图片、程序文件等。 目录文件:d(directory) 用来存放其他文件或子目录。 设备…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互

物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...

rknn优化教程(二)

文章目录 1. 前述2. 三方库的封装2.1 xrepo中的库2.2 xrepo之外的库2.2.1 opencv2.2.2 rknnrt2.2.3 spdlog 3. rknn_engine库 1. 前述 OK,开始写第二篇的内容了。这篇博客主要能写一下: 如何给一些三方库按照xmake方式进行封装,供调用如何按…...

工业安全零事故的智能守护者:一体化AI智能安防平台

前言: 通过AI视觉技术,为船厂提供全面的安全监控解决方案,涵盖交通违规检测、起重机轨道安全、非法入侵检测、盗窃防范、安全规范执行监控等多个方面,能够实现对应负责人反馈机制,并最终实现数据的统计报表。提升船厂…...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M:百万(Million) B:十亿(Billion) 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的,但是一个参数所表示多少字节不一定,需要看这个参数以什么…...

QMC5883L的驱动

简介 本篇文章的代码已经上传到了github上面,开源代码 作为一个电子罗盘模块,我们可以通过I2C从中获取偏航角yaw,相对于六轴陀螺仪的yaw,qmc5883l几乎不会零飘并且成本较低。 参考资料 QMC5883L磁场传感器驱动 QMC5883L磁力计…...

java 实现excel文件转pdf | 无水印 | 无限制

文章目录 目录 文章目录 前言 1.项目远程仓库配置 2.pom文件引入相关依赖 3.代码破解 二、Excel转PDF 1.代码实现 2.Aspose.License.xml 授权文件 总结 前言 java处理excel转pdf一直没找到什么好用的免费jar包工具,自己手写的难度,恐怕高级程序员花费一年的事件,也…...

AtCoder 第409​场初级竞赛 A~E题解

A Conflict 【题目链接】 原题链接:A - Conflict 【考点】 枚举 【题目大意】 找到是否有两人都想要的物品。 【解析】 遍历两端字符串,只有在同时为 o 时输出 Yes 并结束程序,否则输出 No。 【难度】 GESP三级 【代码参考】 #i…...

ESP32读取DHT11温湿度数据

芯片:ESP32 环境:Arduino 一、安装DHT11传感器库 红框的库,别安装错了 二、代码 注意,DATA口要连接在D15上 #include "DHT.h" // 包含DHT库#define DHTPIN 15 // 定义DHT11数据引脚连接到ESP32的GPIO15 #define D…...