一文了解Gradle 依赖管理(五)- 依赖管理缓存依赖
文章目录
- 1. 版本目录 (Version Catalogs)
- 1. 版本目录的概念与优势
- 2. 主要优势
- 3. 基本配置
- 4. 使用版本目录
- 5.使用外部版本目录文件
- 6.实际项目中的版本目录最佳实践
- 2. 依赖锁定(Dependency Locking)
- 1. 依赖锁定的概念与重要性
- 2. 主要优势
- 3. 如何启用依赖锁定
- 4. 生成锁定文件
- 5. 更新锁定依赖
- 6. 依赖锁定与版本目录结合使用
- 3. 依赖缓存与离线构建
- 1. Gradle 的依赖缓存机制
- 2. 配置缓存位置
- 3. 启用构建缓存
- 4. 离线模式构建
- 5. 依赖缓存的最佳实践
1. 版本目录 (Version Catalogs)
版本目录是 Gradle 7.0 引入的一项功能,它提供了一种集中管理依赖版本和依赖组的强大方式,尤其适合多模块项目。
1. 版本目录的概念与优势
版本目录是一种将依赖定义从构建脚本中抽离出来的机制,使依赖管理更加结构化、集中化,并支持更好的 IDE 支持。
2. 主要优势
1. 集中管理:在一个地方定义所有依赖版本和依赖组
2. 类型安全:提供类型安全的依赖访问,减少拼写错误
3. IDE 支持:更好的自动完成和导航支持
4. 依赖分组:按逻辑组织依赖
5. 版本控制:轻松更新和跟踪依赖版本变化
3. 基本配置
版本目录通常在 settings.gradle
或 settings.gradle.kts
文件中定义:
// 在settings.gradle中
dependencyResolutionManagement {versionCatalogs {libs {// 定义版本version('kotlin', '1.6.10')version('coroutines', '1.6.0')// 定义库library('kotlin-stdlib', 'org.jetbrains.kotlin', 'kotlin-stdlib').versionRef('kotlin')library('kotlin-reflect', 'org.jetbrains.kotlin', 'kotlin-reflect').versionRef('kotlin')library('coroutines-core', 'org.jetbrains.kotlinx', 'kotlinx-coroutines-core').versionRef('coroutines')// 定义依赖组(bundle)bundle('kotlin-bundle', ['kotlin-stdlib', 'kotlin-reflect'])// 定义插件plugin('kotlin-android', 'org.jetbrains.kotlin.android').versionRef('kotlin')}}
}
在 Kotlin DSL 中(settings.gradle.kts
):
dependencyResolutionManagement {versionCatalogs {create("libs") {version("kotlin", "1.6.10")version("coroutines", "1.6.0")library("kotlin-stdlib", "org.jetbrains.kotlin", "kotlin-stdlib").versionRef("kotlin")library("kotlin-reflect", "org.jetbrains.kotlin", "kotlin-reflect").versionRef("kotlin")library("coroutines-core", "org.jetbrains.kotlinx", "kotlinx-coroutines-core").versionRef("coroutines")bundle("kotlin-bundle", listOf("kotlin-stdlib", "kotlin-reflect"))plugin("kotlin-android", "org.jetbrains.kotlin.android").versionRef("kotlin")}}
}
4. 使用版本目录
一旦定义了版本目录,我们就可以在构建脚本中使用它们:
plugins {id(libs.plugins.kotlin.android.get().pluginId)
}dependencies {implementation(libs.kotlin.stdlib)implementation(libs.coroutines.core)implementation(libs.bundles.kotlin.bundle)
}
5.使用外部版本目录文件
对于更复杂的项目,您可以将版本目录定义移动到专用的 TOML 文件中, 当然这也是Android官方推荐的做法,在新的AS项目中,默认就是使用的 TOML文件:
# libs.versions.toml
[versions]
kotlin = "1.6.10"
coroutines = "1.6.0"
retrofit = "2.9.0"
okhttp = "4.9.3"
room = "2.4.1"[libraries]
kotlin-stdlib = { module = "org.jetbrains.kotlin:kotlin-stdlib", version.ref = "kotlin" }
kotlin-reflect = { module = "org.jetbrains.kotlin:kotlin-reflect", version.ref = "kotlin" }
coroutines-core = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "coroutines" }
coroutines-android = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-android", version.ref = "coroutines" }
retrofit-core = { module = "com.squareup.retrofit2:retrofit", version.ref = "retrofit" }
retrofit-gson = { module = "com.squareup.retrofit2:converter-gson", version.ref = "retrofit" }
okhttp-core = { module = "com.squareup.okhttp3:okhttp", version.ref = "okhttp" }
okhttp-logging = { module = "com.squareup.okhttp3:logging-interceptor", version.ref = "okhttp" }
room-runtime = { module = "androidx.room:room-runtime", version.ref = "room" }
room-compiler = { module = "androidx.room:room-compiler", version.ref = "room" }[bundles]
kotlin = ["kotlin-stdlib", "kotlin-reflect"]
coroutines = ["coroutines-core", "coroutines-android"]
retrofit = ["retrofit-core", "retrofit-gson", "okhttp-core", "okhttp-logging"]
room = ["room-runtime"][plugins]
kotlin-android = { id = "org.jetbrains.kotlin.android", version.ref = "kotlin" }
kotlin-jvm = { id = "org.jetbrains.kotlin.jvm", version.ref = "kotlin" }
kotlin-kapt = { id = "org.jetbrains.kotlin.kapt", version.ref = "kotlin" }
然后在 settings.gradle
中引用这个文件:
dependencyResolutionManagement {versionCatalogs {libs {from(files("libs.versions.toml"))}}
}
6.实际项目中的版本目录最佳实践
1. 按功能或技术栈分组:将依赖按照功能或技术栈分组,例如
network
、ui
、database
等。
2. 使用有意义的别名:为依赖创建直观的别名,如retrofit
而不是squareup-retrofit
。
3. 充分利用版本引用:避免重复的版本号声明,使用版本引用确保相关库使用相同版本。
4. 创建有用的 bundle:将常一起使用的依赖组合成 bundle,简化依赖声明。
5. 保持 TOML 文件的良好组织:使用注释和分组保持文件可读性。
例如以下:
# 网络相关依赖
[libraries.retrofit]
module = "com.squareup.retrofit2:retrofit"
version = "2.9.0"# 注释说明特殊用途的依赖
[libraries.leak-canary]
module = "com.squareup.leakcanary:leakcanary-android"
version = "2.8.1"
# 仅在 debug 构建中使用
2. 依赖锁定(Dependency Locking)
依赖锁定是确保构建可重复性的重要技术,特别是当项目使用动态版本或版本范围时。
1. 依赖锁定的概念与重要性
依赖锁定将依赖图"冻结"在特定的时间点,记录解析的确切版本,确保后续构建使用相同的依赖版本,即使新版本发布。
2. 主要优势
- 构建可重现性:确保相同的源代码总是使用相同的依赖版本构建
- 防止意外升级:避免自动获取新发布的库版本
- 行为一致性:减少"在我的机器上能运行"问题
- 安全性:在审核新版本之前防止引入新依赖
3. 如何启用依赖锁定
在 settings.gradle
或特定项目的 build.gradle
中启用依赖锁定:
// 为所有配置启用依赖锁定
dependencyLocking {lockAllConfigurations()
}// 或者为特定配置启用
configurations.compileClasspath {resolutionStrategy.activateDependencyLocking()
}
4. 生成锁定文件
一旦启用了依赖锁定,您需要生成锁定文件:
# 为所有配置生成锁定文件
./gradlew dependencies --write-locks# 为特定项目生成锁定文件
./gradlew :app:dependencies --write-locks
这将在 gradle/dependency-locks
目录下创建锁定文件,每个配置一个文件。
5. 更新锁定依赖
当需要有意更新依赖版本时:
# 更新所有依赖锁
./gradlew dependencies --update-locks "com.squareup.retrofit2:*"# 或者完全刷新所有锁
./gradlew dependencies --write-locks
6. 依赖锁定与版本目录结合使用
依赖锁定和版本目录可以很好地结合使用,这种组合确保您既有集中的版本管理,又有确切的依赖锁定,提供最大的可重复性和控制。
- 版本目录:声明您期望的依赖版本(理想状态)
- 依赖锁定:记录实际解析的版本(实际状态)
// 在build.gradle中
dependencies {implementation libs.retrofit.core // 从版本目录
}dependencyLocking {lockAllConfigurations()
}
这里可能稍微难理解,我用个例子简单来描述一下。
假设我们开发的App中, Retrofit 2.9.0 依赖 OkHttp 4.9.0,但我们在版本目录中指定了更新的 OkHttp 4.9.3,
当没有依赖锁定时:
- 第一个开发者构建项目时会使用 OkHttp 4.9.3
- 下一个开发者几周后构建项目,可能 OkHttp 已更新到 4.9.5,他将使用 4.9.5
开启依赖锁定后:
- 所有开发者都会使用锁定文件中的精确版本 OkHttp 4.9.3
- 即使 OkHttp 发布了 4.9.5 版本,除非我们显式更新锁定文件,否则团队仍会使用 4.9.3
现在假设我们的目录版本中更新了Gson:
[versions]
# 更新了版本
gson = "2.9.0" # 从 2.8.5 更新
有了依赖锁定:
- 即使版本目录更新了,项目仍会使用锁定文件中的 2.8.5
- 团队可以讨论并决定何时更新锁定文件
- 当团队准备好时,可以显式更新锁定:
./gradlew dependencies --update-locks "com.google.gson*:*"
3. 依赖缓存与离线构建
有效管理依赖缓存可以显著提高构建性能,特别是在团队环境或 CI/CD 管道中。
1. Gradle 的依赖缓存机制
Gradle 在本地缓存所有下载的依赖,默认位置是用户主目录下的 .gradle/caches
目录。
2. 配置缓存位置
我们可以自定义缓存位置, 在 gradle.properties中:
# gradle.properties
org.gradle.caching=true
org.gradle.caching.debug=false
org.gradle.cache.dir=/custom/cache/directory
3. 启用构建缓存
构建缓存可以在配置中启用:
# settings.gradle
buildCache {local {enabled = true}
}
4. 离线模式构建
离线模式强制 Gradle 只使用缓存的依赖:
# 命令行参数
./gradlew build --offline# 或在 gradle.properties 中永久设置
org.gradle.offline=true
5. 依赖缓存的最佳实践
1. 共享缓存:考虑在团队之间或 CI 系统中共享缓存目录,减少重复下载
2. 定期清理:定期清理缓存,删除不再使用的依赖版本
./gradlew cleanBuildCache
3. 预热缓存:在 CI 构建前或开发环境设置中预热缓存
./gradlew downloadDependencies
4. 缓存备份:备份关键依赖的缓存,防止远程仓库不可用
5. 使用镜像或私有仓库:设置本地镜像或私有依赖仓库,减少外部依赖.
相关文章:
一文了解Gradle 依赖管理(五)- 依赖管理缓存依赖
文章目录 1. 版本目录 (Version Catalogs)1. 版本目录的概念与优势2. 主要优势3. 基本配置4. 使用版本目录5.使用外部版本目录文件6.实际项目中的版本目录最佳实践 2. 依赖锁定(Dependency Locking)1. 依赖锁定的概念与重要性2. 主要优势3. 如何启用依赖…...
如何在 Postman 中发送 PUT 请求?
在 Postman 中发送 PUT 请求的步骤相对简单,包括新建接口、选择 PUT 方法、填写 URL 和参数等几个主要步骤。 Postman 发送 put 请求教程...
Ubuntu20.04.6系统根目录扩容
文章目录 方法一:**1. 检查磁盘和分区情况****2. 扩展 vda3 分区****3. 扩展 LVM 物理卷****4. 扩展 LVM 逻辑卷****5. 扩展文件系统** 方法二:1. 查看当前磁盘分区情况2. 创建新分区3. 重新加载分区表4. 扩展物理卷(PV)5. 扩展逻辑卷&#x…...
《AI赋能SQL Server,数据处理“狂飙”之路》
在数字化浪潮汹涌的当下,企业的数据量犹如滚雪球般飞速增长。据统计,过去几年全球数据量的年增长率高达30%以上 ,海量数据如同双刃剑,既蕴含着无限商机,也给数据处理带来巨大挑战。SQL Server作为一款强大的关系型数据…...
c++ 日志框架G3log介绍及在嵌入式Linux上的移植(交叉编译)
在开发高性能的C应用程序时,一个高效的日志框架是不可或缺的。G3log是一个开源的日志库,以其高性能和易于使用著称,特别适用于嵌入式Linux环境。本文将详细介绍G3log的主要特性和如何在嵌入式Linux平台上进行交叉编译。 G3log介绍 G3log 是一…...
Buffer overFolw---Kryo序列化出现缓冲区溢出的问题解决
问题: 由于我的数据量太大,我设置批次为10000万,50w数据大概有400M左右,然后进行spark数据处理时候报错为org.apache.spark.SparkException:Kryo serialization failed:Buffer overFolw.Available:0,rquired 58900977,To …...
leetcode日常刷题
题目:K个一组翻转链表 思路 题目要求k个一组进行反转,首先考虑到如果k为1,那就可以直接返回链表头,这种情况没必要翻转。 如果只有一个节点或者head为空结点,直接返回head即可(一个节点翻转k次都是本身&am…...
菜鸡前端计算机强基计划之CS50 第七课 python 入门—— Python 中yield专题学习
菜鸡前端计算机强基计划之CS50 第七课 python 入门—— Python 中yield专题学习 1. 什么是 yield?直观感受 2. 生成器是什么?一个简单的例子 3. yield 的工作原理(图形化解释)4. yield 和内存的魔法用列表返回所有值用生成器逐步生…...
密码学——知识问答
目录 1、阐述公开密钥算法的定义,结合RSA算法说明公钥密码的基本要求。 说明公钥与私钥两种密码学并举例与其应用 1. 公钥密码学(非对称加密): 2. 私钥密码学(对称加密): 对比公钥与私钥密码…...
Talos-docker版本中创建 Kubernetes 集群
在talos容器化版本中部署Kubernetes集群,用于折腾学习。 1.系统信息 虚拟机软件:VMware Worktation 虚拟机配置:4G内存 4vCPU 200GB磁盘 操作系统:CentOS7.9 docker:20.10.15 PS:为啥VMware Worktat…...
【Excel使用技巧】某列保留固定字段或内容
目录 ✅ 方法一:使用 Excel 公式提取 body 部分 🔍 解释: ✅ 方法二:批量处理整列数据 🚨 注意事项 🚨 处理效果 我想保留Excel某一列的固定内容,比如原内容是: thread entry i…...
matlab 模拟 闪烁体探测器全能峰
clc;clear;close all %% 参数设置 num_events 1e5; % 模拟事件数 E 662e3; % γ射线能量(eV) Y 38000; % 光产额(photon/MeV,NaI(Tl)) eta 0.2; % 量子效率 G 1e6; …...
【leetcode hot 100 74】搜索二维矩阵
解法一:双重二分查找 class Solution {public boolean searchMatrix(int[][] matrix, int target) {int nmatrix.length, mmatrix[0].length;int row10, row2n-1, col10, col2m-1;int row_mid, col_mid;while(row1<row2){row_mid (row1row2)/2;while(col1<c…...
Maven 中 maven.test.skip 与skipTests 区别
在 Maven 中,maven.test.skip 和 skipTests 都用于控制测试的跳过行为,但它们的作用范围和底层机制有显著区别。以下是详细对比: 1. maven.test.skip 定义 maven.test.skip 是一个用户自定义属性(需在 pom.xml 的 <propertie…...
LLM - R1 强化学习 DRPO 策略优化 DAPO 与 Dr. GRPO 算法 教程
欢迎关注我的CSDN:https://spike.blog.csdn.net/ 本文地址:https://spike.blog.csdn.net/article/details/146533892 在强化学习算法中,DAPO (Decoupled Clip and Dynamic Sampling Policy Optimization),通过解耦裁剪和动态采样策…...
element-plus中,Loading 加载组件的使用
一.基本使用 给一个组件,如:table表格,加上v-loading"true"即可。 举例:复制如下代码。 <template><el-table v-loading"loading" :data"tableData" style"width: 100%"><…...
部署完dify:localhost/install 页面不停转圈圈,报错CROS error
解决办法 docker/.env 文件中,需要配置如下: NGINX_HTTPS_ENABLEDtrue NGINX_ENABLE_CERTBOT_CHALLENGEtrue 把Nginx的跨域请求打开...
UE4学习笔记 FPS游戏制作17 让机器人持枪 销毁机器人时也销毁机器人的枪 让机器人射击
添加武器插槽 打开机器人的Idle动画,方便查看武器位置 在动画面板里打开骨骼树,找到右手的武器节点,右键添加一个插槽,重命名为RightWeapon,右键插槽,添加一个预览资产,选择Rifle,根…...
【网络丢包】原因排查及优化
在流式响应中,丢包现象可能由多种因素引起,详细的原因分析、排查方法及优化策略: 一、丢包原因分析 网络拥塞 当网络带宽不足或流量突增时,路由器/交换机可能丢弃超出处理能力的数据包。 硬件问题 网卡、路由器、交换机等设备故…...
Spring Boot 实战:MD5 密码加密应用全解析
Spring Boot 实战:MD5 密码加密应用全解析 1. 引言 在应用开发中,密码安全是用户隐私保护的核心环节。直接存储明文密码存在极大的安全风险(如数据库泄露导致用户信息被盗)。MD5 加密作为一种广泛使用的哈希算法,可将…...
Android 底部EditView输入时悬浮到软键盘上方
1. 修改 Activity 的 Manifest 配置 确保你的 Activity 在 AndroidManifest.xml 中有以下配置: <activityandroid:name".YourActivity"android:windowSoftInputMode"adjustResize|stateHidden" /> 关键点: adjustResize 是…...
【deepseek 学c++】weakptr引用场景
std::weak_ptr 是 C 中与 std::shared_ptr 配合使用的智能指针,它本身不拥有资源的所有权,仅观察资源的状态,主要用于解决 shared_ptr 的循环引用问题和临时访问共享资源的需求。以下是 weak_ptr 的典型应用场景和核心价值:![ 为…...
从技术架构和生态考虑,不是单纯的配置优化,还有哪些方式可以提高spark的计算性能
从技术架构和生态系统层面提升Spark的计算性能,可采取以下核心策略: 一、计算模型重构与执行引擎升级 1. 弹性分布式数据集(RDD)的血统优化 通过RDD的Lineage(血统)机制实现容错时,采用增量式…...
怎样进行服务器的日常安全监控和审计?
服务器的日常安全监控和审计是保障服务器安全运行的重要措施,以下是一些常见的方法和工具: 系统日志监控 启用日志功能:确保服务器操作系统、应用程序和数据库等都启用了详细的日志记录功能。例如,Linux 系统中的 syslog&#x…...
Java 集合框架面经
1、说说有哪些常见的集合框架? 集合框架可以分为两条大的支线: Map 接口:表示键值对的集合,一个键映射到一个值。键不能重复,每个键只能对应一个值。Map 接口的实现类包括 HashMap、LinkedHashMap、TreeMap 等。Colle…...
【已解决】Git:为什么 .gitignore 不生效?如何停止跟踪已提交文件并阻止推送?
你可能遇到的问题 你已经提交了某个文件夹(如 dataset)到 Git 仓库,之后修改了它,但发现修改内容被 Git 持续跟踪,无法通过 .gitignore 忽略。尝试在 .gitignore 中添加规则后,修改的文件仍然显示为"…...
MOSN(Modular Open Smart Network)-04-TLS 安全链路
前言 大家好,我是老马。 sofastack 其实出来很久了,第一次应该是在 2022 年左右开始关注,但是一直没有深入研究。 最近想学习一下 SOFA 对于生态的设计和思考。 sofaboot 系列 SOFAStack-00-sofa 技术栈概览 MOSN(Modular O…...
SICAR 标准 KUKA 机器人标准功能块说明手册
功能块名称:LSicar_Robot_KUKA_PrD 目录 1. 概述 2. 功能说明 2.1 程序控制 2.2 状态监控 2.3 报警与故障处理 2.4 驱动控制 3. 关键参数说明 4. 操作步骤指南 4.1 初始化配置 4.2 运行控制 4.3 状态监控 5. 常见故障处理 6. 注意事项 附录1:程序段索引 附录…...
QT三 自定义控件,自定义控件的事件处理自定义事件过滤,原始事件过滤
一 自定义控件 现在的需求是这样: 假设我们要在QWidget 上做定制,这个定制包括了关于 一些事件处理,意味着要重写QWidget的一些代码,这是不实际的,因此我们需要自己写一个MyWidget继承QWidget,然后再MyWi…...
Leetcode算法方法总结
1. 双指针法解决链表/数组题目 只要数组有序,就要想到双指针做法。还有二分法 回文串一般也会用到双指针,回文串的长度由于可能是奇数也可能是偶数,所以在寻找时,既需要寻找奇数长度的回文串,也需要寻找偶数长度的回文…...
【Elasticsearch基础】基本核心概念介绍
Elasticsearch作为当前最流行的分布式搜索和分析引擎,其强大的功能背后是一套精心设计的核心概念体系。本文将深入解析Elasticsearch的五大核心概念,帮助开发者构建坚实的技术基础,并为高效使用ES提供理论支撑。 1 索引(Index&…...
docker远程debug
1. 修改 Java 启动命令 在 Docker 容器中启动 Java 程序时,需要添加 JVM 调试参数,jdk8以上版本 java -agentlib:jdwptransportdt_socket,servery,suspendn,address*:5005 -jar your-app.jar jdk8及以下版本: java -Xdebug -Xrunjdwp:tra…...
华为eNSP-配置静态路由与静态路由备份
一、静态路由介绍 静态路由是指用户或网络管理员手工配置的路由信息。当网络拓扑结构或者链路状态发生改变时,需要网络管理人员手工修改静态路由信息。相比于动态路由协议,静态路由无需频繁地交换各自的路由表,配置简单,比较适合…...
CentOS 7下安装PostgreSQL 15
一、简介 PostgreSQL是一种特性非常齐全的自由软件的对象-关系型数据库管理系统(ORDBMS),是以加州大学计算机系开发的POSTGRES,4.2版本为基础的对象关系型数据库管理系统。POSTGRES的许多领先概念只是在比较迟的时候才出现在商业…...
时序数据库 InfluxDB(一)
时序数据库 InfluxDB(一) 数据库种类有很多,比如传统的关系型数据库 RDBMS( 如 MySQL ),NoSQL 数据库( 如 MongoDB ),Key-Value 类型( 如 redis )…...
动态添加view方法-微信小程序
在微信小程序中,通过动态数据绑定和条件渲染来实现动态添加 view 组件的效果。 以下是一个简单的示例,展示如何根据数据动态添加 view。 WXML 文件 在 WXML 文件中,使用 wx:for 指令来遍历数组,并动态生成 view 组件。 <view…...
Java中清空集合列表元素有哪些方式
在 Java 里,存在多种清空列表的方式,下面为你汇总并附上对应的示例代码: import java.util.ArrayList; import java.util.List;public class ListClearDemo {public static void main(String[] args) {// 初始化一个列表List<String> …...
QOpenGLWidget动态加载功能实现教程(Qt+OpenGL)
QOpenGLWidget动态加载功能实现教程 我需要在Qt里面使用QOpenGLWidget显示OpenGL窗口,并且需要实现加载模型后重新渲染更新窗口的功能,但是一直无法更新被卡住了,现在把问题解决了总结一下整个实现过程。 创建一个自己的OpenGLWidget类 QOp…...
00.【Linux系统编程】 Linux初识(云服务器设置CentOS并使用、Xshell链接云服务器)
目录 一、华为云服务器免费体验申请 二、Xshell远程链接创建好的华为云服务器 2.1 下载Xshell 2.2 Xshell远程连接华为云服务器 一、华为云服务器免费体验申请 华为云官网 1. 进入华为云官网,最上面一栏点活动,并进入免费体验中心。 2. 找到含有“…...
数据结构-二叉链表存储的二叉树
树形结构是一类重要的非线性数据结构,其中以树和二叉树最为常用。对于每一个结点至多只有两课子树的一类树,称其为二叉树。二叉树的链式存储结构是一类重要的数据结构,其形式定义如下: 而二叉树的前序、中序遍历是非常重要的能够访…...
鸿蒙Flutter实战:20. Flutter集成高德地图,同层渲染
本文以同层渲染为例,介绍如何集成高德地图 完整代码见 Flutter 鸿蒙版 Demo 概述 Dart 侧 核心代码如下,通过 OhosView 来承载原生视图 OhosView(viewType: com.shaohushuo.app/customView,onPlatformViewCreated: _onPlatformViewCreated,creation…...
idea中快速注释函数
在IntelliJ IDEA中,有多种方法可以快速注释函数。 使用快捷键 你可以使用以下快捷键来快速注释函数[3]: 行注释:使用Ctrl/(Windows系统)或Command/(Mac系统)可以在当前行前添加或删除单行注释…...
Leetcode13-罗马数字转整数
题目链接:13. 罗马数字转整数 - 力扣(LeetCode) 如同上一题,直接用暴力法破解,简单好理解 int romanToInt(char* s) {int len strlen(s);int res 0;for(int i 0; i < len; i) {switch(s[i]) {case M:res 1000…...
3、pytest实现参数化
在 pytest 中,参数化(parametrization)是一种强大的功能,可以让你用不同的输入数据重复执行同一个测试函数。这种功能非常有用,可以帮助你显著减少重复代码并提高测试覆盖率。 参数化的主要作用是: 测试多…...
深入理解指针(4)(C语言版)
文章目录 前言一、回调函数是什么(一)定义(二)工作原理(三)应用场景 二、qsort举例(一)qsort函数简介(二)比较函数的定义(三)使用示例…...
【 <二> 丹方改良:Spring 时代的 JavaWeb】之 Spring Boot 中的日志管理:Logback 的集成
<前文回顾> 点击此处查看 合集 https://blog.csdn.net/foyodesigner/category_12907601.html?fromshareblogcolumn&sharetypeblogcolumn&sharerId12907601&sharereferPC&sharesourceFoyoDesigner&sharefromfrom_link <今日更新> 一、开篇整…...
记录一次渗透测试/常用命令
渗透测试常用命令速览:从扫描到提权再到流量劫持 在渗透测试中,命令行工具是我们的得力助手。本文总结了我最近在测试虚拟机靶机(IP: 192.168.73.129)时用到的主要命令,涵盖网络扫描、暴力破解、权限提升、数据修改和…...
C++11QT复习(二)
文章目录 Day4-4 New 与 delete 表达式(2025.03.20)1. new 表达式的三个步骤2. delete 表达式的两个步骤3. new[] 与 delete[] Day5 类的定义和关键字再探(2025.03.24)1. C 关键字 const、static、extern2. 类的定义:C…...
Pytorch学习笔记(十)Learning PyTorch - Learning PyTorch with Examples
这篇博客瞄准的是 pytorch 官方教程中 Learning PyTorch 章节的 Learning PyTorch with Examples 部分。 官网链接:https://pytorch.org/tutorials/beginner/pytorch_with_examples.html 完整网盘链接: https://pan.baidu.com/s/1L9PVZ-KRDGVER-AJnXOvlQ?pwdaa2m…...
如何使用DeepSeek编写测试用例?
一、DeepSeek在测试用例设计中的定位 DeepSeek作为AI工具,并非直接替代测试设计,而是通过以下方式提升效率: 快速生成基础用例框架(等价类、边界值等) 智能补充易遗漏场景(如特殊字符、异常流) 自动化脚本片段生成(Python/pytest/JUnit等) 测试数据构造建议(符合业务…...