写点什么

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:003167
用户头像

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

关注

评论

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

defi存币生息理财dapp系统开发逻辑

开发微hkkf5566

InfoQ 极客传媒 15 周年庆征文|在Flutter中自定义应用程序内键盘

坚果

InfoQ极客传媒15周年庆

跨平台多媒体渲染引擎OPR简介

阿里巴巴文娱技术

音视频 弹幕 渲染

快来极狐GitLab SaaS 学习全球顶级的开源项目吧

极狐GitLab

开源

智充推出NET ZERO SERIES储能充一体机,携手比亚迪共创净零未来

Geek_60c26d

从 0 到 1,探究百亿流量验证下的 MVVM 框架设计

图灵教育

百度 MVVM 全栈设计

5年“研究”3年“实战” 之后的满分答卷

青藤云安全

网络安全 容器安全 安全服务 云原生安全

在线沙龙 | 开源小秀场——数据库技术应用实践

SelectDB

数据库 技术分享 apache doris 沙龙

直播预告 | 社交新纪元,共探元宇宙社交新体验

ZEGO即构

秒云云原生信创全兼容解决方案,推动信创产业加速落地

MIAOYUN

云原生 信创 信创云

InfoQ 极客传媒 15 周年庆征文|手把手教你使用Python实现一键抠图,照片换背景|so easy!

迷彩

Python AI 前端 6月月更 InfoQ极客传媒15周年庆

资深OpenStacker - 彭博、Vexxhost升级为OpenInfra基金会黄金成员

极客天地

flutter系列之:Material主题的基础-MaterialApp

程序那些事

flutter 程序那些事 6月月更 widget

SphereEx 正式开源面向 Database Mesh 的解决方案 Pisanix

SphereEx

开源 SphereEx 云上数据库 Database Mesh Pisanix

华为云零代码开发图片压缩工具

乌龟哥哥

6月月更

充电桩的B面是......不只公众号?还有智充小程序!

Geek_60c26d

618 大促来袭,浅谈如何做好大促备战

阿里巴巴云原生

阿里云 微服务 高可用 云原生

数据安全刻不容缓,国产智能化厂商首获SOC 2鉴证报告有何意义?

王吉伟频道

RPA 数据安全 机器人流程自动化 智能自动化 SOC 2

八连冠!浪潮云连续8年蝉联中国政务云市场第一位

云计算

小程序启动性能优化实践

百度Geek说

中原银行统一日志平台

中原银行

海量数据 中原银行 日志平台

谁说Redis不能存大key

华为云开发者联盟

数据库 华为云

君可归烈士寻亲系统开发实战

乌龟哥哥

6月月更

亚马逊云科技向你发出召唤——游戏开发者,集合!

亚马逊云科技 (Amazon Web Services)

react.js edge postcss

入驻快讯|欢迎XCHARGE智充科技正式入驻 InfoQ 写作社区!

Geek_60c26d

跟我学Python图像处理丨5种图像阈值化处理及算法对比

华为云开发者联盟

Python 人工智能 华为云

大数据生态安全框架的实现原理与最佳实践(上篇)

明哥的IT随笔

大数据 hadoop hive 数据安全

低代码分析盘点:银行业低代码应用需要规避两大误区

易观分析

代码 银行

CREMB Pro 后台子管理员 403 问题分析

CRMEB

音频 3A 处理实践,让你的应用更「动听」

融云 RongCloud

【MySQL字符串数据类型优化】char和varchar的区别

写代码两年半

数据库 sql 6月月更

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