我正在迁移到nuget,我遇到了以下问题: 我有三个项目A,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],&#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上自动完成。
答案 0 :(得分:0)
有没有办法说nuget pack包含完全相同的依赖版本?
是的,有:
https://docs.nuget.org/create/versioning
在您的情况下,您可以在B.nuspec文件中指定版本<dependency id="C" version="[1.0,2.0)" />
。
所以,如果你严格对你的库进行语义版本控制(这是至关重要的,或者你会遇到麻烦,那么使用它)你可以在破坏某些东西时将C更新为新的专业版,并且你的依赖关系在B中将确保阻止A项目中最新C的更新。