为什么必须将我的开源软件许可证保留在根目录下?


10

几乎所有开源软件许可证都要求(或者至少律师通常建议他们要求)用户将完整许可证包含在他们要保护的项目的根目录中。

与我交谈的一位律师建议,这是CD时代的遗产,当时有必要在珠宝盒中包括完整的许可证。

但是今天,我们生活在云时代。例如,为什么我不能简单地在我的网站上托管完整的许可证,而在源文件的标题中包含该许可证的标题+ URL?

奖励:如果大家普遍同意必须在根目录中保留完整的许可证,那么FSF的OSI为什么不批准您可以通过URL引用的许可证,这又是什么使某人无法创建该许可证?


4
想到的一个问题是URL可以更改或中断。
亚伦·库尔扎尔斯

6
最明显的原因是“互联网无处不在”(即使某人下载软件时拥有互联网,但当他们想要扩展/修改它时,互联网可能就无法使用)。
TZHX

9
您是在问为什么需要在根目录中包含整个许可证,或者为什么要在根目录中包含整个许可证?
DougM 2013年

只是指出我们在这里似乎是在谈论错误的二分法。您问为什么许可证必须位于根目录中,为什么不能通过URL在线?第三种选择是没有人提及。许可证与软件捆绑在一起,但在“文档”目录或其他内容中,而代码文件标题中的注释反映了这一点。我同意给出为什么应该将许可证与软件捆绑在一起的充分理由,但是这并没有停留在docs目录中。
詹姆斯

4
它几乎总是根源的原因很容易找到。下载项目时,我会浏览根目录,首先看到的是许可证。就这么简单
JohnL

Answers:


24

通过GPL常见问题解答(但建议适用于所有许可):

为什么GPL要求在程序的每个副本中都包含GPL副本?

在工作中包含许可证副本至关重要,这样,每个获得该程序副本的人都可以知道他的权利。

包含引用许可证的URL而不是许可证本身可能很吸引人。但是您不确定该URL从现在起五年或十年后仍然有效。从现在开始的20年后,如今我们所知道的URL可能不再存在。

确保拥有程序副本的人尽管网络中发生了所有更改,但仍然可以继续查看许可证的唯一方法是在程序中包含许可证的副本。

(强调我的)

托管您的许可证的站点关闭或更改其URL路径后,拥有您的软件副本的人将无法再验证他们可以安全行使的权利。甚至假设您可以某种方式保证确切的URL永远在线:用户验证其对您软件的使用合法的能力仍然取决于连接到该特定URL的能力。尽管此要求在您所在的城市/国家/地区可能并不繁重,但在其他地方可能繁重。您不应强加此要求,尤其是在变通办法(包括完整的许可证文本)不重要的情况下。

您可能会回答以下问题:“那该怎么办?如果URL确实出现故障或无法访问,那么像'GNU GPL v3'这样的明确描述符就足够了。GPL的全文本足够;用户可以查找许可证本身。” 马上想到一些问题:

  1. 这不会泛化为不太清楚的许可证标识符(想到“ BSD许可证”一词)。

  2. 对于不太常见或已定制的许可证,这不能很好地泛化(想到“带有链接例外的GPL”:哪个链接例外?)。在合理期望用户按名称可靠找到许可证之前,许可证需要有多普遍?

  3. 这仍然要求用户具有Internet连接,即使在获得软件时就已经建立了连接,情况可能并非如此。(而且他们获得软件时可能还没有Internet访问权限:“ CD时代”在世界许多地方还没有结束。作为另外一种情况,请考虑具有广泛Internet访问权限但对大部分Internet进行审查的国民。)可自由分发的软件的后果是,收件人可能不会直接从您那里或通过您最初预期的分发渠道收到您的软件副本。

MichaelT在下面的评论中指出了最后一个反对许可证链接的论点:它可以让您动态,追溯地更改许可证。如果您在软件的两个版本之间更改了许可证,但是对于两个版本使用了相同的许可证链接,则这可能是有意为之的,这会使您的旧许可证不复存在。对于需要证明他们以与当前版本不同的许可证获得了较早版本的人来说,这样的转换将增加困难。

那么,为什么我必须将许可证保留在项目根目录中?

我不是律师,但是我从未见过任何令人信服的论点,即您确实需要将许可证保留在项目根目录中。甚至指定许可证必须随作品的每份副本一起发布的GPL,也没有对必须如何随作品进行沉默。(这可能是因为GPL可以应用于非软件上下文中,在这种情况下“根目录”的概念没有意义。)

将许可证保留在根目录中可能是一个好主意,因为它最大程度地增加了用户看到许可证的可能性,从而最大程度地减少了用户的挫败感以及针对试图将许可证隐藏在一些晦涩的目录中而引起投诉的可能性。如果您有许多许可证,则将它们全部放置在自己的文件夹中可能会更有意义,并包括一个显而易见的项目README,该自述文件包含用于查找每个组件的许可证的文件路径。

将许可证放置在目录根目录中也是一种有用的做法,因为它可以消除被许可的模块许可证与整个工作模块的歧义。假设我的项目FooProj使用独立模块BarMod。FooProj可能是GPL许可的,而独立模块可能是MIT许可的。当我第一次打开FooProj时,我在根目录中看到GPL的副本,并且了解整个工作都是GPL许可的。当我进入BarMod的文件夹时,在那里看到一个新的许可证文件,并且我知道此文件夹的内容是MIT许可的。当然,这只是有用的帮助。您应该始终在自述文件,通知或类似文件中明确指出模块的许可。

总之,使用文件根目录是为了方便和清楚。我还没有看到任何需要它的具有法律约束力的开放源代码许可证文本,也不知道为什么会有任何理由需要它。您的许可证应易于接收者发现;将许可证包括在项目根目录中足以满足此条件,但不是必需的。


3
还考虑是否有可能链接到获得BSD许可的site.com/foo/license.txt的远程站点,但此后此站点已根据GPL v3重新许可,这就是site.com/foo/license。 txt现在包含。但是您下载的版本具有不同的权限。

我将这个答案标记为正确,因为它似乎展示了围绕OSS许可的常规和法律智慧。也就是说,这种想法让我对我们生活在这个备份,版本控制的世界感到有点偏执。我不确定规范的URL内容被篡改的风险是否大于某人意外删除其中一部分的风险。根目录中包含的许可证。即使风险更大,我也怀疑它如此之大,以至于迫使开发人员在软件中包含完整的许可证,而不是在代码注释中引用外部托管的许可证。
samthebrand

仅供参考,这也许是OSS许可的预兆:Creative Commons 4.0允许被许可者链接到包含归因信息的单独页面。
samthebrand

6

但是今天,我们生活在云时代。例如,为什么我不能简单地在我的网站上托管完整的许可证,而在源文件的标题中包含该许可证的标题+ URL?

确实存在允许这样做的许可证。以Apache 2.0为例。Apache 2.0仅要求每个源文件都包含一个小的标头,该标头指向Apache 2.0 License的规范URL。无需在源代码树中复制完整许可证。

从Apache 2.0许可证本身开始:

APPENDIX: How to apply the Apache License to your work

To apply the Apache License to your work, attach the following boilerplate
notice, with the fields enclosed by brackets "[]" replaced with your own 
identifying information. (Don't include the brackets!) The text should be  
enclosed in the appropriate comment syntax for the file format. We also 
recommend that a file or class name and description of purpose be included 
on the same "printed page" as the copyright notice for easier identification 
within third-party archives.

    Copyright [yyyy] [name of copyright owner]

    Licensed under the Apache License, Version 2.0 (the "License");
    you may not use this file except in compliance with the License.
    You may obtain a copy of the License at

        http://www.apache.org/licenses/LICENSE-2.0

    Unless required by applicable law or agreed to in writing, software
    distributed under the License is distributed on an "AS IS" BASIS,
    WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
    See the License for the specific language governing permissions and
    limitations under the License.

我认为附录是不完整的,或者至少在假定您已经包含许可证副本的情况下运行。从2.0文本本身开始,在分发Apache许可的作品时:4.(a) You must give any other recipients of the Work or Derivative Works a copy of this License;
apsillers

3

没有要求它必须在项目的根目录中。这只是最常见的地方,因此人们将首先找到寻找许可证的地方。就这一点而言,即使这并不常见,人们仍然很可能会优先考虑。由于存在用于通知的许可证,因此隐藏信息没有多大意义。

如果将其隐藏在URL后面,则不能绝对保证该URL将始终可用。如果它是项目根目录中的文件,那么根据定义,它将始终可用。

简而言之,这是最有效,最人性化的地方。


项目根目录是第一个出现的地方:它是树的顶部,文件夹层次结构的根目录。所有顶级文档都应该放在此处:自述文件,许可证等。这些文件可以指导读者深入研究项目的其他地方,但是根目录是我寻找任何东西的第一位。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.