Composer why命令怎么用_反向查询某个包被依赖的原因

composer why命令用于查询某个包被安装的原因,通过分析composer.json和composer.lock文件,显示直接或间接依赖该包的所有上游包及其版本约束。例如执行composer why symfony/yaml会列出所有依赖symfony/yaml的包,如doctrine/annotations 1.13.2 requires symfony/yaml (^3.4 || ^4.0 || ^5.0 || ^6.0),表明该包因doctrine/annotations的依赖而被引入。若项目本身直接依赖,则显示root dev-master requires monolog/monolog (^2.0)。使用–dev选项可检查开发依赖。此命令对诊断“幽灵依赖”、解决版本冲突、优化依赖结构至关重要。当出现多个路径对同一包有不同版本要求时,可通过调整版本约束、升级上游依赖或明确指定兼容版本来解决。配合composer info查看可用版本、composer depends了解某包自身依赖、composer show –tree可视化整个依赖树、composer outdated检查过期包,可构建完整的依赖分析流程,帮助开发者清晰理解并管理复杂依赖关系。

composer why命令怎么用_反向查询某个包被依赖的原因

Composer why

命令是你在Composer项目中理解某个特定包为何被安装的核心工具。它提供了一个“反向查询”机制,能清晰地揭示是哪个直接依赖或间接依赖引入了你正在查询的包,这对于调试依赖冲突、优化项目结构或仅仅是理解复杂的依赖链至关重要。

解决方案

要使用

Composer why

命令,你只需要在终端中输入

composer why 

,其中


是你想要查询的Composer包的完整名称(例如

monolog/monolog

)。

例如,如果你想知道为什么

symfony/yaml

包会出现在你的

vendor

目录中:

composer why symfony/yaml

Composer会分析你的

composer.json

文件及其锁文件(

composer.lock

),然后输出一个列表,显示所有直接或间接依赖

symfony/yaml

的包。

输出通常会是这样的格式:

  requires 

比如:

doctrine/annotations 1.13.2 requires symfony/yaml (^3.4 || ^4.0 || ^5.0 || ^6.0)

这表示

doctrine/annotations

包的

1.13.2

版本,通过其自身的

composer.json

,要求安装

symfony/yaml

,并且兼容的版本范围是

^3.4

到

^6.0

。

如果被查询的包是由你的项目本身直接依赖的,输出会显示

root

:

composer why monolog/monolog

输出可能包含:

root dev-master requires monolog/monolog (^2.0)

这表明你的项目(

root

)直接在

composer.json

中声明了对

monolog/monolog

的依赖。

如果你怀疑一个包是作为开发依赖(

require-dev

)被引入的,可以使用

--dev

选项:

composer why --dev phpunit/phpunit

这会把

require-dev

部分的依赖也考虑进去。虽然通常情况下

Composer why

会默认检查所有依赖,但明确指定

--dev

在某些复杂场景下能帮助你更好地理解依赖来源。

为什么

Composer why

命令对依赖管理至关重要?

在日常的PHP项目开发中,依赖管理往往是把双刃剑。我们享受着Composer带来的便利,但有时也会被复杂的依赖关系搞得焦头烂额。

Composer why

命令在我看来,就是那把能穿透迷雾的探照灯。

首先,它能帮你快速诊断“幽灵依赖”。你可能发现

vendor

目录里多了一个你从未直接引入的包,甚至不知道它有什么用。通过

Composer why

,你能立即追溯到是哪个核心依赖或某个工具库悄悄地把它带了进来。这对于理解项目的实际组成,避免不必要的代码膨胀非常有帮助。

其次,它在解决版本冲突时是不可或缺的。当Composer报错说某个包的版本不兼容时,通常是因为多个上游依赖对同一个包有不同的版本要求。

Composer why

可以清晰地展示这些相互冲突的依赖路径,让你知道哪些包是“罪魁祸首”,从而有针对性地调整

composer.json

中的版本约束,或者考虑升级/降级某个核心库来解决冲突。我个人就遇到过好几次,一个看似不相关的库因为间接依赖导致整个项目无法

composer update

,这时

why

命令就是我的救星。

此外,它还能帮助我们进行项目优化。通过了解哪些包是哪些核心功能的间接依赖,我们可以评估是否值得为了某个功能引入一整套庞大的依赖链。有时候,一个简单的功能可能因为一个间接依赖而引入了大量的额外代码,这时你可能需要重新考虑技术选型或寻找更轻量级的替代方案。它不是直接告诉你如何优化,而是提供数据,让你能做出更明智的决策。

如何解读

Composer why

的输出并解决常见的依赖问题?

Composer why

的输出格式简洁明了,但理解其背后的含义对解决问题至关重要。每一行通常代表一个依赖路径,从“requiring-package”到你查询的“package-name”。

例如,输出可能显示:

symfony/framework-bundle v5.4.15 requires symfony/yaml (^5.4)symfony/console v5.4.15 requires symfony/yaml (^5.4)

这表明

symfony/yaml

被

symfony/framework-bundle

和

symfony/console

这两个包同时依赖,且它们都要求

^5.4

版本。这通常不是问题,因为版本约束是兼容的。

但如果出现以下情况:

my/project dev-master requires some/library (^1.0)some/library 1.2.0 requires another/package (^2.0)another/package 2.5.0 requires third/party (^3.0)my/other-library 3.0.0 requires third/party (^4.0)

这里就可能存在冲突了。

third/party

被两个不同的路径所依赖,一个要求

^3.0

,另一个要求

^4.0

。如果这两个版本约束无法同时满足(例如,

third/party

的

3.x

和

4.x

版本不兼容),Composer就会报错。

解决这类常见依赖问题的方法:

调整版本约束: 最直接的方法是修改你的

composer.json

中对冲突包的直接依赖版本约束。如果

my/other-library

是你的直接依赖,你可以尝试更新它,看是否有新版本兼容

third/party

的

^3.0

。或者,如果

another/package

是可控的,可以尝试降级或升级它。升级或降级上游依赖: 有时候,冲突是由于你的项目使用了某个旧版本的上游依赖(比如

some/library

或

my/other-library

)。尝试运行

composer outdated

来查看是否有可用的更新,然后逐步更新这些包,这通常能解决很多问题,因为包维护者通常会解决这类依赖冲突。明确指定版本: 作为最后的手段,如果实在无法通过调整上游依赖来解决,你可以在

composer.json

中明确指定冲突包的版本。例如,如果你确定

third/party

的

4.x

版本对你来说更重要,并且与

another/package

的

^3.0

要求不兼容,你可能需要考虑移除

another/package

,或者寻找它的替代品。但这种做法需要非常谨慎,因为它可能会引入新的兼容性问题。使用

composer info 

: 在决定如何调整版本之前,先用

composer info 

查看冲突包的可用版本和相关信息,这能帮助你了解哪些版本是可行的。

除了

Composer why

,还有哪些命令可以辅助进行深度依赖分析?

虽然

Composer why

在反向查询依赖方面表现出色,但它并非孤军奋战。Composer生态中还有一些命令,它们与

why

命令形成互补,能让你对项目的依赖关系有更全面的理解。

composer depends 

(或

composer prohibit 

): 这个命令与

why

的功能正好相反,它会告诉你某个包自身依赖了哪些其他包。如果你想了解一个新引入的库会带来哪些新的间接依赖,或者想知道为什么某个库不能在特定PHP版本下运行(因为它依赖了更高PHP版本的特性),

depends

就能派上用场。它能帮助你预判引入新库可能带来的“副作用”。

composer show --tree

: 这可能是可视化整个项目依赖树最直观的方式了。它会以树状结构展示你项目中所有包及其依赖关系,让你一眼就能看出哪些是直接依赖,哪些是间接依赖,以及它们之间的层级关系。当你的项目依赖非常复杂时,

--tree

的输出虽然可能很长,但它能提供一个全局视角,帮助你快速定位深层依赖问题,或者理解某个包在整个依赖图中的位置。

composer show 

: 这个命令提供了一个特定包的详细信息,包括它的版本、描述、作者、许可协议以及最重要的——它自己的

require

和

require-dev

部分。当你通过

Composer why

发现一个包被引入,但你对这个包本身不熟悉时,

composer show

能让你快速了解它的基本情况和它自身的要求。

composer outdated

: 这个命令会列出你项目中所有已安装但有更新版本的包。虽然它不直接分析依赖链,但它能帮你发现潜在的依赖问题源头。很多时候,依赖冲突或安全漏洞正是因为使用了过时的包版本。定期运行

outdated

并适时更新,是维护健康项目依赖关系的重要一环。

这些命令各有侧重,但结合起来使用,就能构建起一个强大的依赖分析工具集。例如,当你发现一个奇怪的包时,先用

Composer why

找出谁引入了它;然后用

composer show

了解这个包的基本信息;如果需要,再用

composer depends

查看它自身又依赖了什么;最后,如果需要全局审视,

composer show --tree

能提供宏观视图。这种多角度的分析方法,能让你在面对复杂的Composer依赖时,保持清晰的思路和高效的解决能力。

以上就是Composer why命令怎么用_反向查询某个包被依赖的原因的详细内容,更多请关注php中文网其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/159336.html

赞 (0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
MYSQL增加从库的方法是什么
上一篇 2025年12月5日 08:32:28
如何在Laravel中使用软删除恢复
下一篇 2025年12月5日 08:34:30

相关推荐

  • JNA高级教程:深入理解原生结构体与联合体映射

    JNA高级教程:深入理解原生结构体与联合体映射JNA高级教程:深入理解原生结构体与联合体映射JNA高级教程:深入理解原生结构体与联合体映射JNA高级教程:深入理解原生结构体与联合体映射

    本教程详细探讨了JNA在与原生库交互时,如何正确映射包含嵌套结构体或联合体的复杂数据类型。文章首先分析了IllegalArgumentException的常见原因——非Structure类型字段导致JNA无法确定原生大小,随后提供了两种解决方案:一是直接通过JNA的Structure和Union类精…

    2026年9月28日 • 用户投稿
    000
  • 夸克怎么彻底卸载干净_夸克APP及相关数据完全清除教程

    夸克怎么彻底卸载干净_夸克APP及相关数据完全清除教程夸克怎么彻底卸载干净_夸克APP及相关数据完全清除教程夸克怎么彻底卸载干净_夸克APP及相关数据完全清除教程夸克怎么彻底卸载干净_夸克APP及相关数据完全清除教程

    彻底卸载夸克APP需先通过系统设置卸载主程序,再手动删除残留文件夹如/Android/data/com.quark.browser,清除账户同步数据,并使用清理工具深度扫描残留项。 如果您尝试从设备中移除夸克应用,但发现残留数据或配置文件仍然存在,则可能是由于卸载过程中未清除用户数据与缓存信息。以下…

    2026年9月28日 • 用户投稿
    000
  • DeepSeek如何实现模型联邦学习 DeepSeek分布式训练架构配置指南

    DeepSeek如何实现模型联邦学习 DeepSeek分布式训练架构配置指南DeepSeek如何实现模型联邦学习 DeepSeek分布式训练架构配置指南DeepSeek如何实现模型联邦学习 DeepSeek分布式训练架构配置指南DeepSeek如何实现模型联邦学习 DeepSeek分布式训练架构配置指南

    本文将深入探讨DeepSeek如何实现模型联邦学习,并提供一套详细的分布式训练架构配置指南。我们将从联邦学习的核心概念出发,解析DeepSeek在这一领域的独特技术实现路径,并逐步讲解如何配置和部署其分布式训练架构,以帮助用户理解并实践联邦学习的强大能力。 ☞☞☞AI 智能聊天, 问答助手, AI …

    2026年9月28日 • 用户投稿
    000
  • Android游戏开发:基于线段交点的精确碰撞检测

    Android游戏开发:基于线段交点的精确碰撞检测Android游戏开发:基于线段交点的精确碰撞检测Android游戏开发:基于线段交点的精确碰撞检测Android游戏开发:基于线段交点的精确碰撞检测

    本教程详细讲解了如何在Android Pong游戏中实现精确的线段交点检测与碰撞处理。通过将球的运动轨迹和挡板视为线段,并利用代数方程计算它们的交点,可以准确判断碰撞发生的位置。文章提供了具体的数学原理、Java实现代码以及在游戏开发中的应用注意事项,帮助开发者优化游戏物理反馈。 在android等…

    2026年9月28日 • 用户投稿
    100
  • sublime怎么在侧边栏显示git状态_Sublime侧边栏Git状态显示配置指南

    sublime怎么在侧边栏显示git状态_Sublime侧边栏Git状态显示配置指南sublime怎么在侧边栏显示git状态_Sublime侧边栏Git状态显示配置指南sublime怎么在侧边栏显示git状态_Sublime侧边栏Git状态显示配置指南sublime怎么在侧边栏显示git状态_Sublime侧边栏Git状态显示配置指南

    要实现Sublime Text侧边栏显示Git状态,需安装GitGutter插件。首先通过Package Control安装GitGutter,重启编辑器后即可在侧边栏文件名旁看到Git状态图标,如“M”表示修改,“A”表示新增,“?”表示未跟踪;同时行号区会显示增删改的彩色标记。该插件基于社区驱动…

    2026年9月28日 • 用户投稿
    000
  • Safari浏览器地址栏在下面怎么改回上面_Safari浏览器地址栏位置布局调整教程

    Safari浏览器地址栏在下面怎么改回上面_Safari浏览器地址栏位置布局调整教程Safari浏览器地址栏在下面怎么改回上面_Safari浏览器地址栏位置布局调整教程Safari浏览器地址栏在下面怎么改回上面_Safari浏览器地址栏位置布局调整教程Safari浏览器地址栏在下面怎么改回上面_Safari浏览器地址栏位置布局调整教程

    首先检查Safari标签栏位置设置,1、打开设置进入Safari选项,2、将标签栏位置改为顶部;若无效,3、重启Safari浏览器;4、排查辅助功能中的便捷访问是否开启并关闭;最后更新iOS系统至最新版本以修复显示异常。 如果您发现Safari浏览器的地址栏显示在屏幕底部而非顶部,可能是由于设备界面…

    2026年9月28日 • 用户投稿
    000
  • 快手小店怎么看卖出去的商品?快手小店怎么查看出售的商品

    快手小店怎么看卖出去的商品?快手小店怎么查看出售的商品快手小店怎么看卖出去的商品?快手小店怎么查看出售的商品快手小店怎么看卖出去的商品?快手小店怎么查看出售的商品快手小店怎么看卖出去的商品?快手小店怎么查看出售的商品

    在电商蓬勃发展的今天,快手小店为众多商家提供了一个展示商品、实现变现的重要渠道。那么,快手小店怎么看卖出去的商品?接下来,我将详细为你介绍查看已售商品的具体操作流程。 快手小店查看已售商品的两种方式 想要掌握店铺销售情况,主要可以通过两个途径来查看:订单管理页面 和 商品详情页。 1. 通过订单管理…

    2026年9月28日 • 用户投稿
    200
  • 如何解决MySQL安装时权限不足的处理方法?

    如何解决MySQL安装时权限不足的处理方法?如何解决MySQL安装时权限不足的处理方法?如何解决MySQL安装时权限不足的处理方法?如何解决MySQL安装时权限不足的处理方法?

    mysql安装时权限不足问题可通过以下方法解决:1.使用管理员权限运行安装程序;2.检查并修改安装目录权限;3.关闭uac;4.修改mysql配置文件指定用户目录;5.检查防火墙和杀毒软件;6.查看安装日志定位问题;7.手动创建数据目录并设置权限;8.考虑使用docker。 MySQL安装时权限不足…

    2026年9月28日 • 用户投稿
    000
  • SublimeText如何管理多个项目窗口_Workspace工作区使用方法

    SublimeText如何管理多个项目窗口_Workspace工作区使用方法SublimeText如何管理多个项目窗口_Workspace工作区使用方法SublimeText如何管理多个项目窗口_Workspace工作区使用方法SublimeText如何管理多个项目窗口_Workspace工作区使用方法

    Sublime Text通过项目文件(.sublime-project)和工作区文件(.sublime-workspace)实现多项目高效管理,前者保存共享的静态配置如文件夹结构和构建系统,建议提交至版本控制;后者记录个人动态状态如打开文件、光标位置和布局,应被忽略以避免冲突。使用“快速切换项目”功…

    2026年9月28日 • 用户投稿
    100
  • Java中List of Lists按指定列排序与查找教程

    Java中List of Lists按指定列排序与查找教程Java中List of Lists按指定列排序与查找教程Java中List of Lists按指定列排序与查找教程Java中List of Lists按指定列排序与查找教程

    本教程详细介绍了如何在Java中处理List<List>数据结构,以实现按指定“列”进行排序,并在此基础上高效查找包含特定值的“行”。文章通过自定义Comparator来对行数据进行比较和排序,并提供了识别目标列索引的策略,从而解决了在复杂嵌套列表中进行数据组织和检索的常见挑战。 1. …

    2026年9月28日 • 用户投稿
    100
  • 豆包AI安装后如何配置TPU加速 豆包AI张量处理器优化方案

    本文将详细介绍在豆包AI环境中,如何配置张量处理器(TPU)以实现加速优化。我们将从理解TPU的基本原理开始,逐步讲解安装驱动、设置环境以及验证加速效果的整个过程,旨在帮助用户高效地利用TPU提升豆包AI模型的训练和推理性能。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 D…

    2026年9月28日
    200
  • Linux学习笔记(二)系统基础操作

    Linux学习笔记(二)系统基础操作Linux学习笔记(二)系统基础操作Linux学习笔记(二)系统基础操作Linux学习笔记(二)系统基础操作

    Linux基础学习笔记精选专栏 本专栏由小雨ttt创建,致力于分享学习linux基础知识的过程。本专栏不是机械地介绍linux指令集,而是包含了作者亲自实践的操作过程,站在一个初学者的角度理解linux基础知识。 目前本专栏包含的内容有: Linux学习笔记(一)使用文本编辑器VimLinux学习笔…

    2026年9月28日 • 用户投稿
    000
  • 360极速浏览器提示“喔唷,崩溃啦”怎么解决_浏览器崩溃问题常见原因及修复方案

    360极速浏览器提示“喔唷,崩溃啦”怎么解决_浏览器崩溃问题常见原因及修复方案360极速浏览器提示“喔唷,崩溃啦”怎么解决_浏览器崩溃问题常见原因及修复方案360极速浏览器提示“喔唷,崩溃啦”怎么解决_浏览器崩溃问题常见原因及修复方案360极速浏览器提示“喔唷,崩溃啦”怎么解决_浏览器崩溃问题常见原因及修复方案

    首先优化内存与缓存设置,启用自动释放内存和清理缓存功能;其次使用浏览器内置的一键修复工具扫描并修复异常;若问题依旧,建议卸载后重新安装最新版浏览器;最后可借助360安全卫士等第三方工具进行系统级修复,排除插件冲突或组件损坏问题。 如果您在使用360极速浏览器时遇到“喔唷,崩溃啦”的提示,这通常意味着…

    2026年9月28日 • 用户投稿
    300
  • sublime怎么保存时自动格式化代码_Sublime配置保存时自动格式化代码方法

    sublime怎么保存时自动格式化代码_Sublime配置保存时自动格式化代码方法sublime怎么保存时自动格式化代码_Sublime配置保存时自动格式化代码方法sublime怎么保存时自动格式化代码_Sublime配置保存时自动格式化代码方法sublime怎么保存时自动格式化代码_Sublime配置保存时自动格式化代码方法

    安装插件并配置可实现Sublime Text保存时自动格式化代码,提升代码可读性与一致性。首先安装Package Control包管理器,通过控制台执行指定代码完成安装;重启后使用命令面板(Ctrl+Shift+P)调出Package Control: Install Package,搜索并安装所需…

    2026年9月28日 • 用户投稿
    800
  • 百度搜索app如何快速切换账号_百度搜索app多账号管理的操作方法

    百度搜索app如何快速切换账号_百度搜索app多账号管理的操作方法百度搜索app如何快速切换账号_百度搜索app多账号管理的操作方法百度搜索app如何快速切换账号_百度搜索app多账号管理的操作方法百度搜索app如何快速切换账号_百度搜索app多账号管理的操作方法

    1、可通过设置菜单退出当前账号后登录新账号实现切换;2、安卓用户可使用应用分身功能创建百度App双开实例,分别登录不同账号;3、符合条件的iOS设备可利用巨魔商店安装修改版百度App实现多开,从而同时登录多个账号。 如果您需要在百度搜索App中频繁使用不同的账号进行登录,但每次都需要退出再重新登录,…

    2026年9月28日 • 用户投稿
    1100
  • 在 Java 中对 List 的指定列进行排序和查找

    在 Java 中对 List 的指定列进行排序和查找在 Java 中对 List 的指定列进行排序和查找在 Java 中对 List 的指定列进行排序和查找在 Java 中对 List 的指定列进行排序和查找

    本文将详细介绍如何在 Java 中处理 List<List> 类型的数据,并实现以下功能:对指定列进行排序,在排序后的列表中使用二分查找(或类似方法)查找特定元素,并输出包含该元素的完整行。 问题背景 在实际开发中,我们经常会遇到需要处理二维数据的情况,例如从 CSV 文件读取的数据或者…

    2026年9月28日 • 用户投稿
    000
  • Windows记事本应用现在可以从Microsoft Store中获得

    Windows记事本应用现在可以从Microsoft Store中获得Windows记事本应用现在可以从Microsoft Store中获得Windows记事本应用现在可以从Microsoft Store中获得Windows记事本应用现在可以从Microsoft Store中获得

    早在2019年8月,微软就曾宣布计划将广受欢迎的Windows记事本应用迁移至应用商店,旨在提升其更新频率与运行效率。然而,到了同年12月底,微软突然叫停了这一计划,且未作过多解释。如今,这一目标终于得以实现——Windows记事本现已重新上线于微软应用商店,供用户下载使用。 自从Windows系统…

    2026年9月28日 • 用户投稿
    300
  • 在国内可以用的比较好的ai图片生成工具2025十大排名

    在国内可以用的比较好的ai图片生成工具2025十大排名在国内可以用的比较好的ai图片生成工具2025十大排名在国内可以用的比较好的ai图片生成工具2025十大排名在国内可以用的比较好的ai图片生成工具2025十大排名

    答案:2025年国内AI图片生成工具将更注重本地化、移动端体验、版权保护、个性化定制及行业融合,代表工具如稿定设计、盗梦师、Vega AI等,选择应基于用户需求、创作目的与预算,AI不会取代艺术家,而是辅助创作。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek…

    2026年9月28日 • 用户投稿
    1000
  • 360极速浏览器怎么设置默认下载工具_关联第三方下载软件操作方法

    360极速浏览器怎么设置默认下载工具_关联第三方下载软件操作方法360极速浏览器怎么设置默认下载工具_关联第三方下载软件操作方法360极速浏览器怎么设置默认下载工具_关联第三方下载软件操作方法360极速浏览器怎么设置默认下载工具_关联第三方下载软件操作方法

    首先更改360极速浏览器默认下载工具以调用第三方下载软件。进入设置页面的下载设置选项,选择“选择默认下载工具”并从下拉列表中选取已安装的工具如迅雷或IDM;若未显示目标工具,可选“自定义”或“浏览”,手动定位其.exe主程序文件完成关联;最后通过点击网页下载链接验证是否成功调起第三方工具,确保设置生…

    2026年9月28日 • 用户投稿
    400
  • Gemini如何支持量子计算模拟 Gemini量子算法开发环境搭建

    Gemini如何支持量子计算模拟 Gemini量子算法开发环境搭建Gemini如何支持量子计算模拟 Gemini量子算法开发环境搭建Gemini如何支持量子计算模拟 Gemini量子算法开发环境搭建Gemini如何支持量子计算模拟 Gemini量子算法开发环境搭建

    本文将围绕如何利用Gemini进行量子计算模拟以及如何搭建相应的量子算法开发环境展开讨论。我们将详细介绍Gemini在量子计算模拟中的作用,并提供一套清晰、分步的指南,帮助用户完成开发环境的搭建,从而能够深入学习和实践量子算法。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 …

    2026年9月28日 • 用户投稿
    000

发表回复

登录后才能评论
关注微信