6

我的很多项目都包含 Castle/NHibernate/Rhino-Tools 堆栈。令人困惑的是,Castle 依赖于一些 NHibernate 库,NHibernate 依赖于一些 Castle 库,而 Rhino-Tools 依赖于两者。

我已经在我的机器上构建了所​​有三个项目,但是我觉得复制 NHibernate/Castle 库有点多余,因为我使用 NHibernate 和 Castle 构建中的生成库构建了 Rhino-Tools。

现在,我在项目树的 /thirdparty/libs 文件夹中的单独文件夹中包含所有项目。我应该只是在我的项目中使用 /thirdparty/libs/rhino-tools 并从那里使用 Castle/NHibernate 库吗?这在不复制文件方面似乎是合乎逻辑的,但我也喜欢将每个项目放在自己不同的文件夹中。

您对此有何看法?

4

4 回答 4

3

这是我们在 CodePlex 上的 Refix 开源项目中试图解决的问题之一。

这个想法是 Refix 将解析您解决方案中的所有项目,并且在您的项目编译之前,将必要的二进制文件从您计算机上的单个本地存储库复制到解决方案树中的一个文件夹中,并将项目指向它们。这样,就无需提交二进制文件。您的本地 Refix 存储库将从远程存储库中提取二进制文件(我们正在 repo.refixcentral.com 上设置一个),您可以为您的团队/部门/公司设置一个中间存储库,该存储库可以保存任何未集中保存的其他软件.

它还将尝试解决冲突的版本号 - Visual Studio 可能过于容忍不匹配的组件版本号,导致解决方案在无法加载依赖项时编译但在运行时失败,因为需要两个不同的版本。

因此,要回答“如何在 .Net 项目中打包外部库”这个问题,我们的愿景是您不需要 - 您只需在构建脚本中包含一个 Refix 步骤,让它为您担心。

于 2010-06-11T13:25:15.590 回答
1

我为每个文件夹使用一个文件夹,这似乎是惯例。

  1. 如果你复制它们真的有区别吗?
  2. 如果你想换一个怎么办?假设您使用新的 O/R 映射器。只删除 NHibernate 文件夹比有选择地删除 Rhino-Tools 文件夹中的 DLL 要容易得多。
  3. 将其作为合乎逻辑的结论,您的 lib 文件夹中不会有任何文件夹组织,因为一切都使用 log4net :)
于 2009-02-13T08:33:18.347 回答
1

我肯定会建议在您的每个项目树中都有一个第三方或供应商文件夹。如果你觉得拥有 32 个 rhino-tools 包的副本很烦人,你可以在你的代码库中拥有它的一个副本,并在你的项目树中对它进行外部引用。

假设您使用的是 SVN,您可以创建一个名为“第三方库”的存储库,其中包含库的版本副本。然后,您在项目树中的“第三方”文件夹上创建一个外部属性,然后自动检查您的集中式第三方库。这样,例如,如果出现安全性或错误修复,您只需在一个地方进行更新,但每个项目仍然可以选择哪些第三方库以及要使用哪些版本。

关于第三方库内部的部门,我不介意那些。第一次编译项目时,由于隐式依赖关系,某些库没有复制到 bin 文件夹中,您可以将外部属性添加到 bin 文件夹中,然后它将自动检查丢失的库。这样你仍然只需要在一个地方更新你的第三方库。

于 2009-02-17T21:21:55.147 回答
1

向您的 app.config 文件添加额外的探测路径以定位依赖项 dll。这样,您就可以只拥有您想要的所有内容的一份副本。尽管使用此功能有一些怪癖(您必须以某种方式创建文件夹结构)。在此处查看有关标签的更多详细信息。

于 2009-02-13T09:39:50.277 回答