【问题标题】:Nuget dependency resolution against dynamic assemblies loading针对动态程序集加载的 Nuget 依赖项解析
【发布时间】:2016-06-16 23:56:53
【问题描述】:

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

  1. A => B,C
  2. 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 上自动完成的。

【问题讨论】:

    标签: c# .net nuget


    【解决方案1】:

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

    是的,有:

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

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

    所以,如果你对你的库的语义版本控制很严格(这很重要,否则你会遇到麻烦,所以使用它)你可以在你破坏某些东西时更新 C 到一个新的专业,并且你在 B 中的依赖将确保阻止对 A 项目中最新 C 的更新。

    【讨论】:

    • 是的,但请记住,我没有指定硬编码的依赖版本。 nuget pack 自动解决依赖关系,并在 teamcity 上生成版本。所以理想情况下我正在寻找的解决方案是:
    • AFAICT,关键是:您正在使用 nuget pack 的 AUTOMATIC 分辨率。但这还不够,因为您的 C 包有重大更改。因此,您不能只告诉 nuget“随心所欲”。但是你,而且只有你,必须保证你的依赖的兼容性。您在 nuspec 文件中执行此操作,该文件应提交,并且您的 nuget pack 命令将在打包期间使用。我错过了什么吗?
    • 一切都在 TeamCity 上完成。项目 C 2.0 发布并触发 B 构建。项目 B 更新依赖关系,因此 B 版本 1.1 将依赖于 C >= 2.0。如果我想在项目 A 中使用它,我将只能更新 C 项目和 C == 2.0,而无需更新到项目 B 1.1。这意味着可以引用项目 B v1.0 和项目 C 2.0,我想阻止这样做,因为它们不兼容。发生这种情况是因为 B 1.0 不会抱怨 C 2.0,因为以前版本的 B 允许更新版本的 C。这应该是这两者之间的一对一映射。
    • 我无法在 nuspec 文件中指定依赖版本,因为我不手动执行此操作。我可以在 TeamCity 中再执行一步,并使用一些脚本来完成,但我想避免它。应该有一种自动的方法来做到这一点
    • 项目 A,以防万一。但关键是您的 B.dll 不支持 C 2.0。所以,要么你总是更新 B,在构建 C 时,并保持两者同步,否则你总是会遇到这个问题。与 C 最新版本一起使用时,B 已损坏。所以,要么你接受你必须自己检查 B 是否支持 C 最新的可悲事实,要么你保持 B 和 C 的版本同步。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多