我创建了一个从Visual Studio运行的开源项目,但它也依赖于一些外部库才能正常工作。这些库也是开源的。我想知道的问题是,我应该
- 将用户指向这些库,并让他们下载源代码,然后将它们添加到项目中
- 将用户指向dll文件,并直接引用它
- 直接将dll文件包含在项目中
- 直接将这些库的源代码包含在项目中
哪种方式是最好或标准的做法?
我创建了一个从Visual Studio运行的开源项目,但它也依赖于一些外部库才能正常工作。这些库也是开源的。我想知道的问题是,我应该
哪种方式是最好或标准的做法?
有一些指南并非特定于开源,但我认为它们适用。
我总是包含所有外部库的二进制文件(除了像System.dll这样的标准库)在源代码控制中。这样,检查源代码的人可以立即构建项目。此外,我可以轻松切换到旧版本的项目,并立即拥有构建该修订版所使用的依赖项版本 - 这在调试旧版软件时特别有用。
(1) 对于下载您项目源代码的用户来说,这是可以接受的,假设依赖项列表不会失控,并且它们易于获取。
(2) 只要您引用的是其他人构建的二进制文件,那么基本上与(1)相同。我不会在自己的软件包之外构建和分发dll文件。
(3) 对于二进制分发,我会这样做,并包含每个依赖项,以便我的软件可以“开箱即用”。
(4) 除非出于某种原因需要分叉其他库(希望永远不会发生),否则不要这样做。
编辑:对于您自己的源代码控制,请随意选择最简单的方法。我的建议仅适用于您的分发(源和二进制)。将第三方库的源代码放入您自己的版本控制中,或者只放入头文件和二进制库 - 这在您的情况下哪种方式更好,都是很常见的。
我认为这取决于库的大小、可用性和波动性。
它们越大,你就越不想包含它们,而更想指向它们。
如果你的用户在获取它们方面可能会遇到更多问题,那么你就需要包含它们。在Sourceforge上的东西可能会一直存在,但在Joe的个人网站上的东西可能不会。
如果库有可能因更改而导致问题,你需要在项目中包含一个版本。
如果库有可能因改进而不破坏现有功能而发生更改,你需要指向它们。
至少,你应该提供DLL文件,除非它们太大,并标记它们的版本。
此外,请检查许可证。特别是在像GPL这样的copyleft许可下,你可能有义务确保所有源代码都可用。
您可以将其设计得简单或复杂。作为用户,我更喜欢所有库都包含在产品的可下载分发中。这使得那些只想使用您的项目而不想麻烦的人们尽可能地简单。对于用户来说,下载外部库可能真的很困难(特别是在 .Net 世界中),给他们一个已知的良好依赖集合可以真正帮助他们。
你应该至少给他们两个选项:
除非您已修改了外部库,否则不应提供外部库的源代码,在这种情况下,您必须这样做。提供库源只会增加您可以获取源代码的各种位置,并增加对所获得版本的混淆。
当然,您应该提供到库主页的链接。如果您在发行GPL下发布程序,则还必须准备直接提供库源代码。