Skip to content

feat: add fashion dock mode with card plugin support - #1722

Open
wjyrich wants to merge 1 commit into
linuxdeepin:masterfrom
wjyrich:CardAndFashionMode
Open

feat: add fashion dock mode with card plugin support#1722
wjyrich wants to merge 1 commit into
linuxdeepin:masterfrom
wjyrich:CardAndFashionMode

Conversation

@wjyrich

@wjyrich wjyrich commented Sep 7, 2026

Copy link
Copy Markdown
Contributor
  1. Implement fashion dock mode as a new item alignment style with floating window appearance, rounded corners, and content-based sizing
  2. Add new plugin type Card for card-style plugins displayed in the dock
  3. Create CardLeftDockArea component supporting multiple card plugins with swipe navigation, wheel switching, and page indicators
  4. Add card sorting mechanism allowing plugins to report their display order
  5. Add card current position persistence across dock restarts
  6. Implement fashion mode propagation to plugins and task manager
  7. Add fashion mode enable/disable configuration with fallback to centered mode
  8. Disable window split functionality in fashion mode
  9. Update context menu to reflect fashion mode constraints

Log: Added fashion dock mode with card plugin area, including sorting, persistence, and plugin communication support

Influence:

  1. Test switching between centered and fashion dock modes via context menu
  2. Verify fashion mode disables left/right position options
  3. Test card plugin display, sorting, and swapping between multiple cards
  4. Test card persistence across dock restarts
  5. Verify fashion mode correctly hides show desktop button
  6. Test that window split is not applied in fashion mode
  7. Verify fashion mode disabled via DConfig returns to centered mode
  8. Test plugin communication of fashion mode state

feat: 添加时尚模式任务栏及卡片插件支持

  1. 实现时尚模式任务栏,采用新的对齐方式,支持悬浮窗口、圆角和自适应内容 宽度
  2. 添加“卡片”类型插件,用于在任务栏展示卡片样式组件
  3. 创建卡片区域组件,支持多卡片滑动切换、滚轮切换和页面指示器
  4. 添加卡片排序机制,插件可上报显示顺序
  5. 添加卡片当前位置持久化,重启后恢复
  6. 实现时尚模式状态向插件和任务管理器的通知
  7. 增加时尚模式开关配置,关闭时回退至居中模式
  8. 时尚模式下禁用窗口分屏功能
  9. 更新右键菜单以适配时尚模式限制

Log: 新增时尚模式任务栏和卡片插件区域,包含排序、状态持久化及插件通信
支持

Influence:

  1. 测试通过右键菜单在居中模式和时尚模式之间切换
  2. 验证时尚模式下左/右位置选项被隐藏
  3. 测试卡片插件的显示、排序,以及多卡片之间的切换
  4. 测试任务栏重启后卡片位置恢复
  5. 验证时尚模式下显示桌面图标被隐藏
  6. 测试时尚模式下窗口分屏功能无效
  7. 验证通过 DConfig 关闭时尚模式后回退至居中模式
  8. 测试插件接收时尚模式状态通知

PMS: TASK-392671

Summary by Sourcery

Introduce fashion dock mode and card plugin support with persistent navigation, plugin integration, and mode-specific behavior.

New Features:

  • Add a fashion dock mode with floating, rounded, content-sized presentation and configuration-controlled availability.
  • Support card-style dock plugins with ordered display, vertical swipe and wheel navigation, page indicators, and popup handling.
  • Persist the selected card across dock restarts and communicate fashion-mode state to dock plugins and the task manager.

Bug Fixes:

  • Fall back to centered alignment when fashion mode is disabled or unavailable.
  • Prevent unsupported left/right positioning and window splitting while fashion mode is active.
  • Hide the show-desktop control in fashion mode.

Enhancements:

  • Update dock context-menu options to reflect fashion-mode constraints and supported positions.

Build:

  • Include the new card dock area package in the dock build.

@deepin-ci-robot

Copy link
Copy Markdown

[APPROVALNOTIFIER] This PR is NOT APPROVED

This pull-request has been approved by: wjyrich

The full list of commands accepted by this bot can be found here.

Details Needs approval from an approver in each of these files:

Approvers can indicate their approval by writing /approve in a comment
Approvers can cancel approval by writing /approve cancel in a comment

@sourcery-ai

sourcery-ai Bot commented Sep 7, 2026

Copy link
Copy Markdown

Reviewer's Guide

Adds a DConfig-gated fashion dock mode with a floating adaptive layout, top/bottom-only constraints, and mode propagation, alongside a Card plugin surface type with sorted multi-card navigation, popup handling, and persisted selection.

Sequence diagram for card discovery, sorting, and navigation persistence

sequenceDiagram
    participant Plugin as CardPlugin
    participant Compositor as DockCompositor
    participant Area as CardLeftDockArea
    participant Settings as DockSettings

    Plugin->>Compositor: create card surface
    Compositor->>Area: add cardPluginSurfaces
    Plugin->>Compositor: request_message(cardOrder)
    Compositor->>Area: cardOrderChanged
    Area->>Area: desiredSurfaces()
    Area->>Area: syncSortedCards()
    Area->>Settings: read cardCurrent
    Settings-->>Area: persisted pluginId::itemKey
    Area->>Area: syncCurrentCard()
    Area->>Area: SwipeView.setCurrentIndex()
    Area->>Settings: setCardCurrent(pluginId::itemKey)
    Settings->>Settings: debounce Card_Current write
Loading

Sequence diagram for fashion mode propagation to plugins and task manager

sequenceDiagram
    participant Panel as DockPanel
    participant Compositor as PluginManager
    participant Plugin as CardPlugin
    participant TaskManager as TaskManager

    Panel->>Compositor: set fashionMode
    Compositor->>Plugin: sendEventMsg(dockFashionMode)
    Compositor-->>Plugin: fashion mode state
    Panel->>TaskManager: setFashionMode(fashionMode)
    TaskManager->>TaskManager: isWindowSplit()
    TaskManager-->>TaskManager: disable window split in fashion mode
Loading

Flow diagram for fashion mode configuration and fallback

flowchart TD
    Start[Dock startup or alignment change] --> Enabled{fashionModeEnabled?}
    Enabled -- No --> Center[Use CenterAlignment]
    Enabled -- Yes --> Fashion{FashionAlignment selected?}
    Fashion -- No --> Normal[Use configured alignment]
    Fashion -- Yes --> Edge{Position is top or bottom?}
    Edge -- No --> Bottom[Set position to Bottom]
    Edge -- Yes --> FashionDock[Enable floating adaptive dock]
    FashionDock --> Constraints[Hide left/right options and show desktop]
Loading

File-Level Changes

Change Details Files
Introduces fashion dock layout, sizing, decoration, positioning, and mode-aware menu behavior.
  • Adds FashionAlignment and DConfig gating with centered-mode fallback.
  • Uses a floating, rounded, content-sized window with top/bottom-only placement and adjusted animations/exclusion margins.
  • Hides unsupported position choices and the show-desktop item in fashion mode.
panels/dock/constants.h
panels/dock/dconfig/org.deepin.ds.dock.json
panels/dock/dockpanel.cpp
panels/dock/dockpanel.h
panels/dock/docksettings.cpp
panels/dock/docksettings.h
panels/dock/package/main.qml
panels/dock/showdesktop/package/showdesktop.qml
Adds card plugin plumbing and a dedicated multi-card dock area.
  • Registers Dock.Card surfaces and includes them in surface lookup and tray popup routing.
  • Displays cards in a vertical SwipeView with wheel navigation, hover state, page indicators, geometry updates, and card-specific tooltip/menu handling.
  • Sorts cards by plugin-reported cardOrder with stable creation-order ties.
panels/dock/CMakeLists.txt
panels/dock/DockCompositor.qml
panels/dock/cardleft/CMakeLists.txt
panels/dock/cardleft/package/CardLeftDockArea.qml
panels/dock/cardleft/package/metadata.json
panels/dock/constants.h
panels/dock/pluginmanagerextension.cpp
panels/dock/pluginmanagerextension_p.h
panels/dock/tray/package/tray.qml
Adds persistence and plugin communication for card selection and fashion-mode state.
  • Persists the selected card by pluginId/itemKey with debounced configuration writes and startup restoration handling.
  • Sends fashion mode to newly created and existing plugin surfaces.
  • Propagates fashion mode into task-manager sizing and disables effective window splitting.
panels/dock/constants.h
panels/dock/dockpanel.cpp
panels/dock/dockpanel.h
panels/dock/docksettings.cpp
panels/dock/docksettings.h
panels/dock/package/main.qml
panels/dock/pluginmanagerextension.cpp
panels/dock/pluginmanagerextension_p.h
panels/dock/taskmanager/package/TaskManager.qml
panels/dock/taskmanager/taskmanager.cpp
panels/dock/taskmanager/taskmanager.h
panels/dock/taskmanager/taskmanagersettings.cpp
panels/dock/taskmanager/taskmanagersettings.h

Tips and commands

Interacting with Sourcery

  • Trigger a new review: Comment @sourcery-ai review on the pull request.
  • Continue discussions: Reply directly to Sourcery's review comments.
  • Generate a GitHub issue from a review comment: Ask Sourcery to create an
    issue from a review comment by replying to it. You can also reply to a
    review comment with @sourcery-ai issue to create an issue from it.
  • Generate a pull request title: Write @sourcery-ai anywhere in the pull
    request title to generate a title at any time. You can also comment
    @sourcery-ai title on the pull request to (re-)generate the title at any time.
  • Generate a pull request summary: Write @sourcery-ai summary anywhere in
    the pull request body to generate a PR summary at any time exactly where you
    want it. You can also comment @sourcery-ai summary on the pull request to
    (re-)generate the summary at any time.
  • Generate reviewer's guide: Comment @sourcery-ai guide on the pull
    request to (re-)generate the reviewer's guide at any time.
  • Resolve all Sourcery comments: Comment @sourcery-ai resolve on the
    pull request to resolve all Sourcery comments. Useful if you've already
    addressed all the comments and don't want to see them anymore.
  • Dismiss all Sourcery reviews: Comment @sourcery-ai dismiss on the pull
    request to dismiss all existing Sourcery reviews. Especially useful if you
    want to start fresh with a new review - don't forget to comment
    @sourcery-ai review to trigger a new review!

Customizing Your Experience

Access your dashboard to:

  • Enable or disable review features such as the Sourcery-generated pull request
    summary, the reviewer's guide, and others.
  • Change the review language.
  • Add, remove or edit custom review instructions.
  • Adjust other review settings.

Getting Help

@sourcery-ai sourcery-ai Bot left a comment

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Hey - I've found 1 issue

Prompt for AI Agents
Please address the comments from this code review:

## Individual Comments

### Comment 1
<location path="panels/dock/dockpanel.cpp" line_range="136-139" />
<code_context>
+        // 时尚模式没有放开时不允许切过去,把对齐方式改回居中
</code_context>
<issue_to_address>
**issue (broader_impact):** When fashion mode is disabled while the dock is in fashion alignment, the `itemAlignmentChanged` handler changes the alignment to centered and returns before emitting `fashionModeChanged`. QML objects whose `Panel.fashionMode` binding depends on that notification keep the stale fashion-mode state, so the card area, show-desktop item, task manager sizing, and split controls do not update until a later unrelated notification or restart.

**Triggers:** When `enableFashionMode` is changed to false while the dock is running in fashion mode.

**Suggested fix:** Emit `fashionModeChanged()` after normalizing the alignment, including on the early-return path, or make `fashionMode` notify from the alignment/position changes directly.

```suggestion
        if (!fashionModeEnabled() && SETTINGS->itemAlignment() == ItemAlignment::FashionAlignment) {
            SETTINGS->setItemAlignment(ItemAlignment::CenterAlignment);
            Q_EMIT fashionModeChanged();
            return;
        }
```
</issue_to_address>

Sourcery is free for open source - if you like our reviews please consider sharing them ✨

Comment thread panels/dock/dockpanel.cpp
Comment on lines +136 to +139
if (!fashionModeEnabled() && SETTINGS->itemAlignment() == ItemAlignment::FashionAlignment) {
SETTINGS->setItemAlignment(ItemAlignment::CenterAlignment);
return;
}

Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

issue (broader_impact): When fashion mode is disabled while the dock is in fashion alignment, the itemAlignmentChanged handler changes the alignment to centered and returns before emitting fashionModeChanged. QML objects whose Panel.fashionMode binding depends on that notification keep the stale fashion-mode state, so the card area, show-desktop item, task manager sizing, and split controls do not update until a later unrelated notification or restart.

Triggers: When enableFashionMode is changed to false while the dock is running in fashion mode.

Suggested fix: Emit fashionModeChanged() after normalizing the alignment, including on the early-return path, or make fashionMode notify from the alignment/position changes directly.

Suggested change
if (!fashionModeEnabled() && SETTINGS->itemAlignment() == ItemAlignment::FashionAlignment) {
SETTINGS->setItemAlignment(ItemAlignment::CenterAlignment);
return;
}
if (!fashionModeEnabled() && SETTINGS->itemAlignment() == ItemAlignment::FashionAlignment) {
SETTINGS->setItemAlignment(ItemAlignment::CenterAlignment);
Q_EMIT fashionModeChanged();
return;
}

@BLumia BLumia left a comment

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Image

treeland环境(x11没试)时尚模式右侧会有这个问题,可以看看是否这次里处理。

Comment thread panels/dock/cardleft/package/CardLeftDockArea.qml Outdated
Comment thread panels/dock/dconfig/org.deepin.ds.dock.json Outdated
1. Implement fashion dock mode as a new item alignment style with
floating window appearance, rounded corners, and content-based sizing
2. Add new plugin type `Card` for card-style plugins displayed in the
dock
3. Create CardLeftDockArea component supporting multiple card plugins
with swipe navigation, wheel switching, and page indicators
4. Add card sorting mechanism allowing plugins to report their display
order
5. Add card current position persistence across dock restarts
6. Implement fashion mode propagation to plugins and task manager
7. Add fashion mode enable/disable configuration with fallback to
centered mode
8. Disable window split functionality in fashion mode
9. Update context menu to reflect fashion mode constraints

Log: Added fashion dock mode with card plugin area, including sorting,
persistence, and plugin communication support

Influence:
1. Test switching between centered and fashion dock modes via context
menu
2. Verify fashion mode disables left/right position options
3. Test card plugin display, sorting, and swapping between multiple
cards
4. Test card persistence across dock restarts
5. Verify fashion mode correctly hides show desktop button
6. Test that window split is not applied in fashion mode
7. Verify fashion mode disabled via DConfig returns to centered mode
8. Test plugin communication of fashion mode state

feat: 添加时尚模式任务栏及卡片插件支持

1. 实现时尚模式任务栏,采用新的对齐方式,支持悬浮窗口、圆角和自适应内容
宽度
2. 添加“卡片”类型插件,用于在任务栏展示卡片样式组件
3. 创建卡片区域组件,支持多卡片滑动切换、滚轮切换和页面指示器
4. 添加卡片排序机制,插件可上报显示顺序
5. 添加卡片当前位置持久化,重启后恢复
6. 实现时尚模式状态向插件和任务管理器的通知
7. 增加时尚模式开关配置,关闭时回退至居中模式
8. 时尚模式下禁用窗口分屏功能
9. 更新右键菜单以适配时尚模式限制

Log: 新增时尚模式任务栏和卡片插件区域,包含排序、状态持久化及插件通信
支持

Influence:
1. 测试通过右键菜单在居中模式和时尚模式之间切换
2. 验证时尚模式下左/右位置选项被隐藏
3. 测试卡片插件的显示、排序,以及多卡片之间的切换
4. 测试任务栏重启后卡片位置恢复
5. 验证时尚模式下显示桌面图标被隐藏
6. 测试时尚模式下窗口分屏功能无效
7. 验证通过 DConfig 关闭时尚模式后回退至居中模式
8. 测试插件接收时尚模式状态通知

PMS: TASK-392671
@deepin-ci-robot

Copy link
Copy Markdown

deepin pr auto review

AI 代码审查报告

PR: linuxdeepin/dde-shell#1722
标题: feat: add fashion dock mode with card plugin support
作者: wjyrich
分支: CardAndFashionMode → master
审查时间: 2026-09-08
审查模式: 全量分析


总体评价

评分 等级 结论
94/100 优秀 代码审查通过

本次 PR 为 dde-shell 的任务栏(dock)新增了时尚模式(Fashion Mode)和卡片插件(Card Plugin)支持。代码整体质量优秀,架构设计合理,注释详尽,安全方面无漏洞。存在少量代码质量和性能优化建议,不影响功能正确性。


漏洞对比统计

漏洞对比统计:新增漏洞 0 个,减少漏洞 0 个,持平 0 个


四维度评分

维度1:语法逻辑(25分)✓ 语法正确,逻辑清晰

得分:25/25

代码语法正确,逻辑清晰。各模块协作关系明确:

  1. DockPanel::init() 中对时尚模式的归一化处理逻辑正确:时尚模式未启用时回退居中模式,时尚模式下不支持左右位置时自动切换到底部
  2. DockPanel::fashionMode() 正确判断时尚模式仅在上/下位置有效
  3. DockSettings::setCardCurrent() 使用防抖定时器延迟写入,避免频繁切换卡片时产生过多 I/O
  4. CardLeftDockArea.qmlsyncSortedCards() 增量同步算法正确,保留了已有 delegate 的生命周期
  5. TaskManagerSettings::isWindowSplit() 在时尚模式下正确禁用窗口分割功能
  6. PluginSurface::setCardOrder() 正确处理排序值变更通知

边界条件处理完善:

  • restoreTimeout 定时器(10秒)确保即使插件未出现,当前卡片也能被持久化
  • WheelHandler 中使用模运算正确处理循环索引
  • DConfig 变更回调中直接设置 m_cardCurrent 避免回写循环

维度2:代码质量(25分)✓ 代码结构清晰,注释完整

得分:20/25

扣分明细:

  1. const-correctness 不一致(-2分)DockPanel::fashionMode()TaskManager::fashionMode()TaskManagerSettings::isWindowSplit() 三个只读 getter 未声明 const,而同类中其他 getter(如 fashionModeEnabled() constcardCurrent() const)均为 const。这影响 const 实例上的调用和代码一致性。

    • dockpanel.h:79bool fashionMode(); 应为 bool fashionMode() const;
    • dockpanel.cpp:341bool DockPanel::fashionMode() 应为 bool DockPanel::fashionMode() const
    • taskmanager.cpp:488bool TaskManager::fashionMode() 应为 const
    • taskmanagersettings.cpp:104bool TaskManagerSettings::isWindowSplit() 应为 const
  2. fashionModeChanged() 信号重复发射(-2分)dockpanel.cpp:145-149 中,当对齐方式切换到 FashionAlignment 且当前位置为 Left/Right 时,setPosition(Position::Bottom) 会触发 positionChanged 信号,其处理函数(dockpanel.cpp:114-116)已发射 fashionModeChanged(),之后 dockpanel.cpp:149 又再次发射,导致 QML 客户端收到两次信号,可能引起不必要的重渲染。

  3. 枚举值对齐风格不一致(-1分)constants.h:39FashionAlignment 的等号位置与上方 CenterAlignmentLeftAlignment 不一致(多了一个空格),影响代码可读性。

代码优点:

  • 注释覆盖率高,关键逻辑均有中英文注释说明设计意图
  • 新增的 CardLeftDockArea.qml(518行)虽长但结构清晰,包含排序同步、几何更新、弹窗管理等完整功能模块
  • DConfig 配置项均有中英文描述和合理默认值
  • 防抖定时器、增量同步等设计体现了良好的工程实践

维度3:代码性能(20分)✓ 性能良好,资源使用合理

得分:19/20

扣分明细:

  1. fashionModeChanged() 无条件发射(-1分)dockpanel.cpp:114-116 中,每次位置变更都会发射 fashionModeChanged(),即使从 Top 切换到 Bottom(两者都支持时尚模式,fashionMode() 返回值不变)也会发射信号,导致 QML 端不必要的重评估。建议在发射前比较 fashionMode() 的值是否实际变化。

性能优点:

  • setCardCurrent() 使用 1000ms 防抖定时器避免频繁 DConfig 写入
  • syncSortedCards() 使用增量更新而非全量重建,保留 delegate 生命周期
  • syncTimer(50ms)合并快速连续的模型变更
  • geometryUpdateTimersurfaceGeometryUpdateTimer 均使用防抖
  • desiredSurfaces() 排序复杂度 O(n log n),卡片数量预期很小,性能良好

维度4:代码安全(30分)✓ 存在0个安全漏洞

得分:30/30

安全审查结果:

  1. 输入校验MSG_CARD_ORDER 消息解析使用 toInt(std::numeric_limits<int>::max()) 提供安全默认值,无效输入不会导致异常
  2. 无注入风险cardCurrent 字符串仅用于 QML 属性比较,不参与命令执行或路径拼接
  3. 无硬编码凭证:代码中未发现任何硬编码的密钥、密码或 Token
  4. 无缓冲区溢出:C++ 代码使用 Qt 安全的字符串和容器类,无原始指针运算
  5. DConfig 安全:新增配置项 cardCurrentenableFashionMode 均设置为 private 可见性,默认值合理
  6. Wayland Surface 交互:插件 surface 的属性(pluginId、itemKey)仅用于标识和排序,不参与敏感操作

OCR 审查补充

OpenCodeReview 工具审查了 13 个文件,发现 7 个建议(0 个安全漏洞):

序号 文件 类型 级别 描述
1 constants.h:39 style low FashionAlignment 等号对齐不一致
2 dockpanel.h:79 maintainability low fashionMode() 缺少 const 限定符
3 dockpanel.cpp:145-149 bug high fashionModeChanged() 信号重复发射
4 dockpanel.cpp:341-346 maintainability medium fashionMode() 未声明 const
5 dockpanel.cpp:114-116 performance low 位置变更时无条件发射 fashionModeChanged()
6 taskmanager.cpp:488-491 maintainability low fashionMode() 应为 const
7 taskmanagersettings.cpp:104-108 maintainability low isWindowSplit() 应为 const

注:OCR 标记的 #3 为 "bug · high",经人工审计确认为代码质量问题(信号重复发射),不影响功能正确性和安全性,已归入维度2扣分。


改进建议

建议1:修复 const-correctness

// dockpanel.h
- bool fashionMode();
+ bool fashionMode() const;

// dockpanel.cpp
- bool DockPanel::fashionMode()
+ bool DockPanel::fashionMode() const

// taskmanager.h
- bool fashionMode();
+ bool fashionMode() const;

// taskmanager.cpp
- bool TaskManager::fashionMode()
+ bool TaskManager::fashionMode() const

// taskmanagersettings.h
- bool isWindowSplit();
+ bool isWindowSplit() const;

// taskmanagersettings.cpp
- bool TaskManagerSettings::isWindowSplit()
+ bool TaskManagerSettings::isWindowSplit() const

建议2:避免 fashionModeChanged() 重复发射

// dockpanel.cpp, itemAlignmentChanged handler
connect(SETTINGS, &DockSettings::itemAlignmentChanged, this, [this](){
    if (!fashionModeEnabled() && SETTINGS->itemAlignment() == ItemAlignment::FashionAlignment) {
        SETTINGS->setItemAlignment(ItemAlignment::CenterAlignment);
        return;
    }

    if (SETTINGS->itemAlignment() == ItemAlignment::FashionAlignment
        && (position() == Position::Left || position() == Position::Right)) {
        setPosition(Position::Bottom);
        // fashionModeChanged() is already emitted by the positionChanged handler
    } else {
        Q_EMIT fashionModeChanged();
    }
});

建议3:避免不必要的 fashionModeChanged() 发射

// dockpanel.cpp, positionChanged handler
connect(SETTINGS, &DockSettings::positionChanged, this, [this, dockDaemonAdaptor](){
    const bool wasFashionMode = fashionMode();
    Q_EMIT positionChanged(position());
    if (wasFashionMode != fashionMode())
        Q_EMIT fashionModeChanged();
    // ...
});

建议4:修复枚举对齐

// constants.h
-     FashionAlignment      = 2,
+     FashionAlignment     = 2,

审查清单

  • 已按四维度标准完成代码分析(语法逻辑、代码质量、代码性能、代码安全)
  • 代码安全维度第一行包含"存在0个安全漏洞"
  • 安全漏洞已按等级分类(无安全漏洞)
  • 包含漏洞对比统计行(新增/减少/持平)
  • 每个维度标记✓/✕与评价词一致
  • 审查结论考虑了 commit message 的目的(新增时尚模式和卡片插件功能)
  • 问题定位准确,行号和函数名正确
  • 环境变量使用正确,文件路径无误

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

3 participants