DougM和AER的答案很合理。带有静态异常的MPLv2和LGPLv3对于将触发copyleft的事件相同。但是,我认为LGPL和MPL之间缺少另一个非常重要的区别。触发copyleft时,copyleft适用于:
- 对于MPL:与原始库完全相同的文件
- 对于LGPL:针对“基于库的作品”,而不是“使用库的作品”。因此LGPL可以将他的copyleft扩展到新文件。
边缘案例:使用MPL可使用户不共享他们的改进
MPL是文件级的copyleft许可证。这意味着,如果有人(静态地或动态地)将其嵌入到更大的项目中并对文件进行更改,那么他只需要释放对该特定文件所做的更改。
如果您担心保持代码库的完整性开放,那么在某些极端情况下,MPL的这种Copyleft效果可能不足。
例如,某人可以获取项目的主文件之一,添加“ import my_private_new_file”,然后通过添加“ my_private_new_file.newAwesomeFeature.run()”来修改您的主方法。
这样,他可以向您的项目添加新功能,同时仅释放修改后的主文件,并在“ my_private_new_file”中将新功能的实际逻辑保持为封闭源。
将主文件返回给社区只是向您提供了“嘿,您添加了一个新功能”的信息,但是它不能使您将这个新功能公开纳入……如果新功能紧密相关,可能会很烦人。 -与您的图书馆正在尝试解决的问题有关。
显然,这是一个极端情况,很少有人愿意这样做,但这是在使用MPLv2时必须意识到的风险。
LGPL的编写禁止此类行为。看到:
我引用了原始LGPL许可证:
请密切注意“基于库的作品”和“使用库的作品”之间的区别。前者包含从库派生的代码,而后者必须与库结合才能运行。
Copyleft仅适用于“基于库的作品”。现在在实践中什么是“基于库的作品”?它留下了解释的空间。这不仅是一件好事,因为它意味着遵守您的许可证变得更加复杂,因此令人恐惧。它可能导致某些人根本不使用您的库。
从这个意义上讲,LGPL比MPL更具限制性,而且对项目的完整性也更具保护作用。
MPL使来自专有领域的用户可以更轻松地修复和使用您的库,同时仍然必须共享此修复程序
MPL的一个优点是,如果用户在您的库中发现错误,则可以直接在文件中修复该错误,而不必放弃所有代码,而只需提供修复程序即可。实际上,将工作分配给客户时,他可以提供指向包含修复程序的项目分支的链接,他是个好人。
通过使用LGPL,事情变得更加复杂。如果有人分叉您的项目,修复错误并将其静态嵌入到他的专有软件中,则他必须向用户分发LGPL下的“基于库的工作”。这是一个相当晦涩的概念,尤其是当库是静态嵌入的...就此而言,我认为这是原始LGPL中不存在“静态”异常之类的原始原因。它使“基于库的工作”的标识变得很简单:这是您在专有软件中调用的动态库。
结果,与LGPL相比,MPL使专有供应商更容易使用专有的软件并将其发送到库。
同时,大多数时候专有供应商没有资源也没有时间去研究您复杂的库,因此很可能不会自行修复。他们宁愿在您的GitHub仓库上打开一个问题,或者在邮件列表中发送电子邮件并等待您的修复。
在这方面,LGPL实施了更多此类行为。但是真的需要执行吗?
结论
在LGPL和MPL之间进行选择是一个棘手的问题,并且与软件许可一样,这取决于您的目标。这两个许可证非常相似,但同时却截然不同。它们是为非常不同的目标和理念而设计的。
LGPL由自由软件基金会创建,旨在使自由软件库在专有世界中得到广泛使用,但始终牢记促进自由软件并与专有软件作斗争的想法。这都是他们意识形态战略的一部分。请参阅:https:
//www.gnu.org/licenses/why-not-lgpl.html
MPL是由Mozilla设计的一种实用许可证,用于对原始库进行某种形式的共享,同时仍鼓励人们在顶部制作专有软件和附加组件(包括Mozilla本身),而这是FSF授权的做法LGPL,但仍认为有害。
从本质上讲,MPLv2被许多人视为许可许可证,而LGPLv3(包括静态异常)很少被称为这种方式。
编辑
我忘了提到一些重要的事情。LGPLv3(有或没有静态异常)均禁止透视。您可能会认为这是一个“细节”,但实际上并非如此,这取决于您的目标。您是否关心用户自由?然后,这不是一个细节。您是否在乎可以在Apple的设备上使用图书馆?VLC更关心被使用,因此他们决定使用不包含此类限制的LGPLv2。同样,这也是Linux继续使用GPLv2的原因之一。MPLv2也没有任何限制,因为它是在考虑更“实用”的开源哲学而不是FSF意识形态的情况下创建的许可证。
我可能还错过了其他类似的“次要”事情。