From bd8131dda3b3b9a7453ce65f0ae08bce1999ef85 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=B8=AD=E9=B8=AD=E3=80=8C=E3=82=AB=E3=83=A2=E3=80=8D?= Date: Mon, 22 Jul 2024 18:40:34 +0800 Subject: [PATCH 1/4] =?UTF-8?q?docs:=20=E7=BB=9F=E4=B8=80=E5=B7=B2?= =?UTF-8?q?=E7=9F=A5=E9=97=AE=E9=A2=98=E9=93=BE=E6=8E=A5=20(#27)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 3 +-- README_DEV.md | 3 +-- USER_HANDBOOK.md | 3 +-- 3 files changed, 3 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 03b0867..257d2b4 100644 --- a/README.md +++ b/README.md @@ -244,5 +244,4 @@ $ python 中文git.py 推送 ## 已知问题 -以下是 中文Git 目前的已知问题: -* 在使用 中文Git 执行部分命令时不会有输出,但命令成功执行 +请见[Issues页](https://github.com/DuckDuckStudio/Chinese_git/issues)。 diff --git a/README_DEV.md b/README_DEV.md index bed6a2d..32ff100 100644 --- a/README_DEV.md +++ b/README_DEV.md @@ -247,5 +247,4 @@ $ python 中文git.py 推送 ## 已知问题 -以下是 中文Git 目前的已知问题: -* 在使用 中文Git 执行部分命令时不会有输出,但命令成功执行 +请见[Issues页](https://github.com/DuckDuckStudio/Chinese_git/issues)。 diff --git a/USER_HANDBOOK.md b/USER_HANDBOOK.md index e25d5bd..b6f0074 100644 --- a/USER_HANDBOOK.md +++ b/USER_HANDBOOK.md @@ -237,8 +237,7 @@ pip install -r requirements.txt ## 已知问题 -以下是 中文Git 目前的已知问题: -* 在使用 中文Git 执行部分命令时不会有输出,但命令成功执行 +请见[Issues页](https://github.com/DuckDuckStudio/Chinese_git/issues)。 ## 关于编码 中文Git 的所有项目文件源码以及发行版文件均使用 UTF-8 编码,如出现乱码请使用 UTF-8 编码而非简体中文系统默认的 GBK 编码。 From 317ebf167affdd6a55e9bf30bc1d5cf9df15f660 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=B8=AD=E9=B8=AD=E3=80=8C=E3=82=AB=E3=83=A2=E3=80=8D?= Date: Mon, 22 Jul 2024 21:22:53 +0800 Subject: [PATCH 2/4] =?UTF-8?q?fix:=20=E4=BF=AE=E6=AD=A3=E9=85=8D=E7=BD=AE?= =?UTF-8?q?=E6=96=87=E4=BB=B6=E4=B8=AD=E7=9A=84=E4=B8=80=E4=BA=9B=E9=94=99?= =?UTF-8?q?=E8=AF=AF?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- config.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/config.json b/config.json index d111298..cc7fdac 100644 --- a/config.json +++ b/config.json @@ -2,12 +2,12 @@ "application": { "notice": { "time": "", - "leve": "", + "level": "", "content": "" }, "run": { "auto_check_update": "True", - "auto_get_notice": "Ture" + "auto_get_notice": "True" } } } From 43fe1869222edde23c9a486ce7b0a8693a8d44bb Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E9=B8=AD=E9=B8=AD=E3=80=8C=E3=82=AB=E3=83=A2=E3=80=8D?= Date: Tue, 23 Jul 2024 23:45:25 +0800 Subject: [PATCH 3/4] =?UTF-8?q?Fix:=20=E4=BF=AE=E5=A4=8D=E4=B8=8D=E6=9B=B4?= =?UTF-8?q?=E6=96=B0=E9=85=8D=E7=BD=AE=E6=96=87=E4=BB=B6=E7=9A=84=E9=97=AE?= =?UTF-8?q?=E9=A2=98=20(#32)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * fix: 暂时解决缺失配置文件的问题 [BUG] 使用`中文git 更新`命令从低于v2.8的版本更新到更新版本时会出现错误 #22 * feat: 自动更新json配置 测试中... [BUG] 使用`中文git 更新`命令从低版本更新到v2.8时会出现错误 #22 * remove: 移除测试代码 Issue [BUG] 使用`中文git 更新`命令从低版本更新到v2.8时会出现错误 #22 * sync: 同步更新打包版程序 * fix: 修复当已有配置文件无法读取时程序崩溃的问题 🎁 应用建议 Co-authored-by: Luna-Grace <842551475@qq.com> --- ABOUT_TRANSLATION.md | 2 +- CONTRIBUTING.md | 3 +- config.json | 3 + "\344\270\255\346\226\207git-pack.py" | 124 ++++++++++++++++++++++++-- "\344\270\255\346\226\207git.exe" | Bin 8178347 -> 8180887 bytes "\344\270\255\346\226\207git.py" | 122 +++++++++++++++++++++++-- 6 files changed, 233 insertions(+), 21 deletions(-) diff --git a/ABOUT_TRANSLATION.md b/ABOUT_TRANSLATION.md index 034b00e..9d287a9 100644 --- a/ABOUT_TRANSLATION.md +++ b/ABOUT_TRANSLATION.md @@ -3,5 +3,5 @@ 目前已有的翻译 | 语言 | 翻译者 | 完整度 | 版本 | README | README_DEV | USER_HANDBOOK | Chinese_git | Chinese_git-pack | |-----|-----|-----|-----|-----|-----|-----|-----|-----| -| 简体中文 | 官方语言 | 100% | v2.8 | ✓ | ✓ | ✓ | ✓ | ✓ | +| 简体中文 | 官方语言 | 100% | v2.9 | ✓ | ✓ | ✓ | ✓ | ✓ | | 繁體中文 | 官方翻译 | 40% | v1.5 | ✕ | ✕ | ✕ | ✓ | ✓ | diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 7c973f4..f9cc576 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -104,5 +104,4 @@ python -m nuitka --output-dir=. --show-progress --windows-icon-from-ico=ico.ico ## 已知问题 -以下是 中文Git 目前的已知问题: -* 在使用 中文Git 执行部分命令时不会有输出,但命令成功执行 \ No newline at end of file +请见[Issues页](https://github.com/DuckDuckStudio/Chinese_git/issues)。 diff --git a/config.json b/config.json index cc7fdac..d7be6c5 100644 --- a/config.json +++ b/config.json @@ -1,4 +1,7 @@ { + "information": { + "version": "v2.9" + }, "application": { "notice": { "time": "", diff --git "a/\344\270\255\346\226\207git-pack.py" "b/\344\270\255\346\226\207git-pack.py" index e2ff019..5a69833 100644 --- "a/\344\270\255\346\226\207git-pack.py" +++ "b/\344\270\255\346\226\207git-pack.py" @@ -11,14 +11,116 @@ # ---------- 版本定义及更新 ---------- # 定义版本号 -VERSION = 'v2.8-pack' +VERSION = 'v2.9-pack' # --- 读取配置文件 --- +def fetch_json(): + config_url = "https://duckduckstudio.github.io/yazicbs.github.io/Tools/chinese_git/files/json/config.json" + headers = { + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36' + } + try: + response = requests.get(config_url, headers=headers) + if response.status_code == 200: + json_data = response.json() + print(f"{Fore.GREEN}✓{Fore.RESET} 获取最新默认配置文件成功") + return json_data + else: + print(f"{Fore.RED}✕{Fore.RESET} 无法获取最新默认配置文件\n{Fore.BLUE}[!]{Fore.RESET} 返回状态码: {Fore.YELLOW}{response.status_code}{Fore.RESET}") + return None + except Exception as e: + print(f"{Fore.RED}✕{Fore.RESET} 尝试获取最新默认配置文件失败,错误: {Fore.RED}{e}{Fore.RESET}") + return None + +def merge_json(old_json, new_json): + # 合并两个 JSON 对象 + updated_json = old_json.copy() + + # 处理旧 JSON 中的键 + keys_to_remove = [] + for key in updated_json: + if key not in new_json: + keys_to_remove.append(key) + + for key in keys_to_remove: + del updated_json[key] + + # 合并新 JSON 中的值 + for key in new_json: + if key in updated_json and isinstance(updated_json[key], dict) and isinstance(new_json[key], dict): + # 如果是字典类型,递归合并 + updated_json[key] = merge_json(updated_json[key], new_json[key]) + else: + # 直接更新值 + updated_json[key] = new_json[key] + + return updated_json + +def update_json(): + new_json = fetch_json() + if not new_json: + return 1 + try: + with open(config_file, 'r') as f: + old_json = json.load(f) + + updated_json = merge_json(old_json, new_json) + + # 将更新后的配置写入文件 + with open(config_file, 'w') as f: + json.dump(updated_json, f, indent=4) + + print(f"{Fore.GREEN}✓{Fore.RESET} 默认配置文件更新成功") + return 0 + except Exception as e: + print(f"{Fore.RED}✕{Fore.RESET} 更新配置文件时出错:\n{Fore.RED}{e}{Fore.RESET}") + return 1 + config_file = os.path.join(os.path.dirname(os.path.abspath(sys.argv[0])), "config.json") -with open(config_file, 'r') as file: - config_data = json.load(file) -auto_check_update = config_data['application']['run']['auto_check_update'] -auto_get_notice = config_data['application']['run']['auto_get_notice'] +if os.path.exists(config_file): + try: + with open(config_file, 'r') as file: + config_data = json.load(file) + auto_check_update = config_data['application']['run']['auto_check_update'] + auto_get_notice = config_data['application']['run']['auto_get_notice'] + except Exception as e: + auto_check_update = True + auto_get_notice = True + print(f"{Fore.RED}✕{Fore.RESET} 读取配置文件时出错:\n{Fore.RED}{e}{Fore.RESET}\n{Fore.BLUE}[!]{Fore.RESET} 请检查配置文件是否正确,您可以先删除配置文件然后运行任意中文git的命令来重新生成默认配置文件。") +else: + # 没有配置文件就默认都要 + auto_check_update = True + auto_get_notice = True + print(f"{Fore.YELLOW}⚠{Fore.RESET} 您的中文Git的安装目录下似乎{Fore.YELLOW}缺少配置文件{Fore.RESET},程序将尝试自动生成默认配置文件!") + try: + # 生成一个默认配置文件 + # 将数据结构转换为 JSON 格式的字符串 + json_str = { + "information": { + "version": "v2.9" + }, + "application": { + "notice": { + "time": "", + "level": "", + "content": "" + }, + "run": { + "auto_check_update": "True", + "auto_get_notice": "True" + } + } + } + + json_str = json.dumps(json_str, indent=4) # indent 参数用于设置缩进(4空) + + # 将 JSON 字符串写入文件 + with open(config_file, 'w') as f: + f.write(json_str) + print(f"{Fore.GREEN}✓{Fore.RESET} 默认配置文件生成成功") + except Exception as e: + print(f"{Fore.RED}✕{Fore.RESET} 默认配置文件生成失败!请{Fore.YELLOW}手动添加{Fore.RESET}配置文件,否则将无法运行一些功能!") + print(f"{Fore.BLUE}[!]{Fore.RESET} 如果你觉得这不应该可以提交Issue") # ------------------- def always_check():# 每次执行命令都要检查的 @@ -65,13 +167,17 @@ def auto_update(): # 询问用户是否安装更新 choice = input(f"{Fore.BLUE}?{Fore.RESET} 是否要安装此更新? (是/否): ").lower() if choice in ['是','y','yes']: + print(f"{Fore.BLUE}[!]{Fore.RESET} 正在更新配置文件...") + if update_json() == 1: + print(f"{Fore.YELLOW}⚠{Fore.RESET} 请手动更新配置文件并提交issue") + return print(f"{Fore.BLUE}[!]{Fore.RESET} 正在尝试更新更新程序...") new_filename = download_update_file(new_version) if new_filename: replace_current_program(new_filename) else: return - print(f"{Fore.BLUE}[!]{Fore.RESET} 检测到您使用的是打包版,请前往新窗口继续...") + print(f"{Fore.BLUE}[!]{Fore.RESET} 由于您使用的是打包版,请前往新窗口继续...") print(f"{Fore.BLUE}[!]{Fore.RESET} 正在启动更新程序...") try: os.system(f"start {script_path}\\中文git更新程序.exe --version {new_version}") @@ -164,9 +270,9 @@ def read_previous_notice(): with open(previous_notice_file, 'r') as file: return file.read() except FileNotFoundError: - return "" + return None except Exception: - return "" # 以防出现像 microsoft/winget-pkgs #156224 中的错误 + return None # 以防出现像 microsoft/winget-pkgs #156224 中的错误 def display_notice(manual=False): if manual == True: @@ -176,7 +282,7 @@ def display_notice(manual=False): if manual == "本地": content = read_previous_notice() - if content == "": + if not content: print(f"{Fore.RED}✕{Fore.RESET} 没有本地公告") return else: diff --git "a/\344\270\255\346\226\207git.exe" "b/\344\270\255\346\226\207git.exe" index 799cd95c8f5f59c6c4ff55bc30234bcba31bb0e8..e5b5bd062b17a87e83e6ca94af225138b25950b7 100644 GIT binary patch delta 14574 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 Gk^LXNX+{tL diff --git "a/\344\270\255\346\226\207git.py" "b/\344\270\255\346\226\207git.py" index 3838ab1..99876a0 100644 --- "a/\344\270\255\346\226\207git.py" +++ "b/\344\270\255\346\226\207git.py" @@ -1,6 +1,6 @@ import os import sys -import json +import json # 没配置文件也可以import json import requests import subprocess from colorama import init, Fore @@ -11,16 +11,118 @@ # ---------- 版本定义及更新 ---------- # 定义版本号 -VERSION = 'v2.8' +VERSION = 'v2.9' # GitHub releases API URL url = 'https://api.github.com/repos/DuckDuckStudio/Chinese_git/releases/latest' # --- 读取配置文件 --- +def fetch_json(): + config_url = "https://duckduckstudio.github.io/yazicbs.github.io/Tools/chinese_git/files/json/config.json" + headers = { + 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4472.124 Safari/537.36' + } + try: + response = requests.get(config_url, headers=headers) + if response.status_code == 200: + json_data = response.json() + print(f"{Fore.GREEN}✓{Fore.RESET} 获取最新默认配置文件成功") + return json_data + else: + print(f"{Fore.RED}✕{Fore.RESET} 无法获取最新默认配置文件\n{Fore.BLUE}[!]{Fore.RESET} 返回状态码: {Fore.YELLOW}{response.status_code}{Fore.RESET}") + return None + except Exception as e: + print(f"{Fore.RED}✕{Fore.RESET} 尝试获取最新默认配置文件失败,错误: {Fore.RED}{e}{Fore.RESET}") + return None + +def merge_json(old_json, new_json): + # 合并两个 JSON 对象 + updated_json = old_json.copy() + + # 处理旧 JSON 中的键 + keys_to_remove = [] + for key in updated_json: + if key not in new_json: + keys_to_remove.append(key) + + for key in keys_to_remove: + del updated_json[key] + + # 合并新 JSON 中的值 + for key in new_json: + if key in updated_json and isinstance(updated_json[key], dict) and isinstance(new_json[key], dict): + # 如果是字典类型,递归合并 + updated_json[key] = merge_json(updated_json[key], new_json[key]) + else: + # 直接更新值 + updated_json[key] = new_json[key] + + return updated_json + +def update_json(): + new_json = fetch_json() + if not new_json: + return 1 + try: + with open(config_file, 'r') as f: + old_json = json.load(f) + + updated_json = merge_json(old_json, new_json) + + # 将更新后的配置写入文件 + with open(config_file, 'w') as f: + json.dump(updated_json, f, indent=4) + + print(f"{Fore.GREEN}✓{Fore.RESET} 默认配置文件更新成功") + return 0 + except Exception as e: + print(f"{Fore.RED}✕{Fore.RESET} 更新配置文件时出错:\n{Fore.RED}{e}{Fore.RESET}") + return 1 + config_file = os.path.join(os.path.dirname(os.path.abspath(sys.argv[0])), "config.json") -with open(config_file, 'r') as file: - config_data = json.load(file) -auto_check_update = config_data['application']['run']['auto_check_update'] -auto_get_notice = config_data['application']['run']['auto_get_notice'] +if os.path.exists(config_file): + try: + with open(config_file, 'r') as file: + config_data = json.load(file) + auto_check_update = config_data['application']['run']['auto_check_update'] + auto_get_notice = config_data['application']['run']['auto_get_notice'] + except Exception as e: + auto_check_update = True + auto_get_notice = True + print(f"{Fore.RED}✕{Fore.RESET} 读取配置文件时出错:\n{Fore.RED}{e}{Fore.RESET}\n{Fore.BLUE}[!]{Fore.RESET} 请检查配置文件是否正确,您可以先删除配置文件然后运行任意中文git的命令来重新生成默认配置文件。") +else: + # 没有配置文件就默认都要 + auto_check_update = True + auto_get_notice = True + print(f"{Fore.YELLOW}⚠{Fore.RESET} 您的中文Git的安装目录下似乎{Fore.YELLOW}缺少配置文件{Fore.RESET},程序将尝试自动生成默认配置文件!") + try: + # 生成一个默认配置文件 + # 将数据结构转换为 JSON 格式的字符串 + json_str = { + "information": { + "version": "v2.9" + }, + "application": { + "notice": { + "time": "", + "level": "", + "content": "" + }, + "run": { + "auto_check_update": "True", + "auto_get_notice": "True" + } + } + } + + json_str = json.dumps(json_str, indent=4) # indent 参数用于设置缩进(4空) + + # 将 JSON 字符串写入文件 + with open(config_file, 'w') as f: + f.write(json_str) + print(f"{Fore.GREEN}✓{Fore.RESET} 默认配置文件生成成功") + except Exception as e: + print(f"{Fore.RED}✕{Fore.RESET} 默认配置文件生成失败!请{Fore.YELLOW}手动添加{Fore.RESET}配置文件,否则将无法运行一些功能!") + print(f"{Fore.BLUE}[!]{Fore.RESET} 如果你觉得这不应该可以提交Issue") # ------------------- def always_check():# 每次执行命令都要检查的 @@ -58,8 +160,8 @@ def check_for_updates(): def download_update_file(version): # 根据版本确定下载 URL download_url = f'https://github.com/DuckDuckStudio/Chinese_git/releases/download/{version}/Chinese_git.py' - spare_download_url = f'https://duckduckstudio.github.io/yazicbs.github.io/Tools/chinese_git/Spare-Download/Chinese_git.py' - spare_download_version_url = f'https://duckduckstudio.github.io/yazicbs.github.io/Tools/chinese_git/Spare-Download/info.json' + spare_download_url = 'https://duckduckstudio.github.io/yazicbs.github.io/Tools/chinese_git/Spare-Download/Chinese_git.py' + spare_download_version_url = 'https://duckduckstudio.github.io/yazicbs.github.io/Tools/chinese_git/Spare-Download/info.json' try: response = requests.get(download_url) @@ -82,7 +184,7 @@ def download_update_file(version): data = spare_download_version.json() spare_download_version = data['version']# 获取备用路线的程序的版本号 except Exception as e: - print(f"{Fore.RED}✕{Fore.RESET} 获取备用路线版本信息时出错: {e}") + print(f"{Fore.RED}✕{Fore.RESET} 获取备用路线版本信息时出错: {Fore.RED}{e}{Fore.RESET}") return None if spare_download_version == version: try: @@ -108,6 +210,8 @@ def replace_current_program(new_filename): try: # 用下载的文件替换当前程序 os.replace(new_filename, sys.argv[0]) + if update_json() == 1: + print(f"{Fore.YELLOW}⚠{Fore.RESET} 请手动更新配置文件并提交issue") print(f"{Fore.GREEN}✓{Fore.RESET} 程序已成功更新。") except Exception as e: print(f"{Fore.RED}✕{Fore.RESET} 替换当前程序时出错: {e}") From 1e9ecdf08917dd8e4c2f16d26771014a835e23ef Mon Sep 17 00:00:00 2001 From: Luna Grace <106975825+Luna-Grace@users.noreply.github.com> Date: Wed, 24 Jul 2024 11:16:34 +0800 Subject: [PATCH 4/4] =?UTF-8?q?docs:=20=E6=9B=B4=E6=96=B0=E6=94=AF?= =?UTF-8?q?=E6=8C=81winget=E7=9A=84=E7=89=88=E6=9C=AC=20(#23)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 5 +---- README_DEV.md | 5 +---- USER_HANDBOOK.md | 5 +---- 3 files changed, 3 insertions(+), 12 deletions(-) diff --git a/README.md b/README.md index 257d2b4..bbe0bfd 100644 --- a/README.md +++ b/README.md @@ -6,9 +6,6 @@ 项目网站:[[点我前往]](https://duckduckstudio.github.io/yazicbs.github.io/Tools/chinese_git/) -> [!TIP] -> 你可以使用 _winget_ 来安装中文Git了!!! - 你还在为忘记 git 的命令而发愁吗? 你还要每次执行 git 命令都要去搜索吗? 机会来了!使用中文Git,这些统统不是问题! @@ -38,7 +35,7 @@ winget install DuckStudio.ChineseGit ![1718315176839](https://duckduckstudio.github.io/Chinese_git/image/README/1718315176839.png) > [!TIP] -> 设支持的版本号为n,则 $2.4 \leqslant n \leqslant 2.7$ +> 设支持的版本号为n,则 $2.4 \leqslant n \leqslant 2.8(Pre-release)$ ## 项目依赖 在使用 中文Git 前,请确保你有以下依赖,否则 中文Git 将变成废物。 diff --git a/README_DEV.md b/README_DEV.md index 32ff100..5b026d1 100644 --- a/README_DEV.md +++ b/README_DEV.md @@ -8,9 +8,6 @@ > 想要贡献更新这些文档以及中文Git项目?请查看[CONTRIBUTING](https://github.com/DuckDuckStudio/Chinese_git/blob/main/CONTRIBUTING.md)文件。感谢您的支持!您的支持是我们持续维护的动力! > 项目遵循 GPL-2.0 许可协议。 -> [!TIP] -> 你可以使用 _winget_ 来安装中文Git了!!! - ## 项目介绍 中文Git是一个简单的工具,旨在使不熟悉英文的用户更轻松地使用Git。 @@ -33,7 +30,7 @@ winget install DuckStudio.ChineseGit > 使用 _winget_ 获取的不用配置Python。 > [!TIP] -> 设支持的版本号为n,则 $2.4 \leqslant n \leqslant 2.7$ +> 设支持的版本号为n,则 $2.4 \leqslant n \leqslant 2.8(Pre-release)$ ## 项目依赖 diff --git a/USER_HANDBOOK.md b/USER_HANDBOOK.md index b6f0074..825c0ae 100644 --- a/USER_HANDBOOK.md +++ b/USER_HANDBOOK.md @@ -4,9 +4,6 @@ 项目网站:[[点我前往]](https://duckduckstudio.github.io/yazicbs.github.io/Tools/chinese_git/) -> [!TIP] -> 你可以使用 _winget_ 来安装中文Git了!!! - 这是 中文Git 的用户手册,你可以在这里找到一些关于 中文Git 的使用方法。 ## 如何获取 @@ -26,7 +23,7 @@ winget install DuckStudio.ChineseGit > 使用 _winget_ 获取的不用配置Python。 > [!TIP] -> 设支持的版本号为n,则 $2.4 \leqslant n \leqslant 2.7$ +> 设支持的版本号为n,则 $2.4 \leqslant n \leqslant 2.8(Pre-release)$ ## 依赖