使用开源库时,我们应该针对源代码还是二进制文件进行编译?

在项目中使用开源库(例如SharpPcap或FakeItEasy)时,我们应该将源代码添加到解决方案中还是针对DLL进行编译并将它们放在解决方案的目录中?

我想不会

以下是不放源代码的原因:

  • 开发人员可能会不小心修改代码
  • 图书馆通常会有变化

以下是DO包含解决方案的DLL的原因:

  • 使部署变得更容易
  • 减少使用不兼容版本库的机会
  • 减少错过参考的机会

那么,怎么样?

  1. 向解决方案添加一个具有唯一名称的新Class Library项目,例如ClassLibrary1

  2. 在其项目设置的Build页面中,配置Output path到应用程序输出路径

  3. 在“ Build Events页面中,将以下行添加到Post-build event command line块:

     del "$(TargetPath)" 
  4. 将外部DLL复制到其文件夹,并将它们添加到ClassLibrary1引用中

  5. 将所有添加的引用的Copy Local设置为true

  6. 设置其他项目的Project Dependancies ,检查ClassLibrary1

  7. 从DLL放在ClassLibrary1的路径添加其他项目的引用

  8. 将其他项目中所有这些添加的DLL的Copy Local设置为false

因此,项目ClassLibrary1是解决方案的外部库的中央控件。 每次Rebuild SolutionClassLibrary1将添加到其References的最新DLL复制到应用程序输出文件夹,并删除它自己生成的名为ClassLibrary1.DLL的DLL。 在编译时或运行时的应用程序将使用相同版本的DLL,每次发布应用程序时都不需要额外部署或检查每个部署。

您应该使用二进制文件进行编译。

原因很简单:您的项目和第三方库是不同的项目,在您自己的构建过程中编译其他库可能会引入不必要的复杂性和项目依赖性。

某些库要求您在环境中安装一些工具和插件。

不是在构建过程中包含开源代码,通常我在Visual Studio解决方案的根目录中都有一个依赖项lib目录,包含二进制文件和源代码。 当我想调试第三方代码时,我只需打开另一个Visual Studio实例,然后将调试器附加到整个过程。

认为一些第三方开源库非常胖,也许你自己的代码库很小:因为你添加了很多源代码,你的构建过程会延迟很多,因为你只是添加了无用的东西(代码,插件。 …)。

我更喜欢将构建过程委托给库的作者的原则,在我的例子中,我认为自己是这种库的使用者:我不需要每次都重新编译它。

啊,如果您打算修改源代码,最佳做法应该是联系作者并向他/她发送补丁,以便他/她可以将其包含在官方发行版中。 如果没有,您知道:每次作者发布新版本时,您都会有额外的工作将新源代码与您自己的更改合并…

我会说使用提供的二进制文件作为源代码可能不稳定,如果你得到它的最新版本。 但如果他们提供版本化的二进制文件,那么他们很可能已经过测试并且稳定。

它还取决于您是否只是开箱即用或是否要修改它。

通常我会编译二进制文件。 我的解决方案上有一个文件夹vendor / libs,或者我只是使用NuGet,并编译了Dll的againest。

但是,有时我需要调试开源库,当事情没有按预期发生时。 就在那时,我链接了源代码(仅用于调试)。

在进入生产时,我使用二进制文件,因为代码已经过很好的测试。

二进制文件:

  • 更稳定,除非你注意拉动发布版本的源代码
  • 更轻松

资源:

  • 可以修改
  • 可以通过直接进入源来调试API的使用

最后一点通常很重要,因此即使您只使用二进制文件,也要准备好在IDE中下载和打开源代码,特别是如果您使用的库是年轻或经过严格测试的话。

Occam的剃刀说如果你不需要修改库,你应该使用二进制文件。