有一天,我朋友张三跟我说在github开源了一个MD5哈希碰撞生成工具,对于给定的文本及其MD5哈希值,可以生成另一段具有相同MD5值的不同文本。我感兴趣访问这个项目,这个项目没有任何的license文件,请问这个项目到底是不是开源项目?
这个问题问的是 源代码公开叫开源?
开源这个词在我没有接触编程前完全不知道,即使接触编程多年后,我对它的理解也仅停留在“公开源代码”的层面,待我认真了解它,开源与非开源有着严谨清晰鉴定和规则。
开源倡议组织(OSI)是开源的官方机构,它制定的软件开源标准称为 [**OSD(Open Source Definition)**](https://opensource.org/osd)。
该标准定义了10条规定,原文是英文且类似法律条文,像我这种英语非常烂的人来说,每个单词是认识,组合在一起不知所云,只好借助AI翻译并解释一下,并挑一些我认为比较重要的阐述一下:
1. 自由再分发
- 许可证不能限制任何一方销售或赠送软件
- 不能对销售收取版税或费用
2. 源代码可获取
- 程序必须包含源代码
- 允许以源代码形式分发
- 如果未随产品分发源代码,必须提供公开获取的低成本途径
3. 允许衍生作品
- 许可证必须允许修改和衍生作品
- 必须允许在与原始软件相同的条款下分发这些作品
4. 保持作者源代码完整性
- 可以要求衍生作品使用不同的名称或版本号,以区别于原始软件
- 可以要求修改以“补丁文件”形式分发
看完开源定义回到上面这个问题,如果是仅仅公开源码是否可以称为开源?
我认为不是,它只满足第二条,它并没有声明可以自由分发,修改等条件,需要补充一个类似GPL,MIT等开源协议,即可视为开源。
这时张三会站出来说,我不想用一些现有的开源协议,可以自己写一个协议,他可以被认可为开源协议吗?
我认为符合开源标准OSD 的协议都可以叫开源协议,像我们熟知的 MIT,GPL协议是经过OSI官方认证的,目前有122个协议经过OSI认证,还有一些类似 WTFPL协议是没有经过官方认证,只要符合开源定义,都可以视为开源协议。
常见的开源协议介绍
本文不会详细解释协议中条款的细节,我会从实用主义角度,作为开源项目的作者身份和开源项目使用者身份出发,使用的这个协议意味着这什么。
GPL协议(全称GNU GENERAL PUBLIC LICENSE)
作为开源项目作者:
选择 GPL 表示你希望项目保持“强一致性开源”(Copyleft)。你的代码可以被任何人自由使用、研究、修改、分发,但所有基于你代码的衍生作品——无论是直接修改版本,还是链接到你的代码的程序——**都必须继续以 GPL 方式发布源代码**。这确保了你的贡献不会被纳入闭源产品,也不会被商业公司以封闭方式使用;你从社区获得的改进,也必须回馈社区。
作为开源项目的使用者:
使用 GPL 代码意味着你拥有完全的使用、学习和修改权利,但如果你将 GPL 代码整合到自己的项目中,并向外分发(包括商业分发),你必须:
- 公布你整个项目的源代码,提供可再编译的完整源码或可获得源码的方式
- 使用 GPL 作为整体项目的许可证
从使用者的角度,如何判断一个项目是否使用了GPL的代码?在源代码层面导入的GPL的包,使用静态链接或动态链接,或通过进程间通讯调用GPL的软件这些行为算不算?
源码层面和链接层面都可以算作该项目的衍生作品,跨进程不算做衍生作品。
如果一个工具库是GPL协议的,你导入你公司的项目中,只是用于公司内部的系统,哪你要不要以GPL形式开源?
我认为没有向外分发,即没有像公众提供客户端下载,可以不开源。
这就引申出了在web服务,没有分发这个概念,即使一个公司后端代码都使用了GPL代码,不存在向外分发,是不是可以不开源?
后端代码在服务器运行,不存在分发的行为,是可以不开源的,也是很多公司愿意在服务器端使用 GPL 程序的原因
为了堵住像服务器程序可以不开源情况,GNU组织创建了一个新的协议叫 AGPL
AGPL协议(全称 GNU AFFERO GENERAL PUBLIC LICENSE)
AGPL 相比 GPL 更加严格,传染性更强。只要用户通过网络与软件交互(例如 Web 应用),且你的软件中包含 AGPL 授权的代码,你就必须向用户提供完整的源代码。
这一条款有效防止了某些云服务提供商在自己的服务器上部署开源程序后,将其封装成产品出售。
LGPL协议(全称 GNU LESSER GENERAL PUBLIC LICENSE)
对比GPL 相对宽松,它允许你作为依赖链接的形式集成到自己的软件中,不受强制开源的限制,但是如果你修改了这个库的代码,产生的衍生代码并如果向外分发,必须使用LGPL协议开源
非常宽松,几乎没有限制,可以闭源,商用,修改,分发,只有一个要求,在分发时保留原作者署名和保留MIT许可证文本
如果分发的是二进制文件,需要在安装目录中提供 MIT LICENSE 文件或在文档中保留原作者署名
如果是发布源代码,在每个源文件的开头添加原作者版权和许可声明或者在项目根目录放置 LICENSE 文件,如果你修改了代码,可在 LICENSE 或 README 中注明。
WTFPL(全称 Do What the F..k You Want to Public License)
最宽松的协议,几乎没有任何法律约束,你想做什么就做什么