当前位置: 首页 > article >正文

Ubuntu20.04搭建gerrit code review

一、环境准备

1. 安装 Java 环境‌

Gerrit 依赖 Java 运行环境(推荐 JDK 8+):

sudo apt install openjdk-11-jdk  

验证安装:

java -version 

‌2. 安装 Git

sudo apt install git  

‌3. 可选依赖

  • 数据库‌:Gerrit 默认使用 H2,但生产环境建议配置 MySQL 或 PostgreSQL‌
sudo apt install mysql-server  
  • Web 服务器‌:若需通过 Apache/Nginx 代理访问,需提前安装‌
sudo apt install apache2  

二、安装 Gerrit‌

1.下载 Gerrit WAR 包‌

从 Gerrit 官网 获取 .war 文件,例如 gerrit-3.8.0.war‌23。
注意:从Releases里找到历史版本,每个版本对Java版本有要求,下载符合你需要的版本即可,点击“Release notes for Gerrit3.11”进入里面可以下载
在这里插入图片描述

2‌. 初始化 Gerrit 站点目录‌

通过以下命令初始化 Gerrit 工作目录(如 /var/gerrit):

java -jar gerrit-3.8.0.war init -d /var/gerrit  

按照提示输入配置信息
关键配置项‌:‌

  • 数据库类型‌:选择 H2(测试)或 MySQL(生产)‌。‌
  • 仓库存储路径‌:默认 git,可按需修改(如 /var/gerrit/git)‌。
  • 认证方式‌:选择 HTTP 或 OpenID(推荐 LDAP/OAuth 集成)‌。
  • SMTP 服务‌:配置邮件通知(需提供 SMTP 服务器信息)‌。

3. 配置 Gerrit‌

如果初始化Gerrit的时候关键配置配错了,还可以修改 gerrit.config‌
文件路径:/var/gerrit/etc/gerrit.config
关键配置示例:
注意:auth的type使用HTTP,这样就能配合服务器上的Apache进行登录用户名和密码认证了

[gerrit]  basePath = git  canonicalWebUrl = http://localhost:8081  # 反向代理的访问地址‌
[database]  type = mysql  # 若使用 MySQL‌:ml-citation{ref="3,4" data="citationList"}  
[auth]  type = HTTP          # 使用 HTTP 认证,与 Apache/Nginx 配合实现认证‌,而非 OpenIDhttpHeader = Authorization  # 从 HTTP 头中读取认证信息emailFormat = {0}@example.com  # 可选:自动生成用户邮箱(替换为你的域名)
[httpd]listenUrl = proxy-http://localhost:8081/  # 确保与代理配置一致

4. 启动 Gerrit 服务

/var/gerrit是上面设置的gerrit站点目录

/var/gerrit/bin/gerrit.sh start 

三、Apache配置与访问‌

Web 服务器代理(以 Apache 为例)‌
上面的步骤启动gerrit后,没有用户名和密码就可以登录的。需要配置集成反向代理(Apache)

‌1、启用 Apache 模块‌

sudo a2enmod proxy proxy_http  
sudo systemctl restart apache2  

2. 配置 VirtualHost‌

示例配置(/etc/apache2/sites-available/gerrit.conf)

  • 配置 Apache 反向代理至 Gerrit 默认端口(8080):
    修改/etc/apache2/sites-enabled/000-default.conf文件
<VirtualHost *:80 >ProxyPass / http://localhost:8080/ProxyPassReverse / http://localhost:8080/ProxyRequests Off
</VirtualHost>  

可以使用appchectl -S 命令查看apache2的配置文件路径
在这里插入图片描述

  • 生成认证文件:htpasswd -c /path/to/htpasswd username
    • Gerrit 安装过程中,‌第一个通过认证的用户自动成为管理员
    • /path/to/htpasswd该路径和apache2下面的gerrt.conf配置里的AuthUserFile需要一样
# 正确方式:先创建文件(带 -c),后续追加用户(不带 -c)
htpasswd -c /path/to/user_passwd admin  # 首次创建
htpasswd /path/to/user_passwd user2    # 追加 user2
1)修改默认配置文件

如果不想使用默认的/etc/apache2/sites-enabled/000-default.conf文件
而是在/etc/apache2/sites-enabled/下面新增gerrit.conf配置文件

  • 启用站点
    仅创建 gerrit.conf 文件不会自动激活站点,需执行命令建立符号链接到 sites-enabled 目录
sudo a2ensite gerrit.conf  # 启用配置并生成软链接‌ 
  • 启用关键模块
    Gerrit 反向代理需依赖以下模块
sudo a2enmod proxy proxy_http rewrite  # 启用代理和重写模块‌
  • 重启apache2
sudo systemctl restart apache2 # 重启服务使新配置生效‌  
验证模块加载
apache2ctl -S
快速检查
sudo a2ensite gerrit.conf #启用站点  
sudo a2enmod proxy proxy_http #启用模块  
sudo apachectl configtest #检测配置文件中是否有语法错误(如拼写错误或指令冲突)‌
sudo systemctl restart apache2 # 重启服务  
curl -I http://localhost #验证响应状态  
防火墙设置

开放 Apache 监听端口(如 80/443)或关闭防火墙临时测试

sudo ufw allow 80  # 允许 HTTP 流量‌ 
2)修改监听端口

修改80端口为8088

  • 修改配置文件gerrit.conf
<VirtualHost *:8088>
  • 修改/etc/apache2/ports.conf
    监听端口匹配‌:确保 gerrit.conf 中的 <VirtualHost *:80> 与 ports.conf 中定义的端口一致‌
    新增一行Listen 8088,如果80不使用可以直接将80改成8088
Listen 8088
3) 配置模版

该配置只对login的路径即点击登录才会进行认证

<VirtualHost *:8080>ServerName 127.0.0.1ProxyRequests OffProxyPreserveHost OnProxyPass / http://localhost:8081/ProxyPassReverse / http://localhost:8081/<Location "/login/">AuthType BasicAuthName "Gerrit Code Review"AuthUserFile /home/gerrit/account/.htpasswdRequire valid-user</Location>
</VirtualHost>
  • 强制所有请求进行 Basic 认证
<VirtualHost *:8080>ServerName localhostProxyRequests OffProxyPreserveHost OnProxyPass / http://localhost:8081/ProxyPassReverse / http://localhost:8081/# 仅对根路径启用认证<Location "/">AuthType BasicAuthName "Gerrit Code Review"AuthUserFile /home/gerrit/account/.htpasswdRequire valid-user# 将认证信息传递给 GerritRequestHeader set Authorization "expr=%{HTTP:Authorization}"</Location>
</VirtualHost>

注意:Apache 的 RequestHeader 指令属于 ‌mod_headers 模块,所以需要开启该模块

sudo a2enmod headers  # 启用 headers 模块  

四、Gerrit code review页面配置

版本是3.9.9版本,2.x的老版本页面和这个不一样

1. 创建项目–只有管理员有权限

BROWSE->Respositories->CREATE NEW
在这里插入图片描述
填写仓库名等信息,如果需要创建子仓库(例如a仓库下有一个子仓库),那么子仓库名填写成a/b
注意:项目需要添加Create Reference‌权限 --见下面的3.1.1.2 Add permission选项
在这里插入图片描述

2、查看和拉取仓库

BROWSE->Respositories->Respositoreies->选择项目
在这里插入图片描述
General->Download->HTTP/SSH
终端输入命令就可以下载代码了

  • Clone
    标准的Clone操作仅克隆仓库的代码,不包含任何额外的配置或钩子。
  • Clone with commit-msg hook
    在克隆仓库的同时,还会安装一个commit-msg钩子,该钩子用于在提交信息不符合规范时阻止提交,适用于需要强制提交信息规范的团队或项目
    在这里插入图片描述
    HTTP和SSH下载代码都需要密钥,在设置里添加
    在这里插入图片描述
1) HTTP下载代码

HTTP Credentials-》GENERATE NEW PASSWORD
在这里插入图片描述
会自动生成密码,需要自己记住,web上不会显示该密码,忘记了就重新生成。
该密码在终端通过HTTP下载代码的时候会提示输入的
在这里插入图片描述

2) SSH下载代码
  • 需要在终端通过命令ssh-keygen 命令生成密钥
ssh-keygen -t rsa -b 4096 -C "user@mail.com"

注意:从 OpenSSH 8.2 开始,默认禁用了 RSA 密钥类型,主要是为了提高安全性。这可能意味着默认情况下不接受某些类型的 RSA 密钥。
解决:在/etc/ssh/ssh_config添加 PubkeyAcceptedAlgorithms +ssh-rsa
或者用ecdsa密钥类型

ssh-keygen -t ecdsa -b 521 -C "user@mail.com"
  • 将~/.ssh/id_ecdsa.pub的内容拷贝到该下面表单里
    然后点击ADD NEW SSH KEY
    在这里插入图片描述
    如果不添加SSH KEY,终端下载代码会报错
Permission denied (publickey).
fatal: 无法读取远程仓库。
请确认您有正确的访问权限并且仓库存在。

3、权限控制

3.1 禁止直接推送代码到仓库
1)限制直接推送至 refs/heads/master

找到Reference: refs/heads/*,将其下面的push配置设置为Deny。或者你可以选择只有管理员有权限,其他人没有权限
在这里插入图片描述

2)强制代码提交至评审分支 refs/for/master

找到Reference: refs/for/*,分配 Push 权限为 ‌Allow

3.1.1 不同引用(references)的区别
‌引用路径核心用途典型操作场景
refs/heads/*本地分支存储直接推送代码(需权限限制)
refs/tags/*版本标签存储标记稳定版本
refs/for/*Gerrit 代码评审触发路径提交代码至评审流程
refs/meta/config仓库权限与配置管理修改项目访问规则
refs/*全局引用匹配批量权限控制(如禁用匿名访问)
  1. 基础分支与标签引用‌
    • refs/heads/*‌

      • 用途‌:存储本地分支的指针,对应 git branch 创建的分支(如 refs/heads/master 表示 master 分支)‌。
      • 操作限制‌:直接推送至该路径会绕过代码评审(Gerrit 场景下需禁止此操作)
    • refs/tags/*‌

      • 用途‌:存储标签(如版本号 v1.0),通常用于标记稳定版本‌。
      • 操作特性‌:标签一般不可变(轻量标签或附注标签)‌
  2. Gerrit 代码评审专用引用
    • refs/for/*‌‌
      • 用途‌:Gerrit 强制代码评审的推送目标路径(如 git push HEAD:refs/for/master),提交后生成评审任务‌。
      • 格式简化‌:refs/for/master 等价于 refs/for/refs/heads/master,后者为完整路径但前者更常用‌。
    • refs/for/refs/*‌
      • 误解澄清‌:此路径非常规用法,Gerrit 中实际使用 refs/for/(如 refs/for/master)触发评审,无需额外嵌套 refs‌。
  3. 元数据与配置引用‌
    • refs/meta/config‌
      • 用途‌:存储仓库的权限配置(如 project.config 文件)、用户组规则等‌34。
      • 操作权限‌:仅管理员可修改,直接影响项目访问控制‌3。
    • refs/meta/version‌
      • 用途‌(推测):存储仓库元数据版本信息(如 Gerrit 插件或系统版本)。
  4. 通配符与全局引用‌
    • refs/*
      • 用途‌:匹配所有引用路径(如 refs/heads/、refs/tags/),常用于全局权限配置‌。
      • 权限示例‌:设置 refs/* 的 Read 权限可控制所有分支和标签的可见性‌
3.1.1.2 Add permission选项
  • Label Verified‌:此权限允许用户验证标签,确保标签的正确性和有效性。
  • Label Verified (On Behalf Of)‌:此权限允许用户代表其他人验证标签,这在团队协作中非常有用,特别是当某个成员无法自行验证时。‌
  • Label Code-Review‌:此权限允许用户进行代码审查,确保代码的质量和一致性。‌
  • Label Code-Review (On Behalf Of)‌:与“Label Verified (On Behalf Of)”类似,此权限允许用户代表其他人进行代码审查。‌
  • Abandon‌:此权限允许用户放弃某个版本或分支,这在需要撤销或忽略某些更改时非常有用。‌
  • Add Patch Set‌:此权限允许用户向现有的更改集中添加新的补丁集,以便进行进一步的修改和完善。
  • Create Reference‌:此权限允许用户创建新的引用,如分支或标签,这对于版本控制和代码管理至关重要。‌
  • Create Signed Tag‌:此权限允许用户创建签名标签,这有助于确保标签的真实性和完整性。‌
  • Create Annotated Tag‌:与签名标签类似,带注释标签提供了更多的上下文信息,此权限允许用户创建这样的标签。‌
  • Delete Reference‌:此权限允许用户删除分支或标签,这在清理不再需要的版本或标记时非常有用
  • Delete Changes‌:此权限允许用户删除他们自己的更改,这在需要撤销某些操作时非常有用。‌
  • Delete Own Changes‌:与“Delete Changes”类似,但此权限通常仅限于用户删除自己的更改,以确保不会意外删除他人的工作。‌
  • Edit Hashtags‌:此权限允许用户编辑哈希标签,这对于在代码库中进行更好的组织和搜索非常有用。‌
  • Edit Topic Name‌:此权限允许用户编辑主题名称,有助于在版本控制系统中更好地组织和跟踪更改。
  • Forge Author Identity‌:此权限允许用户以其他用户的身份提交代码,这在某些特殊情况下可能有用,但需要谨慎使用以避免混淆和安全问题。‌
  • Forge Committer Identity‌:与“Forge Author Identity”类似,此权限允许用户以其他提交者的身份进行提交。‌
  • Forge Server Identity‌:此权限允许用户以服务器的身份进行操作,这在某些自动化或管理任务中可能非常有用,但同样需要谨慎使用以避免安全问题。
  • Forge Server Identity‌:允许用户以服务器身份伪造提交者或作者信息,通常用于自动化脚本或镜像同步场景,需谨慎分配以避免安全风险‌。
  • Owner‌:表示用户对特定代码变更(Change)的所有权,拥有者可修改元数据、添加审查者或执行提交操作,通常与代码审查流程中的管理权限相关‌。
  • Push‌:允许用户将本地代码提交推送到远程仓库的分支,普通用户一般仅能推送到特定分支(如开发分支),管理员可能拥有更广泛的推送权限‌。
  • Push Merge Commit‌:控制用户是否允许推送合并提交(Merge Commit),需配合分支策略使用,防止因合并冲突导致历史混乱‌。
  • Rebase‌:授予用户对提交历史执行变基操作的权限,例如将本地分支的提交基于远程最新代码重组,需注意避免破坏他人工作‌。
  • Remove Reviewer‌:允许用户从代码审查流程中移除已添加的审查者,通常由变更所有者或管理员使用,以确保审查流程高效推进‌。
  • Revert Submit (On Behalf Of)‌:支持用户撤销已合并的提交(生成反向提交),或以他人身份执行撤销操作,适用于修复错误但需保留历史记录的场景‌。
  • Toggle Work In Progress State‌:允许用户将代码变更标记为“进行中”(WIP)或“完成”,用于控制变更是否可被合并,便于协作时区分任务状态‌。
  • View Private Changes‌:授予用户查看非公开变更(如标记为私有的代码审查)的权限,通常用于内部敏感项目或未公开功能开发

补充说明‌
权限粒度:Gerrit通过权限组(如refs/*)控制不同分支或路径的操作范围,例如限制Push仅作用于refs/heads/dev分支‌。
身份伪造风险:Forge Server Identity和Forge Committer Identity需严格审核,避免恶意用户伪造他人身份提交代码‌。
协作流程:Rebase和Push Merge Commit的权限分配应结合团队代码合并策略(如禁止快进合并)‌

3.2 添加code review和submit权限

在Reference: refs/heads/*下Add permission
- 分别添加Label Code-ReviewLabel VerifiedSubmit权限
- 每一项都可以Add Group添加成员组,谁有权限进行code review, verified,submit

Gerrit 默认要求变更(Change)需同时满足 Code-Review+2 和 Verified+1 标签才能显示提交按钮。若仅满足部分条件(如只有 Code-Review+2),则按钮不会显示‌

相关文章:

Ubuntu20.04搭建gerrit code review

一、环境准备 1. 安装 Java 环境‌ Gerrit 依赖 Java 运行环境&#xff08;推荐 JDK 8&#xff09;&#xff1a; sudo apt install openjdk-11-jdk 验证安装&#xff1a; java -version ‌2. 安装 Git sudo apt install git ‌3. 可选依赖 数据库‌&#xff1a;Gerrit …...

MacOS安装FFmpeg和FFprobe

按照网上很多教程安装&#xff0c;结果都失败了&#xff0c;后来才发现是路径问题&#xff0c;其实安装过程很简单&#xff08;无奈&#xff09; 第一步&#xff1a; 在官网下载 打开页面后&#xff0c;可以看到FFmpeg、FFprobe、FFplay和FFserver的下载图标 第二步&#xff1…...

Redis7系列:设置开机自启

前面的文章讲了Redis和Redis Stack的安装&#xff0c;随着服务器的重启&#xff0c;导致Redis 客户端无法连接。原来的是Redis没有配置开机自启。此文记录一下如何配置开机自启。 1、修改配置文件 前面的Redis和Redis Stack的安装的文章中已经讲了redis.config的配置&#xf…...

SpringAI介绍及本地模型使用方法

博客原文地址 前言 Spring在Java语言中一直稳居高位&#xff0c;与AI的洪流碰撞后也产生了一些有趣的”化学反应“&#xff0c;当然你要非要说碰撞属于物理反应也可以&#xff0c; 在经历了一系列复杂的反应方程后&#xff0c;Spring家族的新成员——SpringAI&#xff0c;就…...

Zookeeper实践指南

Zookeeper实践指南 1. 什么是 Zookeeper&#xff1f; Zookeeper 是 Apache 旗下的一个开源分布式协调框架&#xff0c;主要用于解决分布式系统中的一致性问题&#xff0c;提供高效可靠的分布式数据管理能力。 1.1 Zookeeper 的核心特性 顺序一致性&#xff1a;客户端的更新…...

Unity 基础知识总结(持续更新中...)

引擎基础 Unity有哪几个主要窗口&#xff1f; Scene窗口 用于场景搭建和UI界面拼接 Game窗口 游戏运行预览 Hierarchy窗口 查看和调整场景对象层级结构 Project窗口 游戏工程资源 Inspector创建 属性查看器&#xff0c;属性设置、脚本组件挂载 Unity提供了几种光源…...

IDEA接入阿里云百炼中免费的通义千问[2025版]

安装deepseek 上一篇文章IDEA安装deepseek最新教程2025中说明了怎么用idea安装codeGPT插件&#xff0c;并接入DeepSeek&#xff0c;无奈接入的官方api已经不能使用了&#xff0c;所以我们尝试从其他地方接入 阿里云百炼https://bailian.console.aliyun.com/ 阿里云百炼‌是阿…...

中级网络工程师面试题参考示例(1)

一、基础理论 1. OSI七层模型与TCP/IP四层模型的区别是什么&#xff1f;请举例说明第三层&#xff08;网络层&#xff09;和第四层&#xff08;传输层&#xff09;的核心协议。 参考答案&#xff1a; OSI七层模型分为物理层、数据链路层、网络层、传输层、会话层、表示层、应用…...

主流大语言模型中Token的生成过程本质是串行的

主流大语言模型中Token的生成过程本质是串行的 flyfish 1. 串行生成 自回归模型的核心逻辑&#xff1a; 大模型&#xff08;如GPT-2&#xff09;采用自回归架构&#xff0c;每个Token的生成必须基于已生成的完整历史序列。例如&#xff0c;生成“今天天气很好”时&#xff1a…...

3.03-3.09 Web3 游戏周报:Sunflower Land 周留存率 74.2%,谁是本周最稳链游?

回顾上周的区块链游戏概况&#xff0c;查看 Footprint Analytics 与 ABGA 最新发布的数据报告。 【3.03–3.09】Web3 游戏行业动态 Sui 背后开发公司 Mysten Labs 宣布收购游戏开发平台 ParasolYescoin 创始人因合伙人纠纷被警方带走&#xff0c;案件升级为刑事案件Animoca B…...

高级java每日一道面试题-2025年2月18日-数据库篇-MySQL 如何做到高可用方案?

如果有遗漏,评论区告诉我进行补充 面试官: MySQL 如何做到高可用方案? 我回答: 在Java高级面试中&#xff0c;讨论MySQL如何实现高可用性方案是一个重要话题。这不仅涉及到数据库的稳定性和可靠性&#xff0c;还关系到系统的整体性能和用户体验。以下是结合提供的信息进行综…...

【编程题】7-5 堆中的路径

7-5 堆中的路径 1 题目原文2 思路解析3 代码实现 1 题目原文 题目链接&#xff1a;7-5 堆中的路径 将一系列给定数字插入一个初始为空的最小堆 h h h。随后对任意给定的下标 i i i&#xff0c;打印从第 i i i 个结点到根结点的路径。 输入格式: 每组测试第 1 1 1 行包含 …...

Scala 中的访问修饰符

在Scala中&#xff0c;面向对象的权限控制主要通过访问修饰符来实现。Scala提供了以下几种访问修饰符来控制类、对象、成员变量和方法的访问权限&#xff1a; 1. 默认访问权限&#xff08;无修饰符&#xff09; 如果没有指定任何访问修饰符&#xff0c;成员默认是public的&…...

flask_restx 定义任意类型参数

之前定义的content只是string&#xff0c;现在需要支持即可以string也可以list from flask_restx import fieldsclass Messages:def get_model(api):return api.model("Message",{"role": fields.String(requiredTrue, description"The role of messa…...

Unity3D网格简化与LOD技术详解

前言 在Unity3D游戏开发中&#xff0c;网格简化&#xff08;Mesh Simplification&#xff09;和细节层次&#xff08;Level of Detail, LOD&#xff09;技术是优化渲染性能的关键手段&#xff0c;尤其在处理复杂场景和高精度模型时至关重要。这两种技术通过减少模型的几何复杂…...

爬取数据时如何处理可能出现的异常?

在爬取数据时&#xff0c;处理可能出现的异常是确保爬虫稳定运行的关键。以下是一些常见的异常处理策略和具体实现方法&#xff0c;这些方法可以帮助你在爬虫开发中更有效地应对各种问题。 1. 使用 try-catch 块捕获异常 在PHP中&#xff0c;try-catch 块是处理异常的基本工具…...

TCP/IP原理详细解析

前言 TCP/IP是一种面向连接&#xff0c;可靠的传输&#xff0c;传输数据大小无限制的。通常情况下&#xff0c;系统与系统之间的http连接需要三次握手和四次挥手&#xff0c;这个执行过程会产生等待时间。这方面在日常开发时需要注意一下。 TCP/IP 是互联网的核心协议族&…...

MPPT与PWM充电原理及区别详解

MPPT&#xff08;最大功率点跟踪&#xff09;和PWM&#xff08;脉宽调制&#xff09;是太阳能充电控制器中常用的两种技术&#xff0c;它们在原理、效率和适用场景上有显著区别。以下是两者的详细对比&#xff1a; 1. 工作原理 PWM&#xff08;脉宽调制&#xff09; 核心机制…...

数据量过大的时候导出数据很慢

原因解析 速度慢无非两个原因: sql取数很慢程序很慢 sql很慢有3种原因: sql本身查询不合理,需要优化数据库没有索引多次频繁访问数据,造成了不必要的开销 取消多次获取数据,一次获取 框定一个大致的范围,获取此次查询的所有数据使用map设置数据,没有主键使用傅和主键拼接数据 /…...

NVIDIA k8s-device-plugin源码分析与安装部署

在《kubernetes Device Plugin原理与源码分析》一文中&#xff0c;我们从源码层面了解了kubelet侧关于device plugin逻辑的实现逻辑&#xff0c;本文以nvidia管理GPU的开源github项目k8s-device-plugin为例&#xff0c;来看看设备插件侧的实现示例。 一、Kubernetes Device Pl…...

langChainv0.3学习笔记(初级篇)

LangChain自0.1版本发布以来&#xff0c;已经历了显著的进化&#xff0c;特别是向AI时代的适应性提升。在0.1版本中&#xff0c;LangChain主要聚焦于提供基本的链式操作和工具集成&#xff0c;帮助开发者构建简单的语言模型应用。该版本适用于处理简单任务&#xff0c;但在应对…...

聚焦两会:科技与发展并进,赛逸展2025成创新新舞台

在十四届全国人大三次会议和全国政协十四届三次会议期间&#xff0c;代表委员们围绕多个关键议题展开深入讨论&#xff0c;为国家未来发展谋篇布局。其中&#xff0c;技术竞争加剧与经济转型需求成为两会焦点&#xff0c;将在首都北京举办的2025第七届亚洲消费电子技术贸易展&a…...

Xilinx ZYNQ FSBL解读:LoadBootImage()

篇首 最近突发奇想&#xff0c;Xilinx 的集成开发环境已经很好了&#xff0c;很多必要的代码都直接生成了&#xff0c;这给开发者带来了巨大便利的同时&#xff0c;也让人错过了很多代码的精彩&#xff0c;可能有很多人用了很多年了&#xff0c;都还无法清楚的理解其中过程。博…...

flutter的HTTP headers用法介绍

flutter的HTTP headers用法介绍 在 Flutter 中&#xff0c;HTTP headers 是用于在发送 HTTP 请求时传递额外信息的关键部分。它们可以用于身份验证、缓存控制、内容类型声明等。以下是关于 Flutter 中 HTTP headers 的详细说明和用法。 1. 什么是 HTTP Headers&#xff1f; H…...

Flutter开发避坑指南:高频问题排查与性能调优实战

目录 一、使用中常见问题 1.环境与配置问题 2.Widget 重建与状态管理 3.布局与绘制问题 4.动画与卡顿&#xff08;Jank&#xff09;问题 5.平台相关问题 二、Flutter实战14问 1.如何使用 Flutter 进行多语言支持&#xff1f; 1. 添加依赖 2. 配置 Material App 3. 创…...

Uniapp实现地图获取定位功能

摘要&#xff1a;本文将手把手教你如何在Uniapp项目中集成地图功能、实现定位获取&#xff0c;并解决微信小程序、APP、H5三端的兼容性问题&#x1f680;&#x1f680;&#x1f680; 一、环境准备 地图平台选择 微信小程序&#xff1a;腾讯地图&#xff08;强制使用&#xff09…...

Ubuntu 24.04 安装与配置 JetBrains Toolbox 指南

&#x1f4cc; 1. JetBrains Toolbox 介绍 JetBrains Toolbox 是 JetBrains 开发的工具管理器&#xff0c;可用于安装、更新和管理 IntelliJ IDEA、PyCharm、WebStorm、CLion 等。本指南记录了 JetBrains Toolbox 在 Ubuntu 24.04 上的 安装、路径调整、权限管理 及 遇到的问题…...

【AI】神经网络|机器学习——图解Transformer(完整版)

Transformer是一种基于注意力机制的序列模型,最初由Google的研究团队提出并应用于机器翻译任务。与传统的循环神经网络(RNN)和卷积神经网络(CNN)不同,Transformer仅使用自注意力机制(self-attention)来处理输入序列和输出序列,因此可以并行计算,极大地提高了计算效率…...

【VUE2】第二期——生命周期及工程化

目录 1 生命周期 1.1 介绍 1.2 钩子 2 可视化图表库 3 脚手架Vue CLI 3.1 使用步骤 3.2 项目目录介绍 3.3 main.js入口文件代码介绍 4 组件化开发 4.1 组件 4.2 普通组件注册 4.2.1 局部注册 4.2.2 全局注册 1 生命周期 1.1 介绍 Vue生命周期&#xff1a;就是…...

贪心算法三

> 作者&#xff1a;დ旧言~ > 座右铭&#xff1a;松树千年终是朽&#xff0c;槿花一日自为荣。 > 目标&#xff1a;了解什么是贪心算法&#xff0c;并且掌握贪心算法。 > 毒鸡汤&#xff1a;有些事情&#xff0c;总是不明白&#xff0c;所以我不会坚持。早安! >…...