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

本文关键字:源代码 二进制文件 编译 开源 我们 | 更新日期: 2023-09-27 18:00:42

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

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

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

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

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

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

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

更喜欢将构建过程委托给库作者的原则,就我而言,我将自己视为此类库的使用者:我不需要每次都重新编译它。

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

我认为两者都不是

以下是放源代码的原因:

  • 开发人员可能会不小心修改代码
  • 库通常会发生变化
以下是在

解决方案中包含 DLL 的原因:

  • 使部署更加轻松
  • 减少使用不兼容版本的库的机会
  • 减少丢失参考文献的机会

那么,该怎么做呢?

  1. 将具有唯一名称(例如 ClassLibrary1(的新Class Library项目添加到解决方案中

  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 Solution 时,ClassLibrary1都会将添加到其References的最新 DLL 复制到应用程序输出文件夹,并删除它自己生成的名为 ClassLibrary1.DLL 的 DLL。并且应用程序在编译时或运行时将使用相同的 DLL 版本,您无需在每次发布应用程序时执行额外的部署或检查每个部署。

我会

说使用提供的二进制文件,因为如果您以最新版本获取源代码,则源代码可能不稳定。但是,如果他们提供版本化的二进制文件,那么它们很可能已经过测试并且是稳定的。

这也取决于您是开箱即用还是要修改它。

通常我针对二进制文件进行编译。我的解决方案上有一个文件夹供应商/库,或者我只使用 NuGet,然后针对 Dll 进行编译。

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

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

二进制文件:

  • 更稳定,除非您注意拉取源代码的发布版本
  • 容易

源:

  • 可以修改
  • 可以通过直接单步执行源代码来调试 API 的使用

最后一点通常很重要,因此即使您仅从二进制文件开始,也要准备好在 IDE 中下载和打开源代码,尤其是在您使用的库年轻或测试不善的情况下。

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