写点什么

Paket:一个面向.NET 的包管理器

  • 2016-01-15
  • 本文字数:1602 字

    阅读完需:约 5 分钟

Packet 是一个面向.NET 语言的包管理器,旨在作为广受欢迎的 NuGet 的一个替代选项。InfoQ 联系了项目联合创始人 Steffen Forkmann,了解更多有关 Paket 起源和特性的信息。

InfoQ:考虑到 NuGet 的广泛应用,你们主要出于什么目的创建一个新的.NET 包管理器?

Steffen Forkmann:虽然我们确实非常喜欢使用 NuGet 包,而且也为其生态系统做贡献,但在一些特殊的情况下,我们还是感觉很痛苦。大多数问题都是源于 NuGet“它只是一个 Visual Studio 宏”的理念。这意味着,nuget.exe 并没有被视为一个真正的依赖管理器,但作为一个宏,它允许开发人员下载包并 Visual Studio 项目内部引用它们。对于许多专业软件开发项目,这种隐藏依赖的理念带来了许多痛苦。加之 nuget.exe 存储包的路径里会带有版本号,而且没有全局概览,除非是在最简单的项目中,否则很快就会变得难以管理。

在我们开始 Paket 项目的时候,我们已经仔细进行过一些关于修改 NuGet 模型的讨论,但 NuGet 的团队明确表示,这不是他们想要的方式。由于 Paket 大多数新增功能都是破坏性的,他们无意将这些更改引入 nuget.exe。

所以,为了解决我们自己的依赖管理问题,Alexander Gross 和我就开始创建一个新的项目。项目的范围只是取代 nuget.exe,也就是取代 NuGet 的客户端。另外,我们还制定了以下项目原则:

  • 可以融入现有的 NuGet 生态系统
  • 使用最少的工具(纯文本文件)做事
  • 适用于所有平台
  • 一切都是自动化的
  • 创建一个优秀的社区

InfoQ:请您介绍下 Paket 中依赖解析的工作原理?它是如何处理冲突的?

SF:Paket 使用 paket.dependencies 文件指定项目依赖。通常仅指定直接依赖,而且所允许的包的版本范围常常很广。在“paket install”的过程中,Paket 需要指定特定包的具体版本,以及它们的传递性依赖。然后,这些版本会保存到 paket.lock 文件。

为了指定具体的版本,Paket 需要解决如下约束满足问题:对于 paket.dependencies 文件中的每一个包以及它们所有的传递性依赖,均选择最新的版本,这样,所有的版本约束就都得到了满足。

对于这个问题,通常存在不止一个解决方案,而解析器会选择它找到的第一个方案。Paket 的网站上有一篇文章更详细地解释了解析过程

如果解析器无法找到一个有效的解决方案,那么它需要向用户报告一个错误。由于搜索树可以非常大,而且可能包含许多不同种类的失败,所以它只会报告最后一个它无法解析的冲突,以及一些有关这个冲突的来源信息。

与 nuget.exe 不同,在整个解决方案中,相同的包,Paket 只允许用户使用一个版本。因此,用户不会无意中因为从不同的项目中引用同一个包的不同版本而引入版本冲突。如果实在需要同一个包的不同版本,那么可以通过依赖组来实现。

InfoQ:Paket 支持所有.NET 语言吗?(你们是否统计过它在 C#和 F#项目中的应用?)

SF:是的,Paket 基本上支持所有的.NET 语言——甚至是像 Nemerle 那样的东西。我们的大多数用户都是 C#企业型公司,但由于我们没有跟踪我们的用户,所以我们没有任何相关的统计数据。

InfoQ:您希望看到 Paket 未来增加什么特性?哪个特性是用户要求最多的?

SF:目前,我们正致力于 Paket 3.0 的开发,它会带来一项重要的新特性。基本的思路是,用户可以在 paket.dependencies 文件中引用一个 Git 库,Paket 会为用户克隆和构建项目。如果构建生成了 NuGet 包,那么用户可以把它们作为额外的包来源。

目前要求最多的特性是支持 CoreCLR/DNX 项目,但我们需要为此对 project.json 模型做些修改。遗憾的是,我们现在还没有想出一个满意的方案,但我们希望能够同微软的团队一起来解决这个问题。

InfoQ:您还有什么需要补充吗?

SF:我想谢谢所有的贡献者以及整个 Paket 社区,是他们让这个项目在如此短的时间内取得了如此巨大的成功。没有他们的帮助,这是不可能的。

Paket 是一个托管在 GitHub 上的开源项目。读者可以从 FsProjects 页面查看文档。

查看英文原文: Introducing Paket, a Package Manager for .NET

2016-01-15 18:003057
用户头像

发布了 1008 篇内容, 共 396.9 次阅读, 收获喜欢 345 次。

关注

评论

发布
暂无评论
发现更多内容

WebAssembly技术_在Web端运行C与C++程序(win10)

DS小龙哥

webassembly 3月月更

最终信息模式:终结香农极限,语义通信的另类空间

脑极体

聊聊我对敏捷项目交付的理解

老张

交付质量 项目交付

前Cisco思科首席工程师、Webex AV1第一人Thomas加入微帧科技!

微帧Visionular

视频编码

在线JSON转YAML工具

入门小站

工具

我写的 Python 代码,同事都说好

AlwaysBeta

Python Pythonic

关注:车联网的数据安全问题

發財KK

车联网 物联网 数据安全 隐私安全 信息服务

面试官:你在项目中用过 多线程 吗?

田维常

面试 java面试

都是让小程序在app运行,FinClip 与 uniapp有什么区别?

發財KK

小程序 uni-app 前端开发 sdk

超级app+轻应用=未来?

發財KK

移动应用 轻应用 快应用 App生态

在线Js,JavaScript压缩格式化工具

入门小站

工具

AI与开源的碰撞 昇思MindSpore TechDay直播来袭

Geek_2d6073

【Zeekr_Tech】为自动驾驶保驾护航—谈谈主流中间件设计

Zeekr_Tech

自动驾驶 软件架构

阿里云云原生应用平台总经理丁宇:“连接、合作、赋能”,携手加速器伙伴助力企业云上创新

阿里巴巴云原生

创业圈的哈利波特们注意了!霍格沃兹即将开学,谁是你的魔法导师?

创业邦

我们如何建立一套无参考视频质量评价体系?

声网

视频 Dev for Dev VQA

面试官:你在项目中用过 多线程 吗?

田维常

Java 开发 多线程编发编程

技术平台&应用开发专题月 | 国产化替代的本质是价值替代

用友BIP

用友 用友iuap

元宇宙跟区块链的关系是什么呢?

CECBC

java高级用法之:在JNA中将本地方法映射到JAVA代码中

程序那些事

Java Netty 程序那些事 3月月更

Linux之export命令

入门小站

去你的35岁危机|ONES 人物

万事ONES

程序员 ONES

cdr2022新版本号V24.0.0301简体语言新增功能

茶色酒

cdr2022

电阻电路的等效变换(Ⅰ)

謓泽

3月月更

5G区块链技术让建水紫陶有了“身份证”

CECBC

数字人民币为全球CBDC监管提供宝贵经验

CECBC

使用云服务器ECS搭建DoH服务的开发实践

阿里云弹性计算

征文投稿 玩转ECS DoH

女性开发者为您解读数据库的未来机遇与挑战

亚马逊云科技 (Amazon Web Services)

Hero 专栏

华为云企业级Redis揭秘第17期:集群搭载多DB,多租隔离更降本

华为云开发者联盟

数据库 redis 集群 GaussDB(for Redis) 多DB

区块链的支付模式

CECBC

小程序加入智能家居行业,共创未来美好生活

發財KK

物联网 小程序容器 智慧生活 全屋智能 智能家居生态平台

Paket:一个面向.NET的包管理器_.NET_Pierre-Luc Maheu_InfoQ精选文章