读程序员的README笔记08_依赖管理

1. 行为准则

2. 依赖管理

2.1. 在现有的代码上增加一个依赖似乎是一个简单的决定

2.2. 不要重复自己”(Don’t repeat yourself,DRY)是一个通常被教导的原则

2.3. 依赖关系带来了风险

2.3.1. 不兼容的变化

2.3.2. 循环依赖

2.3.3. 版本冲突

2.3.4. 缺乏控制

2.4. 相依性是指你的代码所依赖的代码

2.4.1. 在编译、测试或运行期间,所有需要依赖关系的时间周期被称为依赖范围

2.5. 依赖关系是在软件包管理或构建文件中声明的

2.5.1. Java的Gradle或Maven配置

2.5.2. Python的setup.py或requirements.txt

2.5.3. JavaScript的NPM所使用的package.json

2.6. 一个好的版本管理方案的特点

2.6.1. 唯一性(unique)

2.6.1.1. 版本不应该被重复使用
2.6.1.2. 永远不要在现有版本下重新发布更改的代码

2.6.2. 可比性(comparable)

2.6.2.1. 版本应该帮助人们和工具对版本的优先顺序进行推断

2.6.3. 信息性(informative)

2.6.3.1. 版本信息区分了预先发布的代码和已发布的代码,将构建流水号与构件相关联,并设置了稳定性和兼容性的合理预期

2.7. 具有唯一性的

2.7.1. Git的哈希值或“营销相关”的版本

2.7.2. Android操作系统的甜点系列(Android Cupcake、Android Froyo)

2.7.3. Ubuntu的动物园(Trusty Tahr、Disco Dingo)

2.7.4. 没有可比性或信息性

2.8. 一个递增的版本号(1、2、3)既是唯一的,也是可比较的,但其携带的信息量并不大

3. 语义化版本

3.1. 语义版本管理(semantic versioning,SemVer)的版本管理方案

3.1.1. 版本管理中最常用的方案之一

3.2. 该规范定义了3个数字:主版本号、次版本号和补丁版本号(有时也称作微版本号)

3.2.1. 主版本号.次版本号.补丁版本号

3.3. SemVer的方案还允许使用通配符来标记版本范围(2.13.*)

3.3.1. SemVer承诺跨小版本和补丁版本的兼容性,即使有更新版本被自动拉取,比如修复bug和新特性,此时构建工作也应该继续进行

3.4. 语义化版本同时具有唯一性、可比性、信息性

3.4.1. 每个版本号只使用一次,可以通过从左到右进行比较

3.4.2. 它们提供不同版本之间的兼容性信息,并且可以选择对候选版本或构建流水号进行编码

3.5. 主版本号为0被认为是“预发布”,是为了快速迭代,不做任何兼容性保证

3.5.1. 开发者可以用破坏旧代码的方式修改API

3.6. 主版本号从1开始后,一个项目应该保证

3.6.1. 主版本号从1开始后,一个项目应该保证以下内容

3.6.2. 对于向下兼容的特性,次版本号是递增的

3.6.3. 对于无法向下兼容的变化,主版本号会被递增

3.7. SemVer还通过在补丁版本号后添加一个“-”来定义预发布版本

3.7.1. 小数点分隔的字母和数字的序列被用作预发布版本的标识符(2.13.7-alpha.2)

3.7.2. 许多项目使用候选发布版(release candidate,RC)构建

3.7.3. 早期采用者可以在正式版本发布之前发现RC中的错误

3.7.4. 最终的RC被提升为正式发布版,重新发布的版本没有RC的后缀

3.8. 构建流水号被附加在版本号和预发布元数据之后

3.8.1. 如2.13.7-alpha.2+1942

3.8.2. 包含构建流水号有助于开发者和工具找到任何版本被编译时的构建日志

4. 传递依赖

4.1. 传递依赖管理具有病毒传播的性质

4.2. 大多数构建和打包系统都能生成依赖关系报告

4.3. 了解依赖传递是依赖管理的一个关键部分

4.4. 增加一个依赖关系看起来似乎是一个小变化,但如果相关类库依赖于其他100个类库,你的代码现在就依赖于101个类库

4.5. 任何依赖关系的变化都会影响你的程序

5. 相依性地狱

5.1. 依赖相互冲突和不兼容的变化无处不在,一般的说法是相依性地狱

5.2. 循环依赖

5.2.1. circular dependencies或cyclic dependencies

5.2.2. 一个库间接性地依赖它自己(A依赖B,而B依赖C,C又依赖A)

5.3. 钻石依赖

5.3.1. 一个项目不能同时使用同一个类库的两个不同的版本,所以构建系统必须从中选择其一

5.4. 版本冲突

5.5. 项目经常在没有检查兼容性的情况下就发放版本,即使是自动化也不能完全保证其兼容性

5.6. 那些无法向下兼容的变化会被不经意地发版成次版本或补丁版本,给你的代码库带来巨大的破坏

6. 避免相依性地狱

6.1. 添加一个依赖项的价值是否超过了它的成本

6.1.1. 你真的需要这些特性吗?

6.1.2. 依赖关系的维护情况如何?

6.1.3. 如果出了问题,你修复这个依赖有多容易?

6.1.4. 依赖项的成熟度如何?

6.1.5. 引用依赖后向下兼容的变化频率如何?

6.1.6. 你自己、你的团队和你的组织对该依赖的理解程度如何?

6.1.7. 自己写代码有多容易?

6.1.8. 代码采用什么样的许可协议?

6.1.9. 在依赖中,你使用的代码与你不使用的代码的比例是多少?

6.2. 隔离依赖项

6.2.1. 不必把依赖管理交给构建和打包系统

6.2.2. 将代码复制到你的项目中,用依赖管理自动化换取更多的隔离(稳定性)

6.2.3. 要务实,不要害怕复制代码,如果它能帮助你避免一个庞大的或不稳定的依赖关系

6.2.4. 直接复制代码在简短的、稳定的代码片段上效果最好

6.2.5. 遮蔽依赖也能达到隔离依赖项的目的

6.2.5.1. 遮蔽依赖会自动将一个依赖关系重新定位到不同的命名空间,以避免冲突
6.2.5.2. 一种可以防止库将其依赖关系强加给应用程序的友好方式
6.2.5.3. 遮蔽依赖是一种高级技术,应该少用
6.2.5.4. 永远不要在公共API中暴露一个遮蔽依赖的对象,这样做意味着开发者将不得不在遮蔽的包空间(shaded.some.package.space.Class)中创建对象

6.3. 按需添加依赖项

6.3.1. 将你使用的所有类库显式声明为依赖项

6.3.2. 不要使用来自横向依赖的方法和类

6.3.2.1. 即使你明确指定了直接依赖项的版本,横向依赖仍然可能有通配符

6.3.3. 类库可以自由地改变它们的依赖关系,即使是在补丁级的版本升级中也应如此

6.3.4. 不要只靠IDE来进行依赖管理,在构建文件中明确声明你的依赖项

6.3.4.1. IDE和构建文件之间的差异会使代码在IDE中正常工作,却无法实际地完成代码构建,反之亦然

6.3.5. 指定依赖项的版本

6.3.5.1. 明确设定每个依赖项的版本号,这种做法称为版本指定(version pinning)
6.3.5.2. 未被指定的那些将由构建系统或软件包管理系统为你指定版本
6.3.5.3. 把你的命运交给构建系统是个坏主意,当依赖版本在连续构建过程中发生变化时,你的代码就会不稳定
6.3.5.4. 界定版本范围是在无特定范围和特殊指定某个版本之间的一个折中方案
6.3.5.5. 依赖解析系统可以自由地解决冲突和更新依赖项,但面对重大的变动时能力有限

6.4. 依赖范围最小化

6.4.1. 编译时的依赖项在运行时使用,但运行时的依赖项不会用于编译代码,只会用于运行代码

6.4.2. 对每个依赖项使用尽可能精确的依赖范围

6.4.3. 用编译时的依赖范围来声明所有的依赖项也可以,但这不是个好习惯

6.4.4. 精确的依赖范围将有助于避免冲突并减小运行时的二进制包或者文件的大小

6.5. 保护自己免受循环依赖的影响

6.5.1. 不要引入循环依赖

6.5.2. 使用构建工具保护自己

6.5.2.1. 许多构建系统都有内置的循环依赖检测的特性,当检测到循环依赖时就会提醒你

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

<url-pattern>/</url-pattern>与<url-pattern>/*</url-pattern>的区别

<url-pattern>/</url-pattern> servlet的url-pattern设置为/时&#xff0c; 它仅替换servlet容器的默认内置servlet&#xff0c;用于处理所有与其他注册的servlet不匹配的请求。直白点说就是&#xff0c;所有静态资源&#xff08;js&#xff0c;css&#xff0c;ima…

nodejs+vue+微信小程序+python+PHP基于spark的酒店管理系统-计算机毕业设计推荐

通过管理系统进行全面的线上管理。管理者可以通过基于spark的酒店管理系统&#xff0c;全面掌握酒店客房的各项状态&#xff0c;会员通过系统查询酒店客房信息&#xff0c;在线预定。 酒店作为旅游过程必须的设施&#xff0c;也逐渐需需要进行信息化管理&#xff0c;把酒店类型…

【PyTorch】现代卷积神经网络

文章目录 1. 理论介绍1.1. 深度卷积神经网络&#xff08;AlexNet&#xff09;1.1.1. 概述1.1.2. 模型设计 1.2. 使用块的网络&#xff08;VGG&#xff09;1.3. 网络中的网络&#xff08;NiN&#xff09;1.4. 含并行连结的网络&#xff08;GoogLeNet&#xff09; 2. 实例解析2.1…

连连看游戏

连通块记忆性递归的综合运用 这里x&#xff0c;y的设置反我平常的习惯&#xff0c;搞得我有点晕 实际上可以一输入就交换x&#xff0c;y的数据的 如果设置y1为全局变量的话会warning&#xff1a; warning: built-in function y1 declared as non-function 所以我改成p和q了…

Python---综合案例

一、系统需求分析 1、需求分析 使用面向对象编程思想完成学员管理系统的开发&#xff0c;具体如下&#xff1a; ① 系统要求&#xff1a;学员数据存储在文件中 ② 系统功能&#xff1a;添加学员、删除学员、修改学员信息、查询学员信息、显示所有学员信息、保存学员信息及退…

Kotlin基础——基础内容

文章目录 1 函数和变量1.1 基本程序1.2 函数1.3 变量1.3.1 变量的类型推导1.3.2 可变变量和不可变量1.3.3 变量使用规则 1.4 字符串模板 2 类和属性2.1 属性2.2 自定义访问器2.3 目录和包2.3.1 同包访问2.3.2 不同包导入2.3.3 包名类名定义规则 3 枚举和“when”3.1 声明枚举类…

软件测试之压力测试详解

一、什么是压力测试 软件测试中&#xff1a;压力测试&#xff08;Stress Test&#xff09;&#xff0c;也称为强度测试、负载测试。压力测试是模拟实际应用的软硬件环境及用户使用过程的系统负荷&#xff0c;长时间或超大负荷地运行测试软件&#xff0c;来测试被测系统的性能、…

leetcode-19-删除链表的倒数第N个节点

题目&#xff1a; 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,4,5], n 2 输出&#xff1a;[1,2,3,5]示例 2&#xff1a; 输入&#xff1a;head [1], n 1 输出&#xff1a;[]示…

深度学习 Day15——P4猴痘病识别

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 文章目录 前言1 我的环境2 代码实现与执行结果2.1 前期准备2.1.1 引入库2.1.2 设置GPU&#xff08;如果设备上支持GPU就使用GPU,否则使用C…

Swagger快速上手

快速开始&#xff1a; 导入maven包 <dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.7.0</version> </dependency><dependency><groupId>io.springfox<…

UDS DTC故障码格式

文章目录 DTC的定义DTC 故障码的分类DTC 故障码的组成1、OBD DTC 格式结构2、UDS DTC&#xff08;ISO 14229-1、ISO 15031-6&#xff09;格式结构 参考 DTC的定义 DTC&#xff0c;Diagnostic Trouble Code&#xff0c;诊断故障码&#xff0c;即 故障类型的 ID。 一个完整的DT…

【快速应用开发】看看RedwoodJS

自我介绍 做一个简单介绍&#xff0c;酒架年近48 &#xff0c;有20多年IT工作经历&#xff0c;目前在一家500强做企业架构&#xff0e;因为工作需要&#xff0c;另外也因为兴趣涉猎比较广&#xff0c;为了自己学习建立了三个博客&#xff0c;分别是【全球IT瞭望】&#xff0c;【…

CommonJs模块化实现原理ES Module模块化原理

CommonJs模块化实现原理 首先看一个案例 初始化项目 npm init npm i webpack -D目录结构如下&#xff1a; webpack.config.js const path require("path"); module.exports {mode: "development",entry: "./src/index.js",output: {path: p…

VBA信息获取与处理:在EXCEL中随机函数的利用

《VBA信息获取与处理》教程(版权10178984)是我推出第六套教程&#xff0c;目前已经是第一版修订了。这套教程定位于最高级&#xff0c;是学完初级&#xff0c;中级后的教程。这部教程给大家讲解的内容有&#xff1a;跨应用程序信息获得、随机信息的利用、电子邮件的发送、VBA互…

助力工业生产质检,基于轻量级yolov5-seg开发构建工业场景下滚珠丝杠传动表面缺陷分割检测系统

AI赋能工业生产是一个强有力的方式&#xff0c;在我们之前的系列博文中也有很多相应的开发实践&#xff0c;感兴趣的胡都可以自行移步阅读&#xff0c;本文的核心思想就是想要基于轻量级的实例分割模型来开发构建工业场景下的滚珠丝杠传动表面缺陷分割检测系统&#xff0c;首先…

Openwrt源码下载出现“The remote end hung up unexpected”

最近项目原因需要下载openwrt21.02版本源码&#xff0c;花费了很多时间&#xff0c;找到正确方法后&#xff0c;发现可以节省很多时间&#xff0c;记录下过程&#xff0c;方便自己&#xff0c;可能方便他人。 一.问题阐述 openwrt21.02下载链接如下&#xff1a; git clone -…

Springboot入门篇

一、概述 Spring是一个开源框架&#xff0c;2003 年兴起的一个轻量级的Java 开发框架&#xff0c;作者Rod Johnson 。Spring是为了解决企业级应用开发的复杂性而创建的&#xff0c;简化开发。 1.1对比 对比一下 Spring 程序和 SpringBoot 程序。如下图 坐标 Spring 程序中的…

【华为数据之道学习笔记】3-11元数据管理

1. 产生元数据 &#xff08;1&#xff09;明确业务元数据、技术元数据和操作元数据之间的关系&#xff0c;定义华为公司元数据模型。 &#xff08;2&#xff09;针对找数据及获取数据难的痛点&#xff0c;明确业务元数据、技术元数据、操作元数据的设计原则。 1&#xff09;业务…

Pytorch-LSTM轴承故障一维信号分类(一)

目录 前言 1 数据集制作与加载 1.1 导入数据 第一步&#xff0c;导入十分类数据 第二步&#xff0c;读取MAT文件驱动端数据 第三步&#xff0c;制作数据集 第四步&#xff0c;制作训练集和标签 1.2 数据加载&#xff0c;训练数据、测试数据分组&#xff0c;数据分batch…

C++之STL算法(1)

STL容器算法主要由、、组成&#xff1b;   algorithm主要有遍历、比较、交换、查找、拷贝、修改等&#xff1b; 1.遍历容器for_each for_each()函数用于完成容器遍历&#xff0c;函数参数如下&#xff1a; for_each(_InIt _First, _InIt _Last, _Fn _Func) 形参&#xff1a…