[Android]常见的包管理方式
在Android开发中,包管理主要是通过构建和依赖管理工具来处理。下面列举了几种最常见和主流的包管理方式:
一、Gradle
Gradle 是 Android 官方推荐的构建工具,几乎成为了 Android 开发的标准。它支持自定义构建逻辑、依赖管理、多项目构建等,与 Android Studio 有很好的集成。
Gradle 是一个强大的构建系统,被广泛用于 Android 项目,特别是在使用 Kotlin 进行开发时。它不仅管理项目的构建过程,还处理依赖管理和其他自动化任务。
以下是如何在使用 Kotlin 开发 Android 应用时,通过 Gradle 进行包管理的介绍:
1. Gradle 配置文件
在 Android 项目中,主要有两种类型的 Gradle 配置文件:
- 项目级别的
build.gradle
(通常位于项目根目录):这个文件配置了整个项目范围内的设置,如 Gradle 插件版本和其他配置。 - 模块级别的
build.gradle
(位于 app 或其他模块的目录下):这个文件负责配置特定于模块的设置,包括依赖关系、SDK 版本等。
2. 添加依赖
在模块级别的 build.gradle
文件中,你可以添加外部库的依赖:
dependencies {// Kotlin 标准库implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version"// AndroidX 核心库implementation 'androidx.core:core-ktx:1.6.0'// 添加其他库,例如 Retrofit 网络库implementation 'com.squareup.retrofit2:retrofit:2.9.0'implementation 'com.squareup.retrofit2:converter-gson:2.9.0'// 测试库testImplementation 'junit:junit:4.13.2'androidTestImplementation 'androidx.test.ext:junit:1.1.3'androidTestImplementation 'androidx.test.espresso:espresso-core:3.4.0'
}
在Android开发中,Gradle通常会从几个主要的包管理网站获取依赖库。最常用的包括:
Maven Central:
- 网站地址: Maven Central Repository
- Maven Central 是Java和Android开发中最常用的库和依赖管理系统之一。它包含大量公开可用的库,是开发者查找和引用库的重要资源。
Google's Maven Repository:
- 网站地址: Google's Maven Repository
- 这是Google专门为Android开发者提供的Maven仓库。它包括所有支持库(Support Libraries)、AndroidX和其他Google开发的库,这些库是进行现代Android开发不可或缺的部分。
JitPack:
- 网站地址: JitPack
- JitPack是一个现代的包管理服务,它允许你直接从GitHub等Git仓库中获取Java和Android库。这使得即使库不在Maven Central或其他传统Maven仓库中,也能轻松地作为依赖添加到项目中。
3. 项目级别的 build.gradle
配置
在项目级别的 build.gradle
中,你需要指定 Gradle 插件和其他项目级别的配置:
buildscript {ext.kotlin_version = "1.5.21" // 设置 Kotlin 版本repositories {google()mavenCentral()}dependencies {classpath 'com.android.tools.build:gradle:4.2.2'classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"}
}allprojects {repositories {google()mavenCentral()}
}
4. 同步和构建
在修改了 Gradle 配置或依赖后,你需要同步项目,以便 Android Studio 可以识别这些更改并下载必要的依赖。这可以通过点击 Android Studio 的 "Sync Now" 提示或从菜单中选择 "File" -> "Sync Project with Gradle Files" 来完成。
5. 使用 Kotlin DSL
对于 Kotlin 开发者,还可以选择使用 Kotlin DSL 来编写 Gradle 脚本,这使用的是 .gradle.kts
文件而不是常规的 .gradle
文件。Kotlin DSL 提供了更好的类型安全和 Kotlin 语言特性:
plugins {kotlin("android")kotlin("android.extensions")
}dependencies {implementation(kotlin("stdlib-jdk7"))implementation("androidx.core:core-ktx:1.6.0")implementation("com.squareup.retrofit2:retrofit:2.9.0")
}
6. 使用变量和版本管理
为了更好地管理依赖版本,你可以在项目级 build.gradle
中定义变量,然后在模块级 build.gradle
中使用这些变量。这样可以确保依赖库的版本一致性并简化维护。
二、Maven
虽然 Maven 在 Android 开发中不如 Gradle 流行,但它在 Java 社区中仍然非常受欢迎,并被用于一些老的 Android 项目。它提供了一种更传统的、基于 XML 的配置方式。
尽管 Gradle 是 Android 开发的首选构建系统,但 Maven 仍然可以用于管理 Android 应用的依赖和构建过程,尤其是在某些企业和遗留项目中。下面是如何在使用 Kotlin 开发 Android 应用时,通过 Maven 进行包管理的介绍。
1. 创建 Maven 项目
首先,你需要一个 Maven 项目。如果你是从零开始,可以使用 Maven 的命令行工具来生成一个基本的项目结构。例如:
$ mvn archetype:generate -DgroupId=com.example -DartifactId=my-app -DarchetypeArtifactId=maven-archetype-quickstart -DinteractiveMode=false
2. 添加 Android Maven 插件
为了使 Maven 支持 Android 应用的构建,你需要在你的 pom.xml
文件中添加 Android Maven 插件。这个插件提供了必要的工具和任务,用于编译 Android 代码、打包 APK 等。
<project xmlns="http://maven.apache.org/POM/4.0.0"xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"><modelVersion>4.0.0</modelVersion><groupId>com.example</groupId><artifactId>my-app</artifactId><version>1.0-SNAPSHOT</version><packaging>apk</packaging><properties><kotlin.version>1.3.72</kotlin.version><android.maven.plugin.version>4.5.0</android.maven.plugin.version></properties><build><plugins><plugin><groupId>com.simpligility.maven.plugins</groupId><artifactId>android-maven-plugin</artifactId><version>${android.maven.plugin.version}</version><configuration><sdk><platform>29</platform></sdk></configuration><extensions>true</extensions></plugin></plugins></build><dependencies><!-- Kotlin standard library --><dependency><groupId>org.jetbrains.kotlin</groupId><artifactId>kotlin-stdlib</artifactId><version>${kotlin.version}</version></dependency><!-- Additional dependencies --></dependencies>
</project>
3. 添加依赖
在 pom.xml
文件的 <dependencies>
部分中,你可以添加所需的库。比如说,如果你想使用 Retrofit 来处理网络请求,你可以这样添加:
<dependency><groupId>com.squareup.retrofit2</groupId><artifactId>retrofit</artifactId><version>2.9.0</version>
</dependency>
4. 构建和运行
使用 Maven 构建 Android 项目,你可以使用以下命令:
$ mvn clean install
这个命令会编译你的项目、运行测试、并生成 APK 文件。
5. 管理版本和属性
通过在 <properties>
标签中设置版本号和其他常用变量,可以更容易地管理和更新这些值。这在管理多个依赖项的版本时尤其有用。
注意事项
- 插件支持: Android Maven 插件并不像 Gradle 那样受到广泛支持。确保你使用的插件是最新的,或者至少是兼容目前 Android SDK 版本的。
- Android Studio 集成: Android Studio 对 Maven 的支持不如对 Gradle 的支持。虽然可以使用 Maven,但可能需要手动调整更多的配置。
三、JitPack
JitPack 是一个简单的包管理服务,它可以将任何 GitHub、GitLab、Bitbucket 或其他公共 Git 仓库中的 Java 或 Android 项目直接转换为 Maven 或 Gradle 可用的库。在使用 Kotlin 开发 Android 应用时,JitPack 提供了一种便捷的方式来引入那些不在 Maven 中心仓库或其他常见仓库中的依赖。
但是请注意,JitPack 默认支持的是 GitHub、GitLab 和 Bitbucket。对于其他托管平台如 Gitee,可能需要一些额外的设置或者不被直接支持。
以下是如何在使用 Kotlin 开发的 Android 应用中通过 Gradle 使用 JitPack 进行包管理的详细步骤:
1. 在项目中启用 JitPack
首先,你需要在项目的根级 build.gradle
文件(项目级别的配置文件)中添加 JitPack 仓库。打开这个文件,找到 allprojects
部分,并在 repositories
块中添加 JitPack 的 URL:
allprojects {repositories {google()mavenCentral()maven { url 'https://jitpack.io' }}
}
在“settings.gradle.kts”文件中,请添加如下内容:
dependencyResolutionManagement {repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)repositories {google()mavenCentral()maven {url = uri("https://jitpack.io")}}
}
这样配置后,你的项目就可以从 JitPack 仓库中获取依赖。
2. 添加依赖
接下来,在你的模块级别 build.gradle
文件(通常是 app/build.gradle
)中添加需要的库作为依赖。你需要知道库的 GitHub 用户名或组织名、仓库名以及版本标签。
假设你想添加一个名为 SomeLibrary
的库,该库由用户 SomeUser
在 GitHub 上维护,并且你想使用标签 v1.0
的版本,你可以这样添加依赖:
dependencies {implementation 'com.github.SomeUser:SomeLibrary:v1.0'
}
版本可以是特定的发行版标签、提交哈希或者分支名。如果你想依赖一个特定的提交,你可以这样做:
dependencies {implementation 'com.github.SomeUser:SomeLibrary:commit-hash'
}
对于JitPack不支持的库比如Gitee, 需要处理私有库的权限问题。
由于库是私有的,您需要确保在构建过程中有权限访问这个库。这通常涉及到添加访问令牌或设置 SSH keys。
-
使用 Access Token:
您可能需要在 JitPack 配置中或在构建服务器上设置环境变量,以使用您的私有访问 token。 -
使用 SSH Keys:
如果您使用的是本地机器或某些 CI 系统,您可能需要配置 SSH keys 以允许访问 Gitee 的私有仓库。
注意事项:
- JitPack 兼容性:确保 JitPack 支持从 Gitee 托管的仓库构建,因为 JitPack 主要支持 GitHub、GitLab 和 Bitbucket。
- 私有库访问:确保您已经正确设置了访问私有库所需的认证方法。
- 库版本标签:确保您在 Gitee 仓库中对您想要使用的提交使用了正确的版本标签。
3. 同步项目
添加完依赖后,不要忘记同步你的项目。可以通过点击 Android Studio 的 "Sync Now" 提示或从菜单中选择 "File" -> "Sync Project with Gradle Files" 来完成。
4. 使用库
一旦依赖被正确添加和同步,你就可以在项目中使用该库的类和资源了。
常见问题和注意事项
- 私有仓库:如果你正在使用的库在一个私有的 Git 仓库中,你需要在 JitPack 网站上登录并授权它访问该库。JitPack 将提供一个特定的令牌,你可以在 URL 中使用它来访问私有库。
- 动态版本:尽管支持使用分支名作为版本,这种做法可能会导致构建不稳定。建议尽可能使用固定的标签或提交哈希。
- 网络问题:由于 JitPack 是一个在线服务,任何网络问题都可能影响到从 JitPack 拉取依赖的过程。确保你的网络连接稳定。
- 性能考量:从 JitPack 加载依赖可能比从更常用的 Maven 中心仓库慢,因为如果库不在 JitPack 的缓存中,JitPack 需要实时构建这些库。
四、Bazel
Bazel 是一个由 Google 开发的多语言、快速且可扩展的构建系统,它支持多种编程语言和平台,包括用于 Android 应用开发的 Kotlin。Bazel 的优势在于其高效的依赖管理和增量构建能力,这使得它非常适合大型或多项目(monorepo)环境。
在使用 Kotlin 开发 Android 应用时,使用 Bazel 进行包管理和构建需要遵循以下步骤:
1. 安装 Bazel
首先,你需要在你的开发环境中安装 Bazel。你可以从 Bazel 官方网站下载适合你操作系统的版本,并按照提供的安装指南进行安装。
2. 设置 Android 工程
创建工作区
在你的项目根目录创建一个名为 WORKSPACE
的文件。这个文件告诉 Bazel 如何处理项目的外部依赖和设置。
# WORKSPACE file# 加载 Android 规则
load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")# 设置 Android SDK 和 NDK(确保已经安装并正确设置环境变量)
android_sdk_repository(name = "androidsdk",api_level = 29,build_tools_version = "29.0.2"
)# Google Maven 依赖
RULES_JVM_EXTERNAL_TAG = "4.0"
RULES_JVM_EXTERNAL_SHA = "62133c1250...更多SHA值"http_archive(name = "rules_jvm_external",strip_prefix = "rules_jvm_external-%s" % RULES_JVM_EXTERNAL_TAG,sha256 = RULES_JVM_EXTERNAL_SHA,url = "https://github.com/bazelbuild/rules_jvm_external/archive/%s.zip" % RULES_JVM_EXTERNAL_TAG,
)load("@rules_jvm_external//:defs.bzl", "maven_install")maven_install(artifacts = ["org.jetbrains.kotlin:kotlin-stdlib-jdk8:1.3.72",# 列出其他 Maven 依赖],repositories = ["https://maven.google.com","https://repo.maven.apache.org/maven2",],
)
定义构建规则
接下来,在你的项目中创建一个或多个 BUILD
文件,这些文件定义了如何构建应用的具体规则。例如,创建一个简单的 Android 应用可能需要以下的 BUILD
配置:
# BUILD fileload("@rules_kotlin//kotlin:kotlin.bzl", "kt_android_library")kt_android_library(name = "app",srcs = glob(["src/main/kotlin/**/*.kt"]),resource_files = glob(["src/main/res/**"]),manifest = "src/main/AndroidManifest.xml",deps = ["@maven//:org_jetbrains_kotlin_kotlin_stdlib_jdk8",# 添加其他依赖],
)
3. 构建和运行
使用 Bazel 构建和运行你的 Android 应用,可以使用如下命令:
# 构建 APK
bazel build //path/to/your/app:app# 运行
bazel mobile-install //path/to/your/app:app
注意事项
- 学习曲线:Bazel 拥有较高的学习曲线,特别是对于初学者和小型项目来说,可能会显得复杂。
- 集成:虽然 Bazel 支持多种语言和平台,但与某些 IDE(如 Android Studio)的集成不如 Gradle。
- 性能:Bazel 在大型项目中表现出色,尤其是在增量构建和缓存管理方面,可以显著提高构建效率。
五、CMake
对于包含原生 C++ 代码的 Android 应用,CMake 是一个重要的工具。它是 Android Native Development Kit (NDK) 的支持工具之一,用于构建本地代码库。
在开发使用 Kotlin 的 Android 应用时,通常不会直接使用 CMake 进行包管理,因为 CMake 主要用于管理 C++ 代码的构建过程。然而,在 Android 应用开发中,如果你的项目涉及到使用 Kotlin 与 C++ 的交互(即使用 JNI —— Java Native Interface),那么你可能需要配置 CMake 来构建你的本地(native)代码部分。
以下是如何在涉及 Kotlin 和 C++ 代码的 Android 应用中设置和使用 CMake 的基本步骤:
1. 安装 CMake
确保你的开发环境中已经安装了 CMake。对于 Android 开发,Android Studio 已经包含了需要的 CMake 工具,你只需在 Android Studio 中启用即可:
- 打开 Android Studio。
- 进入 "File" > "Project Structure" > "SDK Location".
- 确认或安装 "CMake"。
2. 配置 CMakeLists.txt
在项目中创建一个 CMake 配置文件,通常命名为 CMakeLists.txt
。这个文件将定义如何构建 C++ 源代码。假设你有一些 C++ 源文件需要编译,你可以创建如下的 CMakeLists.txt
文件:
cmake_minimum_required(VERSION 3.4.1) # 指定 CMake 的最小版本add_library( # 设置库的名称native-lib# 将库设置为共享库。SHARED# 提供源文件的相对路径。src/main/cpp/native-lib.cpp )find_library( # 定义变量log-lib# 指定要查找的系统库。log )target_link_libraries( # 指定目标库native-lib# 目标库需要链接的库${log-lib} )
3. 更新 build.gradle
接下来,你需要在 build.gradle
文件中配置 CMake。打开模块级别的 build.gradle
文件(例如 app/build.gradle
),并添加 externalNativeBuild
配置:
android {...defaultConfig {...externalNativeBuild {cmake {// 提供 CMakeLists.txt 文件的路径path "CMakeLists.txt"}}}// 配置 CMake 的版本和路径externalNativeBuild {cmake {version "3.10.2"path "CMakeLists.txt"}}
}
4. 编译和运行
通过以上设置,当你构建你的 Android 项目时,CMake 会被调用来编译你的 C++ 源代码,并将生成的库与你的应用一起打包。你可以使用 Android Studio 的标准构建和运行按钮来执行这些操作。
注意事项
- JNI:使用 JNI 时,确保你熟悉 Java 和 C++ 之间的接口关系。正确地处理数据类型转换和生命周期管理是非常重要的。
- 性能:使用 native 代码可以提高某些类型应用的性能,但同时也增加了复杂性。确保 native 代码的使用是出于性能必要性。
相关文章:
[Android]常见的包管理方式
在Android开发中,包管理主要是通过构建和依赖管理工具来处理。下面列举了几种最常见和主流的包管理方式: 一、Gradle Gradle 是 Android 官方推荐的构建工具,几乎成为了 Android 开发的标准。它支持自定义构建逻辑、依赖管理、多项目构建等…...

每日10亿数据的日志分析系统OOM
背景 一个每日10亿数据的日志清洗系统,主要工作就是从消息队列中消费各种各样的日志,然后对日志进行清洗,例如:用户敏感信息(姓名、手机号、身份证)进行脱敏处理,然后把清理完的数据交付给其他系统使用。 我们项目中,…...

智能驱动,精准管理:打造高效干部管理系统
干部管理系统是现代组织管理中不可或缺的工具,它通过信息技术的应用,提高了干部管理的效率和准确性。干部管理系统的主要功能包括: 1. 信息管理:系统可以存储和管理干部的个人信息,包括基本资料、工作经历、教育背景、…...

轮式机器人简介
迄今为止,轮子一般是移动机器人学和人造交通车辆中最流行的运动机构。它可达到很高的效率, 如图所示, 而且用比较简单的机械就可实现它的制作。 另外,在轮式机器人设计中,平衡通常不是一个研究问题。 因为在所有时间里,轮式机器人一般都被设计成在任何时间里所有轮子均与地接…...
已知哈夫曼节点个数,求哈夫曼字符编码数
哈夫曼编码(Huffman Coding)是一种用于无损数据压缩的嫡编码(权编码)算法。 在哈夫曼树中,每个叶子节点都代表一个字符,而节点的权重通常代表字符的频率。在哈夫曼编码中,每个字符都会被赋予一个二进制编码。为了获得这些编码,我…...
Kubernetes Cluster IP,Node IP,Pod IP间通信原理解析
目录 1、Cluster IP2、Node IP3、NodePort4、Pod IP5、LoadBalancer6、三种IP间通信6.1、Pod IP 与 Pod IP 通信6.2、Pod IP 与 Cluster IP 通信6.3、Node IP 与 Pod IP 通信6.4、Node IP 与 Cluster IP 7、YAML 示例7.1、ClusterIP Service7.2、LoadBalancer Service 1、Clust…...

随机链表的深拷贝
1.题目 解题思路一:暴力求解,先创建新链表,然后把旧链表中的val和next指针给复制到新链表中,根据旧链表中的random指针所指向的旧链表中的val值找到所对应的节点,记录该节点的位置,就像数组一样,…...
328_C++_HTTP_HTTP协议传输data数据,为什么要进行base64编解码操作?
http传输data数据的时候,为什么必须进行base64转码后才能有效发送,接收方也必须base64转码后才能有效接受? HTTP HTTP传输数据时,使用Base64编码并不是必须的,但它确实在某些情况下非常有用。以下是为什么在某些情况…...

【二叉树】Leetcode N 叉树的层序遍历
题目讲解 429. N 叉树的层序遍历 算法讲解 在做层序遍历的时候由于它的每一个结点是有val vector child组成,所以在做层序遍历的时候需要考虑它每一层结点的个数,那我们就可以使用一个queue保存每一层的结点;那么我们在做第一层的时候&am…...

Spring AI
目录 一、Spring AI 1、Spring AI简介 1.1、四次工业革命发展和变革 1.2、什么是人工智能? 1.3、人工智能的发展历程 1.4、什么是大模型? 1.5、如何训练大模型? 一、Spring AI 1、Spring AI简介 Spring AI Java接入人工智能大模型 1.1、四次工业革命发展和变革 人类…...
fiori SAP ui5 动态改变控件颜色
使用CustomData动态改变控件颜色 有时候我们需要改变控件颜色,对于高度封装的控件,显然改变控件CSS是比较困难的,幸好SAP UI5预设了一个customData的属性,每个控件都能使用她。 如下代码是判断汇率是否有改变,如果改…...
RabbitMQ php amqp
Linux debian 安装 Windows php amqp 扩展 PECL :: Package :: amqp 将 php_amqp.dll 复制到 php 的 ext 目录下 将 rabbitmq.4.dll 复制到 c:\windows\system32 目录下 php.ini extensionamqp...

对称二叉树
给你一个二叉树的根节点 root , 检查它是否轴对称。 示例 1: 输入:root [1,2,2,3,4,4,3] 输出:true示例 2: 输入:root [1,2,2,null,3,null,3] 输出:falses 思路:我刚开始是想着用…...
浅浅总结SQL中的事务.
在现实生活中有很多的线上支付的场景,当支付的时候,一方资金减少,另一方资金增加,在执行前后,两者的总体数额需要相同,为了保证这个操作的完整,所以提出了事务,那我们先来去写一个示例ÿ…...

C++ | Leetcode C++题解之第76题最小覆盖子串
题目: 题解: class Solution { public:unordered_map <char, int> ori, cnt;bool check() {for (const auto &p: ori) {if (cnt[p.first] < p.second) {return false;}}return true;}string minWindow(string s, string t) {for (const au…...

什么可以替代iframe?
网页嵌套中,iframe曾几何时不可一世,没有其他更好的选择! iframe即内联框架,作为网页设计中的一种技术,允许在一个网页内部嵌套另一个独立的HTML文档。尽管它在某些场景下提供了便利,但也存在多方面的缺陷…...
HTTP/1.0、HTTP/1.1、HTTP/2.0区别
文章目录 区别HTTP/1.0HTTP/1.11. 持久连接(长连接)2. 管道化3. Host头字段4. 分块传输编码5. 缓存机制6. 请求方法 HTTP/2.01. 二进制分帧2. 多路复用3. 服务器推送4. 优先级设置5. 头信息压缩6. 安全性7. 流量控制 区别 特性HTTP/1.0HTTP/1.1HTTP/2.0…...

鸿蒙内核源码分析(文件句柄篇) | 你为什么叫句柄
句柄 | handle int open(const char* pathname,int flags); ssize_t read(int fd, void *buf, size_t count); ssize_t write(int fd, const void *buf, size_t count); int close(int fd);只要写过应用程序代码操作过文件不会陌生这几个函数,文件操作的几个关键步骤嘛,跟把大…...

2024.5.8 关于 SpringCloud —— Ribbon 的基本认知
目录 Ribbon 负载均衡原理 工作流程 Ribbon 负载均衡规则 Ribbon 负载均衡自定义化 代码方式修改规则 配置文件方式修改规则 小总结 Ribbon 设定饥饿加载 Ribbon 负载均衡原理 工作流程 order-service 使用 RestTemplate 发送请求,随后该请求将会被 Ribbon 所…...
Lua 协程模拟 Golang 的 go defer 编程模式
封装go函数用于创建并启动一个协程: ---go函数创建并启动一个协程 ---param _co_task function 函数原型 fun(_co:thread) function go(_co_task)local co coroutine.create(_co_task) -- 创建一个暂停的协程coroutine.resume(co, co) -- 调用coroutine.resume激活…...

Docker镜像无法拉取问题解决办法
最近再学习RabbitMQ,需要从Docker镜像中拉取rabbitMQ,但是下拉失败 总的来说就是无法和docker镜像远程仓库建立连接 我又去尝试ping docker.io发现根本没有反应,还是无法连接找了许多办法还是没有办法解决,最后才发现是镜像问题&a…...
使用 Python + SQLAlchemy 创建知识库数据库(SQLite)—— 构建本地知识库系统的基础《一》
📚 使用 Python SQLAlchemy 创建知识库数据库(SQLite)—— 构建本地知识库系统的基础 🧠 一、前言 随着大模型技术的发展,越来越多的项目需要构建本地知识库系统来支持 RAG(Retrieval-Augmented Generat…...

基于React + FastAPI + LangChain + 通义千问的智能医疗问答系统
📌 文章摘要: 本文详细介绍了如何在前端通过 Fetch 实现与 FastAPI 后端的 流式响应通信,并支持图文多模态数据上传。通过构建 multipart/form-data 请求,配合 ReadableStream 实时读取 AI 回复内容,实现类似 ChatGPT…...
主流信创数据库对向量功能的支持对比
主流信创数据库对向量功能的支持对比 版本支持对比向量索引支持对比距离函数支持对比使用限制对比OceanBase向量数据库GaussDB向量数据库TiDB向量数据库VastBase向量数据库 ⭐️ 本文章引用数据截止于2025年5月31日。 版本支持对比 数据库产品支持向量功能的版本OceanBaseOce…...
Build a Large Language Model (From Scratch) 序章
关于本书 《从零构建大型语言模型》旨在帮助读者全面理解并从头创建类似GPT的大型语言模型(LLMs)。 全书首先聚焦于文本数据处理的基础知识和注意力机制的编码,随后指导读者逐步实现一个完整的GPT模型。书中还涵盖了预训练机制以及针对文本…...
NoSQL 之Redis哨兵
目录 一、Redis 哨兵模式概述 (一)背景与核心目标 (二)基本架构组成 (三)核心功能 二、哨兵模式实现原理 (一)配置关键参数 (二)哨兵节点的定时任务 …...
gh hugging face使用
install sudo dpkg -i gh_2.74.0_linux_amd64.deb gh auth login gh auth login ? Where do you use GitHub? GitHub.com ? What is your preferred protocol for Git operations on this host? HTTPS ? Authenticate Git with your GitHub credentials? Yes ? How wo…...
软件测试:质量保障的基石与未来趋势
软件测试作为软件开发生命周期中的关键环节,不仅是发现和修复缺陷的手段,更是确保产品质量、提升用户体验和降低开发成本的重要保障。在当今快速迭代的互联网时代,测试已从单纯的验证活动演变为贯穿整个开发过程的质量管理体系。本文将系统阐…...

解决uniapp开发app map组件最高层级 遮挡自定义解决底部tabbar方法
subNvue,是 vue 页面的原生子窗体,把weex渲染的原生界面当做 vue 页面的子窗体覆盖在页面上。它不是全屏页面,它给App平台vue页面中的层级覆盖和原生界面自定义提供了更强大和灵活的解决方案。它也不是组件,就是一个原生子窗体。 …...
Spring AI 项目实战(五):Spring Boot + AI + DeepSeek + Redis 实现聊天应用上下文记忆功能(附完整源码)
系列文章 序号文章名称1Spring AI 项目实战(一):Spring AI 核心模块入门2Spring AI 项目实战(二):Spring Boot + AI + DeepSeek 深度实战(附完整源码)3Spring AI 项目实战(三):Spring Boot + AI + DeepSeek 打造智能客服系统(附完整源码)4Spring AI 项目实战(四…...