当处于不同依赖时,Rust如何处理Cargo特性
像C/C++和其他本地语言一样,Rust包括对条件编译的支持。指示编译器在编译过程中是包含还是忽略一段代码的最常见方法是添加一个带有所需条件的cfg属性。例如,您可以使用这种机制来检查目标架构,并根据操作系统在编译时切换代码块。
IntelliJ Rust会检测您项目中的条件禁用块,并将其从代码库中排除。这意味着名称解析和分析会忽略这些块,所以你不会在它们里面得到错误和警告,而且在自动完成中不会有该代码的项目出现在其他地方。另外,该插件在编辑器中把禁用的块灰化了。
这个级别的cfg支持在插件中已经有很长一段时间了,但是缺少了一些东西。条件选项可以包含Cargo功能。以前,IntelliJ Rust只支持项目依赖中声明的特性,但现在你的工作空间特性也被支持了。
我们已经实现了一个智能UI,使您的工作与特性更加透明:您可以直接在Cargo.toml文件中启用或禁用工作空间的任何特定特性。名称解析和代码洞察力会考虑到这一点。
让我们详细研究一下IntelliJ Rust如何处理Cargo特性,当它们在不同级别的依赖关系中使用时。
Library
最简单的情况是,您需要从库中排除功能,或者仅在构建中包括其中的一些功能。
首先,让我们添加tokio板条箱并使用以下full选项启用其所有功能:
tokio = { version = "0.3.0", features = ["full"] }
如果我们打开tokio的Cargo.toml并导航到该[features]部分,我们将在列出的所有功能旁边看到选中的复选框full:
现在我们可以来代替指定一个特定的功能full,例如,signal。在tokio“ Cargo.toml”中,复选框的状态将相应更改。只有signal和它取决于功能现在已启用:
请注意,在外部依赖关系的情况下,此UI旨在帮助您掌握功能的状态,但不能控制它们,因此该库的Cargo.toml中的复选框不可单击。如果需要更改功能列表,请继续使用项目的.toml配置。
独立包装功能
另一种情况是,您在包内创建自己的功能部件并在cfg块中使用它们。与外部库不同,您可以在此处通过清除并选中相应的复选框来控制功能列表。
通常,Cargo功能是可加的,并且全部启用时不会冲突,这就是IntelliJ Rust默认启用工作区功能的原因。但是,您可能需要打开和关闭它们,并且插件的UI将帮助您做到这一点!
当您将工作区功能用作切换器而不是添加实例时,切换工作区功能特别方便(例如,Amethyst库具有控制当前可调用的渲染引擎功能)。以前,您必须从Cargo.toml中手动删除不需要的功能才能将其关闭。
由于用户界面现在允许您轻松地在功能之间进行切换,因此请注意不要同时启用任何互斥的功能。该插件不会阻止您这样做,也不会显示警告,因为在.toml文件级别,该插件没有足够的信息来检测源中的潜在问题。
在下面,您可以看到同时启用非添加功能时源中报告的多重解决情况:
相互依赖的程序包功能
一个稍微棘手的情况是您的功能相互依赖时:
[features] wrapper = ["calc"] calc = ["core"] core = []
如果您打开或关闭其中之一,则IntelliJ Rust将识别依赖关系并相应地切换相关功能。
具有跨箱依赖关系的功能
您的包裹功能也可以依赖于其他包装箱中的功能。让我们core从前面的示例中依赖于的macros功能tokio:
core = ["tokio/macros"]
切换到tokio的Cargo.toml,我们会注意到macros默认情况下禁用的方式如何在打开时启用core,而在关闭时再次core禁用:
工作区的功能
一个更复杂的场景是在由多个程序包组成的工作区中使用要素时。
举个简单的例子,让我们创建一个有两个包的工作空间--bar和foo。在foo的Cargo.toml中,我们可以声明对bar的依赖,并指定它使用bar中的一个名为bar_feature的特性。
在使用工作空间时,你可能想在里面开发一个单独的箱子,就像一个独立的实例一样。在这种情况下,你需要对箱子的功能进行控制,并能够在某一时刻禁用那些你不需要的功能。
那么,如果你关注bar,并故意禁用bar_feature,会发生什么?结果,foo中所有使用它的代码都不会被解析,而且你在foo中出现的错误可能会很棘手,找不到原因。
为了帮助你避免这些问题,IntelliJ Rust会检查你的工作空间依赖中的所需特性,并为它们提出快速修复建议。
最后,你的工作空间箱可以有相互依赖的特征。例如,foo中的foo_features依赖于bar_feature from bar。
在这里,当我们禁用时bar_feature,插件会foo_feature自动禁用。但是,当我们bar_feature重新打开时,foo_feature将不会启用,因此您需要手动撤回相关功能。
如果您以前从未使用过此功能,建议您尝试一下。如果您希望我们进一步研究其他功能,请在评论中给我们留言。
好了这就是今天的内容了,如果今天的文章未解决你的需求,可点击获取更多免费教程。不要忘了在评论与我们分享您的想法和建议。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
Spring源码分析之循环依赖及解决方案
点击上方蓝色“奇客时间”,选择“设为星标” 回复“面试宝典”获取美团、滴滴、阿里2020面试真题 往期文章: Spring源码分析之预启动流程 Spring源码分析之BeanFactory体系结构 Spring源码分析之BeanFactoryPostProcessor调用过程详解 Spring源码分析之Bean的创建过程详解 正文: 首先,我们需要明白什么是循环依赖?简单来说就是A对象创建过程中需要依赖B对象,而B对象创建过程中同样也需要A对象,所以A创建时需要先去把B创建出来,但B创建时又要先把A创建出来...死循环有木有... 循环依赖 那么在Spring中,有多少种循环依赖的情况呢?大部分人只知道两个普通的Bean之间的循环依赖,而Spring中其实存在三种对象(普通Bean,工厂Bean,代理对象),他们之间都会存在循环依赖,这里我给列举出来,大致分别以下几种: 普通Bean与普通Bean之间 普通Bean与代理对象之间 代理对象与代理对象之间 普通Bean与工厂Bean之间 工厂Bean与工厂Bean之间 工厂Bean与代理对象之间 那么,在Spring中是如何解决这个问题的...
- 下一篇
基于 prometheus 的微服务指标监控
基于prometheus的微服务指标监控 服务上线后我们往往需要对服务进行监控,以便能及早发现问题并做针对性的优化,监控又可分为多种形式,比如日志监控,调用链监控,指标监控等等。而通过指标监控能清晰的观察出服务指标的变化趋势,了解服务的运行状态,对于保证服务稳定起着非常重要的作用 prometheus是一个开源的系统监控和告警工具,支持强大的查询语言PromQL允许用户实时选择和汇聚时间序列数据,时间序列数据是服务端通过HTTP协议主动拉取获得,也可以通过中间网关来推送时间序列数据,可以通过静态配置文件或服务发现来获取监控目标 Prometheus 的架构 Prometheus 的整体架构以及生态系统组件如下图所示: Prometheus Server直接从监控目标中或者间接通过推送网关来拉取监控指标,它在本地存储所有抓取到样本数据,并对此数据执行一系列规则,以汇总和记录现有数据的新时间序列或生成告警。可以通过 Grafana 或者其他工具来实现监控数据的可视化 go-zero基于prometheus的服务指标监控 go-zero 框架中集成了基于prometheus的服务指标监控,下...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS6,7,8上安装Nginx,支持https2.0的开启
- CentOS6,CentOS7官方镜像安装Oracle11G
- Docker使用Oracle官方镜像安装(12C,18C,19C)
- Red5直播服务器,属于Java语言的直播服务器
- SpringBoot2更换Tomcat为Jetty,小型站点的福音
- SpringBoot2编写第一个Controller,响应你的http请求并返回结果
- Jdk安装(Linux,MacOS,Windows),包含三大操作系统的最全安装
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- CentOS关闭SELinux安全模块
- Hadoop3单机部署,实现最简伪集群