【发布时间】:2016-06-16 23:56:53
【问题描述】:
我正在迁移到 nuget,但遇到了以下问题: 我有三个项目 A、B、C,A 依赖于 B 和 C,B 依赖于 C:
- A => B,C
- B => C
项目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], 'InterfaceImpl', on 'StartableBase`1[T]' 违反 类型参数'T'的约束。
发生这种情况是因为 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 上自动完成的。
【问题讨论】: