如何在.Net项目中打包外部库?

时间:2009-02-13 08:27:39

标签: c# .net dependency-management refix

我的很多项目都包含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 个答案:

答案 0 :(得分:3)

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

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

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

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

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

为app.config文件添加其他探测路径以找到依赖项dll。这样你只需要一份你想要的东西就可以逃脱。虽然使用此功能有一些怪癖(您必须以某种方式创建文件夹结构)。查看here以获取有关标记的更多详细信息。

答案 3 :(得分:1)

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

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

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