写点什么

NuGet 已整合到 MSBuild 中

  • 2017-04-12
  • 本文字数:1417 字

    阅读完需:约 5 分钟

对于 C#和 VB 项目文件,Microsoft 在尝试推出基于 JSON 的项目格式后,又回归到以 MSBuild 为基础。在推出此决策的同时,Microsoft 承诺会实现一些十分类似于 project.json 的特性。今天我们将探讨其中的一个特性:NuGet 集成。

一直以来,NuGet 都是一个附加(bolt-on)在 Visual Studio 中的特性。但是编译器虽然可以触发 NuGet 软件包的下载,却无法理解这些软件包。因此当一个软件包完成下载后,需要被安装到项目之中,其中可能包括更新装配引用(Assembly Reference)、拷贝文件或是运行定制的 PowerShell 脚本。这一做法是非常脆弱的,开发人员时常需要在重新安装软件包前手工清理项目文件。

随着 PackageReference 这一新特性的提出,很多类似的问题将不再出现。现在开发人员不再是引用个别的装配,而是可以引用软件包本身。

包引用现在是可传递的。这意味着你仅需引用一个软件包即可,不再需要显式地引用该软件包所需的各个软件包。按新闻发布稿中的说法,这可提升安装或更新软件包的性能达五倍。在一个例子中,一个 10 分钟的过程降低到了 30 毫秒。

NuGet 集成特性取消了解决方案层面的包文件夹,依赖将直接引用用户的“Package Cache”目录。要解释为什么 Microsoft 以前不这样,让我们重新回顾一下以前版本 NuGet 的“附加性”本质。鉴于编译器不能理解 NuGet 软件包,因此需要在项目文件中正确设置一个“路径线索”。由于每个用户可以设置自身的“Package Cache”目录,因此不能使用这样的文件夹,需要创立解决方案层面的包文件夹,以确保相对的路径线索对于所有的开发人员都是一样的。

版本控制

对 NuGet 项目引用的版本控制支持得到了很大的改进。现在可以使用范围和通配符指定想要使用的软件包版本信息。范围定义采用了数学中的通用语法:

  • 不低于 x.y 版本:[x.y
  • 高于 x.y 版本:(x.y
  • 不高于 x.y 版本:x.y]
  • 低于 x.y 版本:x.y)

举个例子,如果你需要版本不低于 1.4.2 同时不高于 1.5,可以使用“[1.4.2, 1.5)”。反之,如果你想要 1.4 版本家族中的所有版本,可以使用“1.4.*”。

现在可以使用 IncludeAssets 和 ExcludeAssets 标签控制内容。它们已被包括在构建过程中,用于修改资产的类型(分析器、内容文件等)。你甚至可以将资产标记为私有的,这意味着其所标记的资产是用于开发目的,不应该留给下游的软件库。

使用 MSBuild 创建 NuGet 软件包

虽然在 MSBuild 中总是可以使用 Exec 命令加载 NuGet 的 package 命令,并传入到规格文件中,但是在持续集成环境中最好不要这样使用。因此这次发布版本实现了 MSBuild 直接打包项目,甚至适用于使用 TargetFrameworks 标签定义了多个目标架构的项目。

谈及这个问题,可能存在对不同的目标平台应引用不同的软件包这一需求。你可以使用 PackageReference 定义一个标准的 MSBuild 条件表达式,以表示引用的适用场景。

向后兼容问题

对 NuGet 集成特性的一个主要担心是缺乏对一些旧版本 NuGet 特性的支持,例如内容文件夹(Content Folder)、XML 文档转换(XDT),还有 PowerShell 脚本 install.ps1 和 uninstall.ps1。

当前这些 NuGet 特性对于.NET Core 和.NET 标准项目是可用的。如果安装了 VS 2017 Update 1 预览版,其它类型的项目也可以使用 NuGet 集成特性。

查看英文原文: NuGet is Now Part of MSBuild


感谢冬雨对本文的审校。

给InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ @丁晓昀),微信(微信号: InfoQChina )关注我们。

2017-04-12 19:001866
用户头像

发布了 227 篇内容, 共 73.2 次阅读, 收获喜欢 28 次。

关注

评论

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

软件测试之 Contract Testing

QE_LAB

契约测试 测试技术

python的标准库与扩展库中对象的导入与使用

乔乔

11月月更

项目重构演进之路

杨充

C++特殊类的设计

可口也可樂

c++ 11月月更 特殊类的设计

寒冬之下,年销售增速不降反增,这家国企做对了什么?

用友BIP

什么是CI/CD

穿过生命散发芬芳

CI/CD 11月月更

OpenSergo & ShardingSphere 社区共建微服务视角的数据库治理标准

阿里巴巴云原生

阿里云 云原生 开源微服务 OpenSergo

Baklib|如何做好知识库网页?

Baklib

防患未然 | AIRIOT城市管廊智能运维解决方案

AIRIOT

低代码 物联网 智慧管廊

如何搭建 SaaS 产品的客户服务体系

产品海豚湾

SaaS平台 B端产品 SaaS 产品 11月月更 客户成功

helm部署mysql

程序员欣宸

Helm 11月月更 kuernetes

【愚公系列】2022年11月 微信小程序-页面间通信

愚公搬代码

11月月更

Jan Ozer:高清直播互动场景下的硬编码如何选型?

声网

人工智能 编码 视频

架构实战营模块 6 作业

陌生流云

架构实战营

传统客服中心向“互联网+”转型的关键点——帮助中心

Baklib

Baklib帮助中心|如何设置好客户服务帮助您的客户?

Baklib

母亲斗情敌,羞得儿子无地容!一瓶“醉三皇”,圆了多少孝亲梦!

联营汇聚

CentOS7安装MySQL-5.7.36

蜗牛也是牛

web服务器

我叫于豆豆吖.

11月月更

【活动回顾】Apps Everywhere 上海站圆满结束

亚马逊云科技 (Amazon Web Services)

人工智能 机器学习

Zebec流支付生态,开启多链布局的“两手准备”

股市老人

第一章 TCP/IP协议

我叫于豆豆吖.

11月月更

week6作业 - 拆分电商系统为微服务

in9

Linux 忘记密码解决方法

芯动大师

Linux线程 11月月更 Linux系统

2022-11-23: 分数排名。输出结果和表的sql如下。请写出输出结果的sql语句? +-------+------+ | score | rank | +-------+------+ | 4.

福大大架构师每日一题

数据库 福大大

API关键技术-日志审计技术

阿泽🧸

日志审计 11月月更

一文熟悉 Go 的基础语法和基本数据类型

陈明勇

Go golang 11月月更

【web 开发基础】PHP中的伪类型参数的函数 (31)

迷彩

函数 web开发基础 11月月更 伪类型参数函数 伪类型

视效剧情口碑双爆棚!Netflix 现象级剧集《怪奇物语》第四季神级视效专访大揭秘!

Renderbus瑞云渲染农场

Renderbus瑞云渲染 CG动画电影 CG特效制作

第二章 TCP/IP-IOS七层模型

我叫于豆豆吖.

11月月更

【web 开发基础】PHP中的引用参数的函数 (32)

迷彩

web开发基础 11月月更 引用传递 引用参数函数 值传递

NuGet已整合到MSBuild中_.NET_Jonathan Allen_InfoQ精选文章