针对动态程序集加载的Nuget依赖性解析

时间:2016-06-16 13:39:55

标签: c# .net nuget

我正在迁移到nuget,我遇到了以下问题: 我有三个项目A,B,C和A依赖于B和C而B依赖于C:

  1. A => B,C
  2. B => ç
  3. 项目C

    public interface IStartable
    {
    }
    public interface IInterface
    {
    }
    

    项目B

    public abstract class StartableBase<T> : IStartable<T> where T : IInterface
    {
    }
    

    项目A

    public class InterfaceImpl : IInterface
    {
    }
    
    public class StartableClass : StartableBase<InterfaceImpl>
    {
    
    }
    

    项目C在启动时动态加载程序集。

    现在让我们想象以下情况:

    有两个版本的C - 1.0和2.0 我忘了在项目B中更新项目C,所以它仍然引用1.0。 项目C已更新其引用,因此它引用了项目B和C v2.0。 当项目C尝试加载程序集时,它会收到消息:

      

    GenericArguments [0],&#39; InterfaceImpl&#39;,on&#39; StartableBase`1 [T]&#39;违反   类型参数的约束&#39; T&#39;。

    这是因为StartableBase期望1.0 IInterface实现,但它实现了2.0 IInterface。 C项目版本之间存在不匹配。

    我做了什么: 我将项目C添加为项目B的依赖项,因此每当我执行nuget pack时,它都将包含C作为依赖项。然而,在上述情况下,这并没有解决问题。为什么?因为nuget的默认情况是包含版本upper or equal的依赖项而不是当前依赖项版本,因此在上述情况下它将包含对C v1.0的依赖性,而项目A将能够包含C版本2.0。有没有办法说nuget pack包含完全相同的依赖版本? 请记住,这种情况只是为了简单起见 - 一切都在TeamCity上自动完成。

1 个答案:

答案 0 :(得分:0)

有没有办法说nuget pack包含完全相同的依赖版本?

是的,有:

https://docs.nuget.org/create/versioning

在您的情况下,您可以在B.nuspec文件中指定版本<dependency id="C" version="[1.0,2.0)" />

所以,如果你严格对你的库进行语义版本控制(这是至关重要的,或者你会遇到麻烦,那么使用它)你可以在破坏某些东西时将C更新为新的专业版,并且你的依赖关系在B中将确保阻止A项目中最新C的更新。