C# 我应该如何在开源项目中包含外部库?

C# 我应该如何在开源项目中包含外部库?,c#,open-source,C#,Open Source,我已经创建了一个从VisualStudio运行的开源项目。但它也依赖一些外部库来工作。这些库也是开源的。我想知道的问题是我是否应该 将用户指向这些库,让他们下载源代码,然后将它们添加到项目中 将用户指向dll并让他们直接引用它 将dll直接包含到项目中 将这些库的源代码直接包含到项目中 做这件事的最佳方式或标准方式是什么?有一些准则不是开源的,但我认为它们是适用的 我总是在源代码管理中包含所有外部库的二进制文件(标准库除外,如System.dll)。这样,签出源代码的人可以立即构建项目。此外,我

我已经创建了一个从VisualStudio运行的开源项目。但它也依赖一些外部库来工作。这些库也是开源的。我想知道的问题是我是否应该

  • 将用户指向这些库,让他们下载源代码,然后将它们添加到项目中
  • 将用户指向dll并让他们直接引用它
  • 将dll直接包含到项目中
  • 将这些库的源代码直接包含到项目中

  • 做这件事的最佳方式或标准方式是什么?

    有一些准则不是开源的,但我认为它们是适用的


    我总是在源代码管理中包含所有外部库的二进制文件(标准库除外,如System.dll)。这样,签出源代码的人可以立即构建项目。此外,我可以轻松切换到较旧版本的project,并立即在用于构建该版本的版本中建立依赖关系-这在调试较旧版本的软件时特别有用。

    我见过的大多数项目都包含一个第三方文件夹(或类似的东西),其中包含项目中的dll文件,项目引用了这些。这确保每个人都有相同的版本,并且不需要更改引用

    如果它在版本控制中,那么如果您需要切换回早期版本,它也会使调试变得更容易。

    (1)对于用户下载项目的源代码是合适的,前提是依赖项列表不会失控,并且仍然很容易获取

    (2) 基本上与(1)相同,只要您引用的是其他人构建的二进制文件。我不会在自己的包之外自己构建和分发dll

    (3) 对于二进制发行版,我会这样做,并包含每个依赖项,以便我的软件运行“开箱即用”

    (4) 除非出于某种原因需要分叉其他库,否则不要这样做(希望这种情况永远不会发生)


    编辑:对于您自己的源代码管理,请执行最简单的操作。我的建议仅适用于您的发行版(源代码和二进制)。将源代码放在自己的版本控制中的第三方库中,或者只是将头文件和二进制库放在其中,这并不少见,因为这取决于库的大小、可用性和波动性

    它们越大,您越不希望包含它们,也越希望指向它们

    您的用户在获取它们时可能遇到的问题越多,您就越希望包含它们。Sourceforge上的一些东西可能会留在那里,但Joe个人网站上的一些东西可能不会

    如果库可能会更改而导致问题,则需要在项目中包含一个版本

    如果库可能会更改以改进某些内容而不破坏某些内容,则您需要指向它们

    至少,您应该提供DLL,除非它们太大,并用版本标记它们


    此外,请检查许可证。特别是在像GPL这样的copyleft许可证下,您可能有义务确保所有内容的源代码都是您自己可用的。

    您可以根据自己的喜好使其简单或复杂。作为一个用户,我希望所有库都包含在产品的可下载发行版中。对于那些只想用最少的麻烦来使用您的项目的人来说,这使事情尽可能简单。下载外部库对用户来说确实很困难(尤其是在.Net世界中),给它们一组已知的良好依赖关系会有很大帮助。

    您应该给它们至少两个选项:

    • 二进制下载,所有可执行文件和库(无源代码)
    • 您自己的代码的完整源代码(mo外部库源代码)
    除非修改了外部库,否则不应提供外部库的源代码,在这种情况下,必须这样做。提供libarary源代码只会使您可以从中获取源代码的各个位置成倍增加,并使您对获得的版本更加困惑


    当然,您应该提供指向图书馆主页的链接。如果您是在GPL下分发,您还必须准备好自己直接提供库源。

    用版本标记它们是什么意思?指定他们应该使用的版本?还是指定您使用的版本。这样,他们就可以很好地保证构建与您提供的相同的软件。感谢所有回答的人。基本上,答案都差不多,我会选择最快的答案。