From 20b676e4e0e365ca4c0e30a2237213bbbfef2c3e Mon Sep 17 00:00:00 2001 From: minecraft1024a Date: Wed, 13 Aug 2025 12:47:09 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E4=BE=9D=E8=B5=96=E7=AE=A1?= =?UTF-8?q?=E7=90=86=E9=85=8D=E7=BD=AE=EF=BC=8C=E6=96=B0=E5=A2=9E=E4=BD=BF?= =?UTF-8?q?=E7=94=A8PyPI=E9=95=9C=E5=83=8F=E6=BA=90=E7=9A=84=E9=80=89?= =?UTF-8?q?=E9=A1=B9=E4=BB=A5=E5=8A=A0=E9=80=9F=E5=8C=85=E4=B8=8B=E8=BD=BD?= =?UTF-8?q?=EF=BC=8C=E4=BC=98=E5=8C=96=E6=96=87=E6=A1=A3=E4=BB=A5=E6=B8=85?= =?UTF-8?q?=E6=99=B0=E6=8F=8F=E8=BF=B0=E9=95=9C=E5=83=8F=E6=BA=90=E5=92=8C?= =?UTF-8?q?=E4=BB=A3=E7=90=86=E8=AE=BE=E7=BD=AE=EF=BC=8C=E8=B0=83=E6=95=B4?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=E4=BB=A3=E7=A0=81=E4=BB=A5=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E6=96=B0=E7=9A=84=E9=85=8D=E7=BD=AE=E9=A1=B9=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/plugins/dependency-management.md | 70 +++++++++++++++---- src/config/official_configs.py | 10 ++- src/plugin_system/utils/dependency_config.py | 20 +++++- src/plugin_system/utils/dependency_manager.py | 24 +++++-- template/bot_config_template.toml | 8 ++- 5 files changed, 107 insertions(+), 25 deletions(-) diff --git a/docs/plugins/dependency-management.md b/docs/plugins/dependency-management.md index 2f07d8821..ada951db7 100644 --- a/docs/plugins/dependency-management.md +++ b/docs/plugins/dependency-management.md @@ -75,7 +75,11 @@ auto_install = true # 安装超时时间(秒) auto_install_timeout = 300 -# 是否使用代理 +# 是否使用PyPI镜像源(推荐,可加速下载) +use_mirror = true +mirror_url = "https://pypi.tuna.tsinghua.edu.cn/simple" + +# 是否使用网络代理(高级选项) use_proxy = false proxy_url = "" @@ -92,18 +96,44 @@ prompt_before_install = false install_log_level = "INFO" ``` -## 代理配置 +## PyPI镜像源配置(推荐) -如果需要通过代理安装包,可以配置: +使用PyPI镜像源可以显著加速包的下载,特别是在中国大陆地区: + +```toml +[dependency_management] +use_mirror = true +mirror_url = "https://pypi.tuna.tsinghua.edu.cn/simple" # 清华大学镜像源 +``` + +### 常用的国内镜像源 + +```toml +# 清华大学镜像源(推荐) +mirror_url = "https://pypi.tuna.tsinghua.edu.cn/simple" + +# 阿里云镜像源 +mirror_url = "https://mirrors.aliyun.com/pypi/simple" + +# 中科大镜像源 +mirror_url = "https://pypi.mirrors.ustc.edu.cn/simple" + +# 豆瓣镜像源 +mirror_url = "https://pypi.douban.com/simple" +``` + +## 网络代理配置(高级选项) + +如果需要通过网络代理安装包,可以配置: ```toml [dependency_management] use_proxy = true proxy_url = "http://proxy.example.com:8080" -# 或者 SOCKS5 代理 -# proxy_url = "socks5://proxy.example.com:1080" ``` +**注意**:推荐优先使用PyPI镜像源而不是代理,镜像源通常更快更稳定。 + ## 编程方式配置 也可以通过代码动态配置依赖管理: @@ -114,7 +144,13 @@ from src.plugin_system.utils.dependency_config import configure_dependency_setti # 禁用自动安装 configure_dependency_settings(auto_install=False) -# 设置代理 +# 设置PyPI镜像源(推荐) +configure_dependency_settings( + use_mirror=True, + mirror_url="https://pypi.tuna.tsinghua.edu.cn/simple" +) + +# 设置网络代理 configure_dependency_settings( use_proxy=True, proxy_url="http://proxy.example.com:8080" @@ -124,6 +160,8 @@ configure_dependency_settings( configure_dependency_settings(auto_install_timeout=600) ``` +**注意**:编程方式的配置更改不会持久化,实际配置请修改 `bot_config.toml` 文件。 + ## 工作流程 1. **插件初始化**: 当插件类被实例化时,系统自动检查依赖 @@ -136,6 +174,7 @@ configure_dependency_settings(auto_install_timeout=600) ``` [Plugin:web_search_tool] 开始自动安装Python依赖: ['asyncddgs', 'httpx[socks]'] +[Plugin:web_search_tool] 使用PyPI镜像源: https://pypi.tuna.tsinghua.edu.cn/simple [Plugin:web_search_tool] ✅ 成功安装: asyncddgs [Plugin:web_search_tool] ✅ 成功安装: httpx[socks] [Plugin:web_search_tool] 🎉 所有依赖安装完成 @@ -154,10 +193,11 @@ configure_dependency_settings(auto_install_timeout=600) ## 最佳实践 1. **使用详细的PythonDependency对象** 以获得更好的控制和文档 -2. **合理设置可选依赖** 避免非核心功能阻止插件加载 -3. **指定版本要求** 确保兼容性 -4. **添加描述信息** 帮助用户理解依赖的用途 -5. **测试依赖配置** 在不同环境中验证依赖是否正确 +2. **配置PyPI镜像源** 特别是在中国大陆地区,可显著提升下载速度 +3. **合理设置可选依赖** 避免非核心功能阻止插件加载 +4. **指定版本要求** 确保兼容性 +5. **添加描述信息** 帮助用户理解依赖的用途 +6. **测试依赖配置** 在不同环境中验证依赖是否正确 ## 安全考虑 @@ -170,10 +210,12 @@ configure_dependency_settings(auto_install_timeout=600) ### 依赖安装失败 -1. 检查网络连接 -2. 验证代理设置 -3. 检查pip配置 -4. 查看详细的错误日志 +1. **优先尝试PyPI镜像源**:配置国内镜像源如清华、阿里云等 +2. 检查网络连接 +3. 验证镜像源URL是否正确 +4. 如果镜像源失败,可尝试禁用镜像源或更换其他镜像源 +5. 检查代理设置(如果使用) +6. 查看详细的错误日志 ### 版本冲突 diff --git a/src/config/official_configs.py b/src/config/official_configs.py index b1a0d2dc8..65ff91cd2 100644 --- a/src/config/official_configs.py +++ b/src/config/official_configs.py @@ -876,11 +876,17 @@ class DependencyManagementConfig(ConfigBase): auto_install_timeout: int = 300 """安装超时时间(秒)""" + use_mirror: bool = False + """是否使用PyPI镜像源""" + + mirror_url: str = "" + """PyPI镜像源URL,如: "https://pypi.tuna.tsinghua.edu.cn/simple" """ + use_proxy: bool = False - """是否使用代理进行包安装""" + """是否使用网络代理(高级选项)""" proxy_url: str = "" - """代理URL,如: "http://proxy.example.com:8080" 或 "socks5://proxy.example.com:1080" """ + """网络代理URL,如: "http://proxy.example.com:8080" """ pip_options: list[str] = field(default_factory=lambda: [ "--no-warn-script-location", diff --git a/src/plugin_system/utils/dependency_config.py b/src/plugin_system/utils/dependency_config.py index 8bc4c9d71..e52883432 100644 --- a/src/plugin_system/utils/dependency_config.py +++ b/src/plugin_system/utils/dependency_config.py @@ -31,9 +31,25 @@ class DependencyConfig: return config.dependency_management.auto_install return True + @property + def use_mirror(self) -> bool: + """是否使用PyPI镜像源""" + config = self._get_config() + if config and hasattr(config, 'dependency_management'): + return config.dependency_management.use_mirror + return False + + @property + def mirror_url(self) -> str: + """PyPI镜像源URL""" + config = self._get_config() + if config and hasattr(config, 'dependency_management'): + return config.dependency_management.mirror_url + return "" + @property def use_proxy(self) -> bool: - """是否使用代理""" + """是否使用网络代理""" config = self._get_config() if config and hasattr(config, 'dependency_management'): return config.dependency_management.use_proxy @@ -41,7 +57,7 @@ class DependencyConfig: @property def proxy_url(self) -> str: - """代理URL""" + """网络代理URL""" config = self._get_config() if config and hasattr(config, 'dependency_management'): return config.dependency_management.proxy_url diff --git a/src/plugin_system/utils/dependency_manager.py b/src/plugin_system/utils/dependency_manager.py index fb15a0b96..a4e0e7b57 100644 --- a/src/plugin_system/utils/dependency_manager.py +++ b/src/plugin_system/utils/dependency_manager.py @@ -19,13 +19,15 @@ class DependencyManager: 负责检查和自动安装插件的Python包依赖 """ - def __init__(self, auto_install: bool = True, use_proxy: bool = False, proxy_url: Optional[str] = None): + def __init__(self, auto_install: bool = True, use_mirror: bool = False, mirror_url: Optional[str] = None, use_proxy: bool = False, proxy_url: Optional[str] = None): """初始化依赖管理器 Args: auto_install: 是否自动安装缺失的依赖 - use_proxy: 是否使用代理 - proxy_url: 代理URL + use_mirror: 是否使用PyPI镜像源 + mirror_url: PyPI镜像源URL + use_proxy: 是否使用网络代理 + proxy_url: 网络代理URL """ # 延迟导入配置以避免循环依赖 try: @@ -34,6 +36,8 @@ class DependencyManager: # 优先使用配置文件中的设置,参数作为覆盖 self.auto_install = config.auto_install if auto_install is True else auto_install + self.use_mirror = config.use_mirror if use_mirror is False else use_mirror + self.mirror_url = config.mirror_url if mirror_url is None else mirror_url self.use_proxy = config.use_proxy if use_proxy is False else use_proxy self.proxy_url = config.proxy_url if proxy_url is None else proxy_url self.install_timeout = config.install_timeout @@ -42,8 +46,10 @@ class DependencyManager: except Exception as e: logger.warning(f"无法加载依赖配置,使用默认设置: {e}") self.auto_install = auto_install + self.use_mirror = use_mirror or False + self.mirror_url = mirror_url or "" self.use_proxy = use_proxy - self.proxy_url = proxy_url + self.proxy_url = proxy_url or "" self.install_timeout = 300 self.pip_options = ["--no-warn-script-location", "--disable-pip-version-check"] @@ -234,9 +240,15 @@ class DependencyManager: try: cmd = [sys.executable, "-m", "pip", "install", package] + # 添加镜像源设置(优先) + if self.use_mirror and self.mirror_url: + cmd.extend(["-i", self.mirror_url]) + logger.debug(f"[Plugin:{plugin_name}] 使用PyPI镜像源: {self.mirror_url}") + # 添加代理设置 if self.use_proxy and self.proxy_url: cmd.extend(["--proxy", self.proxy_url]) + logger.debug(f"[Plugin:{plugin_name}] 使用网络代理: {self.proxy_url}") # 添加配置的pip选项 cmd.extend(self.pip_options) @@ -277,11 +289,13 @@ def get_dependency_manager() -> DependencyManager: return _global_dependency_manager -def configure_dependency_manager(auto_install: bool = True, use_proxy: bool = False, proxy_url: Optional[str] = None): +def configure_dependency_manager(auto_install: bool = True, use_mirror: bool = False, mirror_url: Optional[str] = None, use_proxy: bool = False, proxy_url: Optional[str] = None): """配置全局依赖管理器""" global _global_dependency_manager _global_dependency_manager = DependencyManager( auto_install=auto_install, + use_mirror=use_mirror, + mirror_url=mirror_url, use_proxy=use_proxy, proxy_url=proxy_url ) \ No newline at end of file diff --git a/template/bot_config_template.toml b/template/bot_config_template.toml index 3f227a018..94ed56451 100644 --- a/template/bot_config_template.toml +++ b/template/bot_config_template.toml @@ -261,9 +261,13 @@ auto_install = true # 安装超时时间(秒) auto_install_timeout = 300 -# 是否使用代理进行包安装 +# 是否使用PyPI镜像源(推荐,可加速下载) +use_mirror = true +mirror_url = "https://pypi.tuna.tsinghua.edu.cn/simple" # PyPI镜像源URL,如: "https://pypi.tuna.tsinghua.edu.cn/simple" + +# 是否使用网络代理(高级选项) use_proxy = false -proxy_url = "" # 代理URL,如: "http://proxy.example.com:8080" 或 "socks5://proxy.example.com:1080" +proxy_url = "" # 网络代理URL,如: "http://proxy.example.com:8080" # pip安装选项 pip_options = [