1
0
wiki/Blog/开源软件之道.html

138 lines
400 KiB
HTML
Raw Normal View History

2024-07-19 18:08:14 +08:00
<!DOCTYPE html>
<html><head><title>开源软件之道</title><meta charSet="utf-8"/><meta name="viewport" content="width=device-width, initial-scale=1.0"/><meta property="og:title" content="开源软件之道"/><meta property="og:description" content="介绍了开源软件的定义、优点、风险以及许可证的简介和兼容性,强调了开源软件在信息和知识共享中的重要性,同时提醒了选择合适许可证的重要性。."/><meta property="og:image" content="https://wiki.7wate.com/static/og-image.png"/><meta property="og:width" content="1200"/><meta property="og:height" content="675"/><link rel="icon" href="../static/icon.png"/><meta name="description" content="介绍了开源软件的定义、优点、风险以及许可证的简介和兼容性,强调了开源软件在信息和知识共享中的重要性,同时提醒了选择合适许可证的重要性。."/><meta name="generator" content="Quartz"/><link rel="preconnect" href="https://fonts.googleapis.com"/><link rel="preconnect" href="https://fonts.gstatic.com"/><script async src="https://umami.7wate.com/script.js" data-website-id="c061efdc-95dd-4d21-9d04-a1ffda0a85b9"></script><script>
var _hmt = _hmt || [];
(function() {
var hm = document.createElement("script");
hm.src = "https://hm.baidu.com/hm.js?94d8ccb156eb7c65abf317e6e01cdba9";
var s = document.getElementsByTagName("script")[0];
s.parentNode.insertBefore(hm, s);
})();
</script><script async src="https://www.googletagmanager.com/gtag/js?id=G-MHMEL0F832"></script><script>
(function() {
window.dataLayer = window.dataLayer || [];
function gtag() {
window.dataLayer.push(arguments);
}
gtag('js', new Date());
gtag('config', 'G-MHMEL0F832');
})();
</script><link href="../index.css" rel="stylesheet" type="text/css" spa-preserve/><link href="https://cdn.jsdelivr.net/npm/katex@0.16.0/dist/katex.min.css" rel="stylesheet" type="text/css" spa-preserve/><link href="https://fonts.googleapis.com/css2?family=IBM Plex Mono&amp;family=Schibsted Grotesk:wght@400;700&amp;family=Source Sans Pro:ital,wght@0,400;0,600;1,400;1,600&amp;display=swap" rel="stylesheet" type="text/css" spa-preserve/><script src="../prescript.js" type="application/javascript" spa-preserve></script><script type="application/javascript" spa-preserve>const fetchData = fetch(`../static/contentIndex.json`).then(data => data.json())</script></head><body data-slug="Blog/开源软件之道"><div id="quartz-root" class="page"><div id="quartz-body"><div class="left sidebar"><h1 class="page-title "><a href="..">📚 X·Eden</a></h1><div class="spacer mobile-only"></div><div class="search "><div id="search-icon"><p>Search</p><div></div><svg tabIndex="0" aria-labelledby="title desc" role="img" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 19.9 19.7"><title id="title">Search</title><desc id="desc">Search</desc><g class="search-path" fill="none"><path stroke-linecap="square" d="M18.5 18.3l-5.4-5.4"></path><circle cx="8" cy="8" r="7"></circle></g></svg></div><div id="search-container"><div id="search-space"><input autocomplete="off" id="search-bar" name="search" type="text" aria-label="Search for something" placeholder="Search for something"/><div id="results-container"></div></div></div></div><div class="darkmode "><input class="toggle" id="darkmode-toggle" type="checkbox" tabIndex="-1"/><label id="toggle-label-light" for="darkmode-toggle" tabIndex="-1"><svg xmlns="http://www.w3.org/2000/svg" xmlnsXlink="http://www.w3.org/1999/xlink" version="1.1" id="dayIcon" x="0px" y="0px" viewBox="0 0 35 35" style="enable-background:new 0 0 35 35;" xmlSpace="preserve"><title>Light mode</title><path d="M6,17.5C6,16.672,5.328,16,4.5,16h-3C0.672,16,0,16.672,0,17.5 S0.672,19,1.5,19h3C5.328,19,6,18.328,6,17.5z M7.5,26c-0.414,0-0.789,0.168-1.061,0.439l-2,2C4.168,28.711,4,29.086,4,29.5 C4,30.328,4.671,31,5.5,31c0.414,0,0.789-0.168,1.06-0.44l2-2C8.832,28.289,9,27.914,9,27.5C9,26.672,8.329,26,7.5,26z M17.5,6 C18.329,6,19,5.328,19,4.5v-3C19,0.672,18.329,0,17.5,0S16,0.672,16,1.5v3C16,5.328,16.671,6,17.5,6z M27.5,9 c0.414,0,0.789-0.168,1.06-0.439l2-2C30.832,6.289,31,5.914,31,5.5C31,4.672,30.329,4,29.5,4c-0.414,0-0.789,0.168-1.061,0.44 l-2,2C26.168,6.711,26,7.086,26,7.5C26,8.328,26.671,9,27.5,9z M6.439,8.561C6.711,8.832,7.086,9,7.5,9C8.328,9,9,8.328,9,7.5 c0-0.414-0.168-0.789-0.439-1.061l-2-2C6.289,4.168,5.914,4,5.5,4C4.672,4,4,4.672,4,5.5c0,0.414,0.168,0.789,0.439,1.06 L6.439,8.561z M33.5,16h-3c-0.828,0-1.5,0.672-1.5,1.5s0.672,1.5,1.5,1.5h3c0.828,0,1.5-0.672,1.5-1.5S34.328,16,33.5,16z M28.561,26.439C28.289,26.168,27.914,26,27.5,26c-0.828,0-1.5,0.672-1.5,1.5c0,0.414,0.168,0.789,0.439,1.06l2,2 C28.711,30.832,29.086,31,29.5,31c0.828,0,1.5-0.672,1.5-1.5c0-0.414-0.168-0.789-0.439-1.061L28.561,26.439z M17.5,29 c-0.829,0-1.5,0.672-1.5,1.5v3c0,0.828,0.671,1.5,1.5,1.5s1.5-0.672,1.5-1.5v-3C19,29.672,18.329,29,17.5,29z M17.5,7 C11.71,7,7,11.71,7,17.5S11.71,28,17.5,28S28,23.29,28,17.5S23.29,7,17.5,7z M17.5,25c-4.136,0-7.5-3.364-7.5-7.5 c0-4.136,3.364-7.5,7.5-7.5c4.136,0,7.5,3.364,7.5,7.5C25,21.636,21.636,25,17.5,25z"></path></svg></label><label id="toggle-label-dark" for="darkmode-toggle" tabIndex="-1"><svg xmlns="http://www.w3.org/2000/svg" xmlnsXlink="http://www.w3.org/1999/xlink" version="1.1" id="nightIcon" x="0px" y="0px" viewBox="0 0 100 100" style="enable-background='new 0 0 100 100'" xmlSpace="preserve"><title>Dark mode</title><path d="M96.76,66.458c-0.853-0.852-2.15-1.064-3.23-0.534c-6.063,2.991-12.858,4.571-19.655,4.571 C62.022,70.495,50.88,65.88,42.5,57.5C29.043,44.043,25.658,23.536,34.076,6.47c0.532-1.08,0.318-2.379-0.534-3.23 c-0.851-0.852-2.15-1.064-3.23-0.534c-4.918,2.427-9.375,5.619-13.246,9.491c-9.447,9.447-14.65,22.008-14.65,35.369 c0,13.36,5.203,25.921,14.65,35.368s22.008,14.65,35.368,1
<h2 id="开源软件的定义">开源软件的定义<a aria-hidden="true" tabindex="-1" href="#开源软件的定义" class="internal"> §</a></h2>
<p>开源软件促进协会 OSI 对开源软件有明确的定义OSI 对开源软件的定义一共有十个条款:</p>
<pre><code>1. 自由再发布Free Redistribution
2. 源代码Source Code
3. 派生作品Derived Works
4. 作者源代码的完整性Integrity of The Author's Source Code
5. 不能歧视任何个人和团体No Discrimination Against Persons or Groups
6. 不能歧视任何领域No Discrimination Against Fields of Endeavor
7. 许可证的发布Distribution of License
8. 许可证不能针对某个产品License Must Not Be Specific to a Product
9. 许可证不能约束其他软件License Must Not Restrict Other Software
10. 许可证必须技术中立License Must Be Technology-Neutral
</code></pre>
<p>通过开源软件定义的十个条款,可以清楚的看到 OSI 所坚持的原则:</p>
<ul>
<li><strong>坚持开放,鼓励最大化地参与和协作</strong></li>
<li><strong>尊重作者权利,同时保证程序的完整性</strong></li>
<li><strong>尊重独立和中立,避免任何可能影响这种独立性的事物</strong></li>
</ul>
<p>有了这样一个清晰而又完整的定义,在法律层面保证了开源软件的开放性,独立性和继承性。</p>
<h2 id="开源软件的优点">开源软件的优点<a aria-hidden="true" tabindex="-1" href="#开源软件的优点" class="internal"> §</a></h2>
<ul>
<li>高质量</li>
<li>零许可证费用</li>
<li>开放和自由</li>
<li>灵活可定制</li>
<li>公开透明</li>
<li>良好的学习平台</li>
</ul>
<h2 id="开源软件的风险">开源软件的风险<a aria-hidden="true" tabindex="-1" href="#开源软件的风险" class="internal"> §</a></h2>
<p>开源软件主要风险在于 <code>管理维护</code><code>技术支持</code> 以及 <code>许可证法律纠纷</code>,由于开源软件采用的协作方式,你可能无法追究某一处代码的作者(部分协议要求作者著名)。以及如果出现问题,你可能无法寻找官方的技术支持,更多的支持可能来自于社区,可这种支持不是每次都有好人跳出来帮忙。还有如果你不了解许可证可能会带来的法律风险(部分国家法律不同,如果源代码无许可证,默认著作权属于作者)。</p>
<h2 id="开源许可证简介">开源许可证简介<a aria-hidden="true" tabindex="-1" href="#开源许可证简介" class="internal"> §</a></h2>
<p>开源许可证并不只是保护作者的权利,更多是赋予用户各项权利,许可证规定了使用主体,方式,用途。明确说明了用户可以是个人或者公司等,怎么修改和运行以及是否可以用来进行其他合法用途。</p>
<p>在使用开源软件要做的第一步就是找出开源软件中所涉及的所有许可证。每个开源软件的不同版本可能会使用不同的许可证同时还有注意许可证的版本以及有些开源软件会采用双重或多重许可dual-license的模式。</p>
<p>在 OSI 的网站上列出的 <a href="https://opensource.org/licenses/category" class="external"><strong>流行并广泛使用且拥有广泛社区的许可证</strong></a>,分别是:</p>
<ul>
<li>[Apache 许可证 2.0][<a href="https://opensource.org/licenses/Apache-2.0" class="external">https://opensource.org/licenses/Apache-2.0</a> ]</li>
<li>[BSD 许可证 3-Clause][<a href="https://opensource.org/licenses/BSD-3-Clause" class="external">https://opensource.org/licenses/BSD-3-Clause</a>]</li>
<li>[BSD 许可证 2-Clause][<a href="https://opensource.org/licenses/BSD-2-Clause" class="external">https://opensource.org/licenses/BSD-2-Clause</a>]</li>
<li>[GUN 通用公共许可证(简称 GPL][<a href="https://opensource.org/licenses/gpl-license" class="external">https://opensource.org/licenses/gpl-license</a>]</li>
<li>[GUN 宽通用公共许可证(简称 LGPL][<a href="https://opensource.org/licenses/lgpl-license" class="external">https://opensource.org/licenses/lgpl-license</a>]</li>
<li>[MIT 许可证][<a href="https://opensource.org/licenses/MIT" class="external">https://opensource.org/licenses/MIT</a>]</li>
<li>[Mozilla 公共许可证 2.0(简称 MPL][<a href="https://opensource.org/licenses/MPL-2.0" class="external">https://opensource.org/licenses/MPL-2.0</a>]</li>
<li>[通用开发和发布许可证 1.0(简称 CDDL][<a href="https://opensource.org/licenses/CDDL-1.0" class="external">https://opensource.org/licenses/CDDL-1.0</a>]</li>
<li>[Eclipse 公共许可证 2.0(简称 EPL][<a href="https://opensource.org/licenses/EPL-2.0" class="external">https://opensource.org/licenses/EPL-2.0</a>]</li>
</ul>
<h2 id="许可证的兼容性">许可证的兼容性<a aria-hidden="true" tabindex="-1" href="#许可证的兼容性" class="internal"> §</a></h2>
<p>目前经过 ISO 认证的许可证多达 70 多种,被自由软件基金会认可的自由软件许可证也有数十种,而它们的条款又各不相同,有些甚至互相矛盾。这种兼容性问题被称为 <code>许可证增值问题License proliferation</code></p>
<p>怎么样才算兼容呢?如果使用许可证 A 的代码和使用许可证 B 的代码能在一个广域作品中结合在一起,那么 A 和 B 就是兼容的,否则就是不兼容的。更近一步,如果结合后的广义作品可以用许可证 A 发布,那么许可证 B 就是许可证 A 兼容的A-compatible。反之亦然但需要注意的是兼容性并<strong>不可逆</strong></p>
<h3 id="如何选择许可证">如何选择许可证<a aria-hidden="true" tabindex="-1" href="#如何选择许可证" class="internal"> §</a></h3>
<p><img src="https://static.7wate.com/img/2020/07/02/fe11588b073bf.png" alt="开源许可证.png"/></p>
<p><strong><a href="https://kaiyuanshe.cn/license-tool/" class="external">开源许可证选择工具</a></strong></p>
<p>如今开源软件早已经成为了软件领域不可或缺的重要组成部分,要以辨证的观点看待开源软件。它自由,平等,协作的精神实践了信息和知识共享的理念,并且实现了知识产权保护和分享之间的微妙平衡。同时开源带来的自由,免费有可能也是最贵的。</p>
<hr/>
<p>参考:</p>
<p>《开源软件之道》</p>
<p><a href="https://kaiyuanshe.cn/license-tool/" class="external">开源社——开源许可证选择器</a></p>
<p><a href="https://opensource.org/" class="external">Open Source Initiative</a></p>
<p><a href="http://www.ruanyifeng.com/blog/2011/05/how_to_choose_free_software_licenses.html" class="external">阮一峰《如何选择开源许可证》</a></p></article></div><div class="right sidebar"><div class="graph "><h3>Graph View</h3><div class="graph-outer"><div id="graph-container" data-cfg="{&quot;drag&quot;:true,&quot;zoom&quot;:true,&quot;depth&quot;:1,&quot;scale&quot;:1.1,&quot;repelForce&quot;:0.5,&quot;centerForce&quot;:0.3,&quot;linkDistance&quot;:30,&quot;fontSize&quot;:0.6,&quot;opacityScale&quot;:1,&quot;showTags&quot;:true,&quot;removeTags&quot;:[]}"></div><svg version="1.1" id="global-graph-icon" xmlns="http://www.w3.org/2000/svg" xmlnsXlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 55 55" fill="currentColor" xmlSpace="preserve"><path d="M49,0c-3.309,0-6,2.691-6,6c0,1.035,0.263,2.009,0.726,2.86l-9.829,9.829C32.542,17.634,30.846,17,29,17
s-3.542,0.634-4.898,1.688l-7.669-7.669C16.785,10.424,17,9.74,17,9c0-2.206-1.794-4-4-4S9,6.794,9,9s1.794,4,4,4
c0.74,0,1.424-0.215,2.019-0.567l7.669,7.669C21.634,21.458,21,23.154,21,25s0.634,3.542,1.688,4.897L10.024,42.562
C8.958,41.595,7.549,41,6,41c-3.309,0-6,2.691-6,6s2.691,6,6,6s6-2.691,6-6c0-1.035-0.263-2.009-0.726-2.86l12.829-12.829
c1.106,0.86,2.44,1.436,3.898,1.619v10.16c-2.833,0.478-5,2.942-5,5.91c0,3.309,2.691,6,6,6s6-2.691,6-6c0-2.967-2.167-5.431-5-5.91
v-10.16c1.458-0.183,2.792-0.759,3.898-1.619l7.669,7.669C41.215,39.576,41,40.26,41,41c0,2.206,1.794,4,4,4s4-1.794,4-4
s-1.794-4-4-4c-0.74,0-1.424,0.215-2.019,0.567l-7.669-7.669C36.366,28.542,37,26.846,37,25s-0.634-3.542-1.688-4.897l9.665-9.665
C46.042,11.405,47.451,12,49,12c3.309,0,6-2.691,6-6S52.309,0,49,0z M11,9c0-1.103,0.897-2,2-2s2,0.897,2,2s-0.897,2-2,2
S11,10.103,11,9z M6,51c-2.206,0-4-1.794-4-4s1.794-4,4-4s4,1.794,4,4S8.206,51,6,51z M33,49c0,2.206-1.794,4-4,4s-4-1.794-4-4
s1.794-4,4-4S33,46.794,33,49z M29,31c-3.309,0-6-2.691-6-6s2.691-6,6-6s6,2.691,6,6S32.309,31,29,31z M47,41c0,1.103-0.897,2-2,2
s-2-0.897-2-2s0.897-2,2-2S47,39.897,47,41z M49,10c-2.206,0-4-1.794-4-4s1.794-4,4-4s4,1.794,4,4S51.206,10,49,10z"></path></svg></div><div id="global-graph-outer"><div id="global-graph-container" data-cfg="{&quot;drag&quot;:true,&quot;zoom&quot;:true,&quot;depth&quot;:-1,&quot;scale&quot;:0.9,&quot;repelForce&quot;:0.5,&quot;centerForce&quot;:0.3,&quot;linkDistance&quot;:30,&quot;fontSize&quot;:0.6,&quot;opacityScale&quot;:1,&quot;showTags&quot;:true,&quot;removeTags&quot;:[]}"></div></div></div><div class="toc desktop-only"><button type="button" id="toc" class><h3>Table of Contents</h3><svg xmlns="http://www.w3.org/2000/svg" width="24" height="24" viewBox="0 0 24 24" fill="none" stroke="currentColor" stroke-width="2" stroke-linecap="round" stroke-linejoin="round" class="fold"><polyline points="6 9 12 15 18 9"></polyline></svg></button><div id="toc-content"><ul class="overflow"><li class="depth-0"><a href="#开源软件的定义" data-for="开源软件的定义">开源软件的定义</a></li><li class="depth-0"><a href="#开源软件的优点" data-for="开源软件的优点">开源软件的优点</a></li><li class="depth-0"><a href="#开源软件的风险" data-for="开源软件的风险">开源软件的风险</a></li><li class="depth-0"><a href="#开源许可证简介" data-for="开源许可证简介">开源许可证简介</a></li><li class="depth-0"><a href="#许可证的兼容性" data-for="许可证的兼容性">许可证的兼容性</a></li><li class="depth-1"><a href="#如何选择许可证" data-for="如何选择许可证">如何选择许可证</a></li></ul></div></div><div class="backlinks "><h3>Backlinks</h3><ul class="overflow"><li>No backlinks found</li></ul></div><div class="explorer mobile-only"><button type="button" id="explorer" data-behavior="collapse" data-collapsed="collapsed" data-savestate="true" data-tree="[{&quot;path&quot;:&quot;Basics&quot;,&quot;collapsed&quot;:true},{&quot;path&quot;:&quot;Basics/english&quot;,&quot;collapsed&quot;:true},{&quot;path&quot;:&quot;Blog&quot;,&quot;collapsed&quot;:true},{&quot;path&quot;:&quot;Book&quot;,&quot;collapsed&quot;:true},{&quot;path&quot;:&quot;Book/个人成长&quot;,&quot;collapsed&quot;:true},{&quot;path&quot;:&quot;Book/医学健康&quot;,&quot;collapsed&quot;:true},{&quot;path&quot;:&quot;Book/历史&quot;,&quot;collapsed&quot;:true},{&quot;path&quot;:&quot;Book/哲学宗教&quot;,&quot;collapsed&quot;:true},{&quot;path&quot;:&quot;Book/心理&quot;,&quot;collapsed&quot;:true},{&quot;path&quot;:&quot;Book/政治军事&quot;,&quot;collapsed&quot;:true},{&quot;path&quot;:&quot;Book/教育学习&quot;,&quot;collapsed&quot;:true},{&quot;path&quot;:&quot;Book/文学&quot;,&quot;collapsed&quot;:true},{&quot;path&quot;:&quot;Book/生活百科&quot;,&quot;collapsed&quot;:true},{&quot;path&quot;:&quot;Book/社会文化&quot;,&quot;collapsed&quot;:true},{&quot;path&quot;:&quot;Book/科学技术&quot;,&quot;collapsed&quot;:true},{&quot;path&quot;:&quot;Book/经济理财&quot;,&quot;collapsed&quot;:true},{&quot;path&quot;:&quot;Book/艺术&quot;,&quot;collapsed&quot;:true},{&quot;path&quot;:&quot;Book/计算机&quot;,&quot;collapsed&quot;:true},{&quot;path&quot;:&quot;Company&quot;,&quot;collapsed&quot;:true},{&quot;path&quot;:&quot;Company/信息化&quot;,&quot;collapsed&quot;:true},{&quot;path&quot;:&quot;Company/信息化/规范&quot;,&quot;collapsed&quot;:true},{&quot;path&quot;:&quot;Culture&quot;,&quot;collapsed&quot;:true},{&quot;path&quot;:&quot;Government&quot;,&quot;collapsed&quot;:true},{&quot;path&quot;:&quot;Government/中国&quot;,&quot;collapsed&quot;:true},{&quot;path&quot;:&quot;Government/中国/标准&quot;,&quot;collapsed&quot;:true},{&quot;path&quot;:&quot;Government/中国/法律&quot;,&quot;collapsed&quot;:true},{&quot;path&quot;:&quot;Journal&quot;,&quot;collapsed&quot;:true},{&quot;path&quot;:&quot;Journal/2022&quot;,&quot;collapsed&quot;:true},{&quot;path&quot;:&quot;Journal/2022/W34&quot;,&quot;collapsed&quot;:true},{&quot;path&quot;:&quot;Journal/2022/W35&quot;,&quot;collapsed&quot;:true},{&quot;path&quot;:&quot;Journal/2022/W36&quot
function toggleCallout() {
const outerBlock = this.parentElement;
outerBlock.classList.toggle(`is-collapsed`);
const collapsed = outerBlock.classList.contains(`is-collapsed`);
const height = collapsed ? this.scrollHeight : outerBlock.scrollHeight;
outerBlock.style.maxHeight = height + `px`;
let current = outerBlock;
let parent = outerBlock.parentElement;
while (parent) {
if (!parent.classList.contains(`callout`)) {
return;
}
const collapsed2 = parent.classList.contains(`is-collapsed`);
const height2 = collapsed2 ? parent.scrollHeight : parent.scrollHeight + current.scrollHeight;
parent.style.maxHeight = height2 + `px`;
current = parent;
parent = parent.parentElement;
}
}
function setupCallout() {
const collapsible = document.getElementsByClassName(
`callout is-collapsible`
);
for (const div of collapsible) {
const title = div.firstElementChild;
if (title) {
title.removeEventListener(`click`, toggleCallout);
title.addEventListener(`click`, toggleCallout);
const collapsed = div.classList.contains(`is-collapsed`);
const height = collapsed ? title.scrollHeight : div.scrollHeight;
div.style.maxHeight = height + `px`;
}
}
}
document.addEventListener(`nav`, setupCallout);
window.addEventListener(`resize`, setupCallout);
</script><script type="module">
import mermaid from 'https://cdn.jsdelivr.net/npm/mermaid/dist/mermaid.esm.min.mjs';
const darkMode = document.documentElement.getAttribute('saved-theme') === 'dark'
mermaid.initialize({
startOnLoad: false,
securityLevel: 'loose',
theme: darkMode ? 'dark' : 'default'
});
document.addEventListener('nav', async () => {
await mermaid.run({
querySelector: '.mermaid'
})
});
</script><script src="https://cdn.jsdelivr.net/npm/katex@0.16.7/dist/contrib/copy-tex.min.js" type="application/javascript"></script><script src="../postscript.js" type="module"></script></html>