2009-02-13 54 views
6

我的很多项目都包含Castle/NHibernate/Rhino-Tools堆栈。令人困惑的是Castle取决于一些NHibernate库,NHibernate取决于一些Castle库,而Rhino-Tools取决于两者。如何将外部库打包到.Net项目中?

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

现在,我在我的项目树中的my/thirdparty/libs文件夹中包含了单独文件夹中的所有项目。我应该只在我的项目中使用/ thirdparty/libs/rhino-tools并从那里使用Castle/NHibernate库?这似乎没有复制文件是合乎逻辑的,但我也希望每个项目都有自己独特的文件夹。

您对此有何看法?

回答

1

我使用每个文件夹,这似乎是约定。

  1. 如果您要复制它们,真的会有所作为吗?
  2. 如果你想切换一个呢?假设您使用新的O/R映射器。删除NHibernate文件夹要比选择性地删除Rhino-Tools文件夹中的DLL要容易得多。
  3. 借此它是合乎逻辑的结论,你就不会在你的lib文件夹中的任何文件夹组织,因为一切使用log4net的:)
+0

如果你保留其他文件夹,你会从Rhino-Tools文件夹中删除所有的Castle/NHibernate库文件吗?我想我得到的是如何组织没有大量重复的第三方依赖关系。 – 2009-02-13 08:39:24

1

添加额外的探测路径,您的app.config文件来定位依赖的DLL。这样,你只需要一份你想要的东西就可以逃脱。虽然使用此功能有一些怪癖(您必须以某种方式创建文件夹结构)。查看here了解更多关于标签的信息。

1

我将定义建议在每个项目树中都有第三方或供应商文件夹。如果您发现有32个rhino-tools软件包令人讨厌,您可以在代码库中拥有它的一个副本,并在项目树中对其进行外部引用。假设你正在使用SVN,你可以创建一个名为“thirdparty libs”的存储库,并在这个版本库中有版本化的副本。然后,您在项目树中的“第三方”文件夹中创建一个外部属性,然后依次自动检查您的集中式第三方库。这样,例如,如果出现安全性或错误修正,只需在一个位置更新,但每个项目仍然在选择使用哪个第三方库和哪些版本。

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

3

这是我们试图在Refix open source project on CodePlex中解决的一个问题。

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

它也将尝试解决冲突的版本号 - 也可能是原谅不匹配的组件版本号,导致解决方案编译但在运行时因无法加载依赖项而翻倒,因为两个不同版本将需要。

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

相关问题