8

我是一名使用 Maven 和 Gradle 的 Java 开发人员,现在进入 .NET 并试图了解 Paket。据我了解,Paket 有三个不同的文件支持 .NET 解决方案的依赖管理:

  1. 一个根 paket.dependencies 文件,您可以在其中列出您的直接依赖项和版本。
  2. 一个项目特定的 paket.references 文件,其中列出了在 paket.dependencies 中列出的依赖项的子集。
  3. 一个 paket.lock 自动生成的文件,其中列出了所有直接和传递依赖项及其版本。

使用 Maven 和 Gradle,我习惯于在一个文件中指定我的依赖项。我可以指定确切的版本,并确保后续下载的依赖项是相同的。为什么Paket需要三个文件?我希望每个项目中的 paket.references 文件就足够了。在 .NET 世界中,在如何管理依赖项方面是否存在一些问题或怪癖,我不知道需要这三个文件?

4

2 回答 2

2
  1. 根 paket.dependencies 文件——您可以在此文件中对依赖项进行分组,从而访问同一依赖项的不同版本。
  2. 项目特定的 paket.references 文件——在 paket.dependencies 中为单个项目定义的依赖项。可以选择引用一组 paket.dependencies 文件中的依赖项。
  3. 一个 paket.lock 自动生成的文件——您的构建将使用此文件,而不是其他文件,以确保参考透明度。您可能会或可能不会在 paket.dependencies 中包含指定版本的说明。paket.lock 文件每次都将构建锁定到相同的特定版本。您必须有意采取某种行动,通常使用 paket update 或 paket install 来更新您希望下一个构建使用的版本。
于 2018-12-23T19:12:28.630 回答
2

问题不在于 .NET 中的依赖管理有什么独特之处。在依赖管理方面,Gradle(尽管它很棒)和 Maven 缺少一些关键特性。

  1. 每个项目分别指定每个依赖项的版本。考虑这些依赖项:

    • 项目 A:X 1.0
    • 项目 B:X 2.0,项目 A

这两个项目将使用两个不同版本的依赖项 X 构建,即使它们最终注定要用于同一个应用程序。更糟糕的是,每个项目的测试将使用不同版本的依赖 X 运行。

Paket 通过指定哪个项目需要依赖项('paket.references')以及应该单独使用哪个版本的依赖项('paket.dependencies')来解决这个问题。这样可以保证使用相同依赖项的多个项目使用相同的版本。

因为 Gradle 非常灵活,所以有多种方法可以确保在不同项目中使用相同版本声明依赖项。但它们都不是非常直观,也没有标准的方法。

  1. 在 Maven 和 Gradle 中,您可以指定直接依赖项的确切版本,传递依赖项的解析是在运行时完成的,并且取决于项目外部的因素(例如包源中可用的依赖项版本)。这可能导致在不同时间或在不同机器上使用不同依赖项对同一源进行两次构建。

这是每个平台上依赖管理的常见问题,标准解决方案是锁定文件('paket.lock'),它保存依赖解析的结果以供将来构建使用。

多年来,Gradle 没有内置对锁定文件的支持,尽管 Netflix 有一个添加锁定功能的 Nebula 插件。最近 Gradle 添加了对锁定文件的内置支持。

于 2018-12-26T06:23:40.650 回答