Gradle依赖管理:编译时和运行时依赖的区别

news2024/11/26 20:29:45

🌷🍁 博主猫头虎 带您 Go to New World.✨🍁
🦄 博客首页——猫头虎的博客🎐
🐳《面试题大全专栏》 文章图文并茂🦕生动形象🦖简单易学!欢迎大家来踩踩~🌺
🌊 《IDEA开发秘籍专栏》学会IDEA常用操作,工作效率翻倍~💐
🌊 《100天精通Golang(基础入门篇)》学会Golang语言,畅玩云原生,走遍大小厂~💐

🪁🍁 希望本文能够给您带来一定的帮助🌸文章粗浅,敬请批评指正!🍁🐥

在这里插入图片描述

文章目录

  • Gradle依赖管理:编译时和运行时依赖的区别
    • 一. 引言
      • 1)为何我们讨论Gradle依赖
      • 2)Gradle在现代开发中的重要性
    • 二. Gradle简介
      • 1)什么是Gradle
      • 2)Gradle的基本功能
    • 三. 依赖管理简介
      • 1)为何依赖管理对于项目至关重要
      • 2)如何手动处理依赖和其中的挑战
    • 四. 编译时依赖
      • 1)定义:什么是编译时依赖
      • 2)为何我们需要编译时依赖
      • 3)如何在Gradle中声明编译时依赖
      • 4)实际示例
    • 五. 运行时依赖
      • 1)定义:什么是运行时依赖
      • 2)为何我们需要运行时依赖
      • 3)如何在Gradle中声明运行时依赖
      • 4)实际示例
    • 六. 编译时与运行时依赖的区别
      • 1)对比二者的主要差异
      • 2)解释为何某些库可能仅在编译时需要,而其他库可能在运行时需要
      • 3)举例说明这些差异
    • 七. 常见问题和陷阱
      • 1)讨论关于编译时和运行时依赖的常见误区
      • 2)如何避免这些问题
    • 八. 最佳实践
      • 1)如何最优化地管理Gradle的编译时和运行时依赖
      • 2)实际的例子和提示
    • 九. 总结
      • 1)编译时和运行时依赖的重要性和区别
      • 2)为何好的依赖管理对于项目成功至关重要
    • 十. 参考资料
    • 十一. 互动/评论区
  • 原创声明

Gradle依赖管理:编译时和运行时依赖的区别


摘要:
本文详细探讨了Gradle中编译时和运行时依赖的概念、区别及其重要性。我们也将了解为什么依赖管理对于现代软件开发至关重要,并探讨了一些常见的陷阱和最佳实践。


引言:
在软件开发的世界中,依赖管理始终是一个核心议题。特别是在现代的构建工具如Gradle中,了解如何有效地管理依赖不仅可以确保代码的稳定性,还可以避免许多常见的问题。这篇文章的目的是深入探讨Gradle的编译时和运行时依赖,帮助开发者更好地理解并应用这些概念。


导语:
你是否曾在Gradle项目中纠结于编译时和运行时依赖?或者想知道为何某些库在代码编译时是必要的,而在运行时则完全无关紧要?这篇文章将带你深入了解这两种依赖的核心区别,并为你提供一些关于如何优化你的Gradle依赖管理的实用建议。

一. 引言

1)为何我们讨论Gradle依赖

在软件开发中,依赖管理始终是一个核心议题。随着项目规模的增长和外部库的广泛使用,如何管理这些库和工具变得至关重要。Gradle作为一个强大的自动化构建工具,为开发者提供了高效、灵活的依赖管理解决方案。通过讨论Gradle依赖,我们不仅可以优化我们的开发流程,还可以更好地理解项目间的依赖关系。

2)Gradle在现代开发中的重要性

Gradle已经成为许多大型企业和开源项目的首选构建工具。其在现代开发中的重要性不仅仅因为它提供的强大功能,更在于它的高度自定义性和可扩展性。此外,与其他构建工具相比,Gradle提供了更加直观的依赖管理和构建流程定义,使得开发者可以更加专注于编码,而不是花费大量时间处理构建和依赖问题。此外,Gradle还与许多现代CI/CD工具完美集成,为持续集成和持续交付提供了坚实的基础。

通过深入了解Gradle及其在依赖管理中的角色,开发者可以更加高效地进行开发,并确保项目的稳定性和可维护性。

二. Gradle简介

1)什么是Gradle

Gradle是一个开源的构建自动化工具,设计用来支持多种语言和平台,包括Java, Kotlin, C++, Android等。它采用了基于Groovy的领域特定语言 (DSL) 来描述构建逻辑,相比于传统的XML方式,这使得构建脚本更加简洁和易于理解。Gradle结合了Apache Ant的灵活性和Apache Maven的依赖管理能力,提供了一个强大、高性能且高度可定制的构建平台。

2)Gradle的基本功能

  • 依赖管理: Gradle允许开发者自动化地下载所需的依赖,处理依赖间的冲突,并确保项目中使用的库版本之间的一致性。

  • 多项目构建: Gradle可以轻松地管理和构建多个相关的项目,确保它们之间的依赖和互动得到妥善处理。

  • 插件系统: Gradle具有丰富的插件生态系统,这些插件为特定任务提供额外的功能和工具,如Android应用开发、Web应用部署等。

  • 自定义构建逻辑: 由于Gradle的DSL基于Groovy,开发者可以轻松地编写自定义的构建逻辑,以满足特定的需求或集成其他工具。

  • 性能优化: Gradle具有先进的缓存机制和增量构建能力,这意味着只有当源文件或依赖发生变化时,相关的任务才会被重新执行,大大加速了构建过程。

  • 集成与扩展: Gradle可以与许多现代IDE和CI/CD工具完美集成,如IntelliJ IDEA, Jenkins, Travis CI等,同时也支持通过API来扩展其功能。

总的来说,Gradle不仅仅是一个构建工具,更是一个强大的自动化平台,可以广泛应用于各种软件开发任务和流程中。

三. 依赖管理简介

1)为何依赖管理对于项目至关重要

在现代软件开发中,难得有项目完全独立于外部库或工具。这些外部依赖为我们提供了现成的功能,使得开发更为高效。但同时,如何管理这些依赖也成了一个重要问题。以下是依赖管理对于项目的重要性的几个方面:

  • 版本一致性: 确保项目中使用的所有依赖都是正确和兼容的版本,防止版本冲突导致的运行时错误。

  • 安全性: 有时一些库可能会存在已知的安全问题。有效的依赖管理可以帮助开发者追踪这些问题并及时更新库以解决安全漏洞。

  • 节省时间: 自动化的依赖管理可以减少手工下载和管理库的时间,使得开发者可以专注于编码。

  • 构建的可复制性: 一个好的依赖管理工具可以确保在不同的开发环境中,构建是可复制的,这对于团队协作和持续集成至关重要。

2)如何手动处理依赖和其中的挑战

手动处理依赖通常意味着开发者需要自己下载所需的库,将它们放入项目的某个目录,并确保编译时能找到它们。这种方法存在以下挑战:

  • 版本管理困难: 当有新版本的库发布时,开发者需要手动下载并替换旧版本。这可能导致版本混淆,尤其是当多个库有交叉依赖时。

  • 存储冗余: 如果多个项目使用相同的库,那么这个库的多个副本可能会散落在不同的项目目录中,导致存储浪费。

  • 安全问题: 开发者可能不会经常检查库的更新,这可能使项目长时间使用存在已知安全问题的旧版本。

  • 跨平台问题: 手动管理依赖可能会导致在不同操作系统或环境中出现不一致的构建结果。

因此,尽管手动处理依赖在一些小型或简单的项目中是可行的,但在大多数情况下,使用自动化的依赖管理工具,如Gradle,会更为高效和安全。

四. 编译时依赖

1)定义:什么是编译时依赖

编译时依赖是指在项目的编译阶段所需的依赖。它们对于源代码的编译是必要的,但可能在运行时不需要。这些依赖通常包括用于代码生成、注解处理或提供API定义(例如接口)的库。

2)为何我们需要编译时依赖

  • 代码完整性: 编译时依赖提供了编写源代码时所需的必要类和接口。没有这些依赖,源代码可能无法正确编译。

  • 注解处理: 许多现代框架和库使用注解来简化代码和提供额外的功能。编译时依赖可以包括这些注解处理器,它们在编译过程中运行,生成额外的代码或资源。

  • 类型检查: 编译时依赖还提供了类型信息,帮助编译器在编译过程中进行类型检查,确保代码的类型安全。

3)如何在Gradle中声明编译时依赖

在Gradle中,你可以使用implementationcompile(在旧版本的Gradle中)配置来声明编译时依赖。例如:

dependencies {
    implementation 'com.some.library:library-name:1.0.0'
}

implementation配置表示该依赖在编译时是必要的,但不需要向消费者(例如其他模块或项目)传递该依赖。这有助于减少传递性依赖,提高构建性能。

4)实际示例

考虑一个常见的Android项目,你可能需要Android的AppCompat库来提供向后兼容的Android功能。在这种情况下,你的build.gradle文件中的依赖声明可能如下:

dependencies {
    implementation 'androidx.appcompat:appcompat:1.2.0'
}

这表示项目在编译时需要AppCompat库。但是,由于使用了implementation配置,这个库不会传递给依赖你的库或模块的其他项目。

五. 运行时依赖

1)定义:什么是运行时依赖

运行时依赖是指在项目的运行阶段所需的依赖,但在编译时可能并不需要它们。这些依赖在应用或项目执行时必须存在,否则可能会出现类未找到错误或其他运行时异常。

2)为何我们需要运行时依赖

  • 功能实现: 某些库只在运行时提供实际的功能实现。例如,你的代码可能依赖于某个接口(在编译时),但实际的实现可能由一个运行时库提供。

  • 插件和扩展: 在某些情况下,应用程序或框架可能允许通过运行时加载的插件或扩展来增强功能。

  • 动态功能: 一些库可能根据运行时条件提供不同的功能或行为,而这些条件在编译时是不知道的。

3)如何在Gradle中声明运行时依赖

在Gradle中,你可以使用runtimeOnly配置来声明只在运行时需要的依赖,这意味着它们在编译时不会被包括在内。例如:

dependencies {
    runtimeOnly 'com.some.library:runtime-library:1.0.0'
}

4)实际示例

考虑一个Java web应用,使用了JDBC来连接数据库。虽然在编译时你可能只依赖于JDBC的API(即java.sql包),但在运行时,你需要具体的数据库驱动来实现这些API。假设你正在使用MySQL数据库,那么你的build.gradle文件中的依赖声明可能如下:

dependencies {
    runtimeOnly 'mysql:mysql-connector-java:8.0.23'
}

这意味着MySQL的JDBC驱动只在运行时需要,而在编译时并不需要它。

六. 编译时与运行时依赖的区别

1)对比二者的主要差异

  • 编译时依赖:

    • 这些依赖在源代码编译阶段是必需的。
    • 对于代码的类型检查和注解处理至关重要。
    • 可能不需要在运行时。
  • 运行时依赖:

    • 这些依赖在项目或应用的执行阶段是必需的。
    • 在编译时可能并不需要。
    • 对于如插件、动态功能实现等运行时行为至关重要。

2)解释为何某些库可能仅在编译时需要,而其他库可能在运行时需要

某些库在编译时提供必要的类型信息、注解处理功能或其他编译时功能,但在运行时不再使用,因此只在编译时需要它们。这种情况下,这些库的代码不会被包括在最终的运行时类路径中。

而其他库可能提供实际的功能实现,这些功能只在应用运行时执行时才需要。例如,一个应用可能在编译时依赖于某个通用接口,而在运行时依赖于该接口的具体实现,这个实现是由一个单独的库提供的。

3)举例说明这些差异

示例 1: 注解处理器
很多现代Java库使用注解处理器在编译时生成代码。这些处理器在编译阶段是必要的,但在运行时并不需要它们,因为它们的工作已经完成了。例如,Lombok库就是这样的一个库,它在编译时生成getter和setter方法,但在运行时并不需要Lombok库。

示例 2: JDBC驱动
如前面提到的,一个应用可能在编译时只依赖于JDBC API,这是Java的标准部分。但在运行时,应用需要具体的数据库驱动(例如MySQL或PostgreSQL驱动)来实际连接到数据库。这个驱动在编译时并不需要,但在运行时是必需的。

这两个示例突出了编译时和运行时依赖之间的主要区别,以及为什么在某些情况下,某些库只在一个阶段需要,而在另一个阶段不需要。

七. 常见问题和陷阱

1)讨论关于编译时和运行时依赖的常见误区

  • “编译成功即可运行成功”误区:仅因为代码成功编译并不意味着它在运行时不会遇到问题。有可能缺少运行时所需的依赖,或者使用了与运行环境不兼容的库版本。

  • 过度依赖:认为所有编译时的依赖都必须包含在运行时类路径中。这可能会导致不必要的库被包括,从而增加了部署包的大小。

  • 版本冲突误区:不同的库可能依赖于相同库的不同版本。在编译时,这可能不会引起问题,但在运行时可能会导致类版本错误或其他相似的问题。

  • 忽视间接依赖:认为只有直接在项目中声明的依赖是重要的,而忽视了这些依赖所引入的其他间接依赖。这可能导致运行时错误,因为缺少了某些必要的库。

2)如何避免这些问题

  • 持续集成和自动测试:使用CI/CD工具确保每次代码更改后都会进行编译和运行测试。这可以及时发现和修复潜在的运行时问题。

  • 清晰地分隔编译时和运行时依赖:在项目配置中明确区分这两种依赖,确保只有真正需要的库被包含在运行时类路径中。

  • 使用依赖管理工具:像Gradle和Maven这样的工具可以自动处理版本冲突和间接依赖的问题。它们可以帮助你确定哪些库版本是兼容的,并确保所有必要的库都被正确地包含。

  • 定期审核依赖:定期查看项目的依赖列表,确保没有不再使用的库,并验证当前使用的库版本是否是最新的和最安全的。

  • 学习和理解你的依赖:尝试深入了解你的项目所依赖的库,这可以帮助你更好地理解这些库的工作原理,从而避免一些常见的陷阱。

八. 最佳实践

1)如何最优化地管理Gradle的编译时和运行时依赖

  • 明确声明依赖:总是明确声明项目中直接使用的所有依赖,而不是依赖间接引入的库。

  • 使用implementationapi配置:在build.gradle文件中, 使用implementation为编译时依赖和api为运行时依赖。这确保了只有真正需要的依赖会被包括在最终的产出中。

  • 避免使用compile配置:从Gradle 3.0开始,compile已经被废弃。应该使用implementationapi来替代。

  • 定期检查依赖更新:使用像Gradle Versions Plugin这样的工具,定期检查是否有依赖库的新版本,并在适当的时候更新它们。

  • 管理依赖版本:在build.gradle中使用变量来管理依赖的版本号,这样当需要更新多个相关依赖的版本时,只需更改一次。

2)实际的例子和提示

  • 声明编译时依赖

    dependencies {
        implementation 'com.example:library:1.0.0'
    }
    
  • 声明运行时依赖

    dependencies {
        api 'com.example:runtime-library:2.0.0'
    }
    
  • 使用变量管理版本

    ext {
        libraryVersion = '1.0.0'
    }
    
    dependencies {
        implementation "com.example:library:${libraryVersion}"
    }
    
  • 检查过时的依赖:使用./gradlew dependencyUpdates(需要Gradle Versions Plugin)来查看所有过时的依赖。

  • 避免过度依赖:如果你注意到有一些库在运行时没有被使用,考虑从依赖中删除它们或将它们更改为编译时依赖。

九. 总结

1)编译时和运行时依赖的重要性和区别

编译时和运行时依赖在软件开发的各个阶段都起到了核心的作用。编译时依赖主要涉及到在代码编译阶段所需的库和资源。这些依赖项为我们提供了必要的APIs和工具,以确保代码在编译时没有错误。而运行时依赖则是当应用运行时所需的库。它们确保在实际运行应用程序时,所有的功能都能够正确执行。

二者之间的关键区别在于它们的使用时机:编译时依赖在代码编译阶段是必要的,而运行时依赖则是在代码执行时是必要的。理解这些区别并正确管理这两种依赖是至关重要的,因为错误的依赖管理可能导致编译失败或运行时错误。

2)为何好的依赖管理对于项目成功至关重要

良好的依赖管理是软件项目成功的关键。首先,它确保我们的代码在所有环境中都能够一致和可靠地执行。其次,通过减少不必要的或冗余的依赖,它可以帮助我们减少应用的大小,提高加载速度,并减少潜在的安全风险。

更重要的是,有效的依赖管理可以帮助团队更快速地迭代和交付高质量的软件。当我们知道我们的代码依赖于哪些库,以及这些库的版本时,我们就可以更容易地跟踪和修复bugs,更新库版本,或进行其他必要的维护工作。

因此,无论是个人开发者还是大型团队,都应该投资时间和精力来确保他们的依赖管理策略是最优的,从而确保他们的项目能够成功。

十. 参考资料

  • Gradle官方文档: https://docs.gradle.org
  • Android开发者官方文档:Gradle概述: https://developer.android.com/studio/build
  • Smith, J. (2022). “Understanding Gradle Dependency Management”. O’Reilly Media.
  • Lee, K. & Park, H. (2021). “Gradle in Action: Effective Dependency Management”. Springer.

十一. 互动/评论区

亲爱的读者,感谢您阅读这篇文章!我们非常期待您的反馈。您在Gradle依赖管理方面有什么经验或建议?您是否遇到过任何与本文相关的问题或挑战?请在下方留言与我们分享您的见解和疑问。您的反馈将为我们所有人带来巨大的价值!

在这里插入图片描述

原创声明

======= ·

  • 原创作者: 猫头虎

作者wx: [ libin9iOak ]

学习复习

本文为原创文章,版权归作者所有。未经许可,禁止转载、复制或引用。

作者保证信息真实可靠,但不对准确性和完整性承担责任

未经许可,禁止商业用途。

如有疑问或建议,请联系作者。

感谢您的支持与尊重。

点击下方名片,加入IT技术核心学习团队。一起探索科技的未来,共同成长。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/877711.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

nsq中diskqueue详解 - 第一篇

一、diskqueue是什么,为什么需要它 在nsq中消息主要存在于两种队列 一种是内存队列,内部是用go的通道实现,所以处理速度很快,缺点是一旦nsqd进程挂掉消息就丢失了,这让人难以接受,数据丢了不得被用户骂死…

强训第31天

选择 传输层叫段 网络层叫包 链路层叫帧 A 2^16-2 C D C 70都没收到,确认号代表你该从这个号开始发给我了,所以发70而不是71 B D C 248&123120 OSI 物理层 数据链路层 网络层 传输层 会话层 表示层 应用层 C 记一下304读取浏览器缓存 502错误网关 编…

论文总结《Adversarial Personalized Ranking for Recommendation(APR)》

原文链接 APR、 本篇论文是对抗训练在RS领域的先锋作,在这篇文章前对抗训练应用在图像领域,以提高模型鲁棒性。本篇论文填补了对抗训练在RS领域的空缺,首次基于BPR进行对抗训练,以提高RS排序模型的鲁棒性。 Motivation 文章在…

Python脚本之连接MySQL【四】

本文为博主原创,未经授权,严禁转载及使用。 本文链接:https://blog.csdn.net/zyooooxie/article/details/124640412 之前写了篇 Python脚本之连接MySQL【三】,日常使用过程中,代码实际有很多改动,特此更新…

数据分析--帆软报表--大数据大屏

进入国企公司学习有一段时间了,岗位是数据分析方向------ 母前使用的是帆软工具进行的开发。 可以进行大数据大屏 也可使嵌入到手机端。 下面是例子

IntelliJ IDEA快捷键大全 + 动图演示

IntelliJ IDEA快捷键大全 动图演示 😍 一、构建/编译Ctrl F9:构建项目Ctrl Shift F9:重新编译当前类 😍 二、文本编辑Ctrl X:剪切Ctrl C:复制Ctrl V:粘贴Ctrl Alt Shift V&#xff1a…

Nginx安装及Minio集群反向动态代理配置(二)

安装所需插件 1、安装gcc gcc是linux下的编译器在此不多做解释,感兴趣的小伙伴可以去查一下相关资料,它可以编译 C,C,Ada,Object C和Java等语言 命令:查看gcc版本 [rootwww ~]# gcc -v -bash: gcc: 未找到命令 说明没有安装: 那就直接yu…

mclust学习总结

mclust example1 import numpy as np import pandas as pd from matplotlib import pyplot as plt from sklearn.datasets import make_blobs X, y make_blobs(n_samples300, centers4, cluster_std0.60, random_state0) # n_features2是默认的 plt.scatter(X[:,0], X[:,1]) …

Java【数据结构】二分查找

&#x1f31e; 题目&#xff1a; &#x1f30f;在有序数组A中&#xff0c;查找目标值target &#x1f30f;如果找到返回索引 &#x1f30f;如果找不到返回-1 算法描述解释前提给定一个内含n个元素的有序数组A&#xff0c;满足A0<A1<A2<<An-1,一个待查值target1设…

如何利用 EMC 模型解决能源服务提供商的瓶颈

01. 什么是合同能源管理&#xff1f; 合同能源管理(EMC-Energy Management Contract) 是一种新型的市场化节能机制,其实质就是以减少的能源费用来支付节能项目全部成本的节能投资方式。&#xff1a;节能服务公司与用能单位以契约形式约定节能项目的节能目标&#xff0c;节能服…

在 ubuntu 18.04 上使用源码升级 OpenSSH_7.6p1到 OpenSSH_9.3p1

1、检查系统已安装的当前 SSH 版本 使用命令 ssh -V 查看当前 ssh 版本&#xff0c;输出如下&#xff1a; OpenSSH_7.6p1 Ubuntu-4ubuntu0.7, OpenSSL 1.0.2n 7 Dec 20172、安装依赖&#xff0c;依次执行以下命令 sudo apt update sudo apt install build-essential zlib1g…

springBoot 简单的demo

springBoot 学习开始 场景开发流程1、创建项目2、导入依赖3、创建启动springBoot 项目的主入口程序4、创建业务程序5、在MainApplication文件运行程序6、将文件打包成jar包 遇到的问题未解决 希望大哥们帮忙--本地运行jar包报错 场景 浏览器发送hello请求&#xff0c;返回“he…

培训报名小程序-用户注册

目录 1 创建数据源2 注册用户3 判断用户是否注册4 完整代码总结 我们的培训报名小程序&#xff0c;用户每次打开时都需要填写个人信息才可以报名&#xff0c;如果用户多次报名课程&#xff0c;每次都需要填写个人信息&#xff0c;比较麻烦。 本篇我们就优化一下功能&#xff0c…

[静态时序分析简明教程(十)]模式分析与约束管理

静态时序分析简明教程-组合电路路径 一、写在前面1.1 快速导航链接 二、模式分析三、约束管理3.1 自顶向下的方法3.2 自底向上的方法 四、总结 一、写在前面 一个数字芯片工程师的核心竞争力是什么&#xff1f;不同的工程师可能给出不同的答复&#xff0c;有些人可能提到硬件描…

新品牌怎么进行产品营销,小红书布局指南!

随着互联网的快速发展&#xff0c;新品牌们逐渐意识到小红书这一平台的潜力。平台庞大的用户群体和高度活跃的内容创作者&#xff0c;成为新品牌布局的理想之地。今天&#xff0c;就来和大家分享一下新品牌怎么进行产品营销&#xff0c;小红书布局指南&#xff01; 第一步&…

ARM 作业1

一、思维导图 二、 1. 2. .text 文本段 .globl _start 声明_start:mov r0,#0mov r1,#0fun:cmp r1,#100bhi stopadd r0,r0,r1add r1,r1,#1b fun stop:b stop .end

简单谈谈 EMP-SSL:自监督对比学习的一种极简主义风

论文链接&#xff1a;https://arxiv.org/pdf/2304.03977.pdf 代码&#xff1a;https://github.com/tsb0601/EMP-SSL 其他学习链接&#xff1a;突破自监督学习效率极限&#xff01;马毅、LeCun联合发布EMP-SSL&#xff1a;无需花哨trick&#xff0c;30个epoch即可实现SOTA 主要…

图解结构体大小和位域例子

struct A {short a; char b; int c : 1; char d : 4; short e : 7; }; 备注&#xff1a;蓝色&#xff1a;表示占一个符号位空间红色&#xff1a;表示补齐其他颜色&#xff1a;实际最大值所占空间 &#xff08;1&#xff09;图解例1 st…

ASPICE学习笔记

文章目录 1. ASPICE是什么?2. ASPICE能干什么?2.1 过程参考模型2.2 过程评估模型参考1. ASPICE是什么? ASPICE的全称是Automotive SPICE。很明显的看出ASPICE是由SPICE发展而来。而SPICE是由国际标准化组织ISO、国际电工委员会IEC、信息技术委员会JTC1发起制定的ISO15504标…

VSCODE[配置ssh免密远程登录]

配置ssh免密远程登录 本文摘录于&#xff1a;https://blog.csdn.net/qq_44571245/article/details/123031276只是做学习备份之用&#xff0c;绝无抄袭之意&#xff0c;有疑惑请联系本人&#xff01; 这里要注意如下几个地方: 1.要进入.ssh目录创建文件: 2.是拷贝带"ssh-…