如何拥有双许可证软件(开放+关闭)

时间:2013-01-03 01:26:05

标签: licensing

我有一些我想保留的闭源代码(由我编写)。 但是我想在开源项目中使用一些代码 - 这些代码也可以由我独自编写,但是可以在任何地方发布,供任何人使用。

我怎样才能完成这样的事情:

  1. 发布开源代码版本,任何人都可以免费使用 更改,保留或退回(我相信这是zlib许可证)
  2. 同时我想要一个版本的代码 我,     并且能够合并来自#1的任何代码更改(如果有人     决定修复我发布的任何代码)
  3. 这是否就像拥有两个代码树一样简单,两者都附有不同的许可证?一个zlib许可证,一个我自己的许可证?

    注意,我有点偏向于使用zlib许可证,因为它很短,我相信我理解它并同意它是合适的(我不介意有人使用代码用于商业目的)。

2 个答案:

答案 0 :(得分:2)

第一部分确实需要两个代码树。如果您使用的是分布式SCM,例如git,mercurial或bazaar,那么它就不会太复杂:

  1. 一个回购是公开的,开源的,我们称之为open-foobar
  2. 一个回购是私有的,封闭的来源,我们称之为enterprise-foobar
  3. 在我看来,最好将开放存储库作为存储库(上游),私有的分叉并扩展,但它取决于你想保密多少代码。如果你的大多数提交都会进入私有项目,那么将那个提交作为主存储库是有意义的,但是这将很难正确管理
  4. 您的本地克隆应该将这两个存储库添加为远程存储,并且您应该在两个存储库之一上有单独的本地分支跟踪分支,例如master-open跟踪open-foobar/master,而master-enterprise跟踪enterprise-foobar/master
  5. 您在master-open分支中提交新的开放内容,然后将其推送到开放式存储库
  6. 您将master-open合并到master-enterprise,这意味着您在私有网站中包含来自开放存储库的所有提交
  7. 您在master-enterprise分支中提交新的私有内容,然后将其推送到开放式存储库,确保您不会意外地将这些提交合并到master-open分支中。
  8. 当您想要将私有提交包含在开放版本中时,您可以使用git cherry-pick <commit-id>来复制提交,而不会暴露它来自私有分支的事实
  9. 这个工作流程主要集中在git上,但它可以很容易地适应任何其他SCM系统。

    对于第二部分,默认情况下,根据明确授予您所创建代码的所有版权的合同未向您支付的人的补丁将保留代码原始作者的版权。这意味着除非他们授予您代码许可,否则您不能将其包含在您的私有分支中。通常情况下,除非在项目许可中以某种方式提及,或者在补丁提交过程中(通过单击提交按钮授予许可,否则它甚至不授予您将许可包含在开源项目中的许可) ... 的)。 Apache许可证在这里很好,因为它明确提到提交项目的补丁是自动许可的,因此它们可以包含在代码中。我没有读过zlib许可证,所以我不能说它是否有类似的条款;如果不确定包含一些文本,要求用户同意他们授予您根据项目许可将任何补丁提交包含在开源项目中的权利。

    如果您还希望将已提交的修补程序包含到您的私有项目中,那么必须要求获取代码的版权许可,以包含在其代码的任何私有衍生产品中 。有关详细信息和一些示例,请参阅Wikipedia's article on CLAs。对于某些“标准”CLA,您可以查看Project Harmony

答案 1 :(得分:1)

Apache组和其他人要求代码提交者“签署”任何更改的所有权。你需要做同样的事情。在接受修复或增强之前,他们必须签署代码。