@1049010335 基本元素是指的是做成组件式吗 直接创建表格?
sunrisepeak
-
如何设计一套基于图论的 项目进度管理功能 -
xlings: xvm: 多版本管理工具中工作空间式环境隔离的三种模式 - 全局、本地/local、自定义多版本切换及工作空间命令演示
利用工作空间机制, 支持自动版本切换(以node为例)
speak@speak-pc:~/test/xvm$ node --version v22.12.0 speak@speak-pc:~/test/xvm$ xvm list node # 查看所有版本 23.6.0 22.12.0 speak@speak-pc:~/test/xvm$ xvm use node 23.6.0 # 切换到23.6.0 using -> target: node, version: 23.6.0 speak@speak-pc:~/test/xvm$ node --version # 验证版本 v23.6.0 speak@speak-pc:~/test/xvm$ xvm current node # 显示版本信息(xvm下有个test工作空间配置) [[test + global]] node: 23.6.0 nodejs: 23.6.0 --> [node] all targets added speak@speak-pc:~/test/xvm$ cd .. # 返回上级目录(自动切换到全局空间) speak@speak-pc:~/test$ node --version # node版本已经变成了22 v22.12.0 speak@speak-pc:~/test$ xvm current node # 查看当前版本情况 [[global]] node: 22.12.0 nodejs: 23.6.0 --> [node] all targets added speak@speak-pc:~/test$ cd xvm # 再次进入xvm目录(node会自动变成test工作空间的版本 speak@speak-pc:~/test/xvm$ node --version v23.6.0 speak@speak-pc:~/test/xvm$
三种使用模式
1-全局模式
- 全局工作空间
- 支持使用注册/移除不同版本
- 支持版本切换/及别名设置
- 支持一键关闭或开启xvm对宿主系统的影响
2-local模式
- 基于目录的工作空间
- 工作空间继承控制(不继承及和全局版本进行隔离)
- 工作空间激活状态控制
- 工作空间配置可以编辑(一般用于项目控制版本)
- 记录使用版本并导出工作空间配置文件
3-自定义工作空间 - (计划开发中)
- 自定义工作空间且目录无关 (一般用于特定版本配置组合记录)
- 其他功能类似local
开源地址
-
xlings: 新增加XVM版本管理子模块/工具 - Rust编写的支持基于目录的工作空间环境隔离XVM | Xlings Version Manager - Github
一个简单且通用的版本管理工具 - 支持多版本管理、支持工作空间和环境隔离、支持多版本的命令别名
下载安装
使用xim进行安装
xim --update index xim -i xvm # 或 xlings install xvm
直接下载
直接下载压缩包&解压出可执行程序
注: 使用时需要把xvm程序放到一个已经加入PATH的目录里
基本用法
xvm add | 添加程序
支持添加不同版本, 也支持创建命令别名
# xvm add [target] [version] --path [bin-path] --alias [command/bin-file] xvm add python 2.7.18 --path python2_dir --alias python2 xvm add python 3.12.3 --path python3_dir --alias python3.12 xvm add pv 0.0.1 --alias "python --version"
target
: 生效时可以使用的命令version
: 这个是标识target的版本号, 建议和应用版本保持一致。如果是别名可以自定义--path
: 程序所在的实际路径(可选)--alias
: 在"所设置的路径"下实际执行的命令(可选), 默认为target
注: 默认第一次添加的版本作为全局工作空间的默认版本
xvm list | 查询程序的所有版本
支持模糊查询
# xvm list [target] xvm list python xvm list p
xvm use | 切换版本
可以切换到对应的版本, 版本号支持模糊匹配
# xvm use [target] [version] xvm use python 3.12.3 xvm use python 2 # -> 2.7.18
xvm current | 查询当前版本
支持模糊匹配
# xvm current [target] xvm current p
xvm remove | 移除之前被添加的程序
这里的移除只是从xvm的版本数据库中删除记录
# xvm remove [target] [version] xvm remove pv 0.0.1
工作空间和环境隔离
目前xvm支持基于目录的工作空间, 可以和全局工作空间进行隔离(默认有一个全局工作空间)
基础命令
创建工作空间
# xvm workspace [target] xvm workspace test
注: 工作空间, 默认时激活和继承全局工作空间版本情况的
设置当前工作空间激活状态
当工作空间未激活时就会使用默认的全局空间, 激活时会覆盖全局空间
# xvm workspace [target] xvm workspace test --active false xvm workspace test --active true
设置当前工作空间是否继承全局空间
# xvm workspace [target] xvm workspace test --inherit false xvm workspace test --inherit true
使用场景
在指定目录创建工作空间, 使用特定的版本
# 假设全局空间中python使用的版本是3 xvm workspace test # 创建工作空间 xvm use python 2 # 切换python版本 xvm current python # 查询当前版本 python --version # 验证 - python2 cd .. python --version # 返回上级目录/版本会自动切换到全局版本python3
其他
临时关闭xvm版本管理功能
通过设置全局workspace的状态, 可以控制xvm的版本管理是否生效
xvm workspace global --active false xvm workspace global --active true
-
现代C++项目开发初识——记项目Orignal大改造感觉关于项目相关的工程 (软件工程) 方面的东西是挺重要的
- 目录结构
- 单元测试
- 文档
- 构建
- ...
了解这些后。要自己开发项目或要去使用/阅读一些其他项目, 就能很快上手并理解很多项目的结构以及他们为什么那么做
(有时间感觉可以尝试把文章的一些内容 录成视频分享到视频平台, 应该会有不少人感兴趣)
-
Blogs | 博客版本创建与申请@FrozenLemonTee 个人博客版本已经创建, 请确认是否可用
地址: https://forum.d2learn.org/category/19/frozenlemontee-s-blog
-
Blogs | 博客版本创建与申请@sky-littlestar 个人博客版本已经创建, 请确认是否可用
地址: https://forum.d2learn.org/category/18/maxwell1905-s-blog
-
Blogs | 博客版本创建与申请与博客版本创建与申请相关话题的 - 留言&讨论&交流
-
為甚麼我不能輸入xling的指令:(。如果是github仓库可以gitee仓库不可以, 可能就是网络问题。后面或许要加一个命令用户切换索引仓库地址
-
為甚麼我不能輸入xling的指令:(。第一次使用, 会自动下载包索引仓库, 这个上面显示clone失败了。可以按下面操作手动clone一下试一试
进入xim目录
cd C:\users\public\.xlings_data\xim
注: 如果.xlings_data目录下没有xim目录可以手动创建一个
clone包索引仓库
git clone https://github.com/d2learn/xim-pkgindex.git
-
[project-graph]: 通过xlings/xim工具安装project-graph不同版本的方法 - 支持windows/ubuntu/archlinux查询可以安装的版本
xim -s project-graph
-
[project-graph]: 通过xlings/xim工具安装project-graph不同版本的方法 - 支持windows/ubuntu/archlinux现在已经把
project-graph
添加到了xim-pkgindex包索引仓库(详情见此贴), 下面是不同版本的安装方法注: xlings工具安装见 - 开源仓库README / 工具主页
最新开发版/nightly版本
可以通过指定
nightly
来安装最新的版本, 这个版本是每天基于最新代码进行打包的版本, 能体验到最新的功能xim project-graph@nightly
默认最新稳定版
xim project-graph
指定版本1.0.0版本
xim project-graph@1.0.0
卸载命令:
xim -r project-graph
-
xlings: xim: 增加Project-Graph图/节点绘制工具到xim-pkgindex索引仓库issues: https://github.com/d2learn/xim-pkgindex/issues/10
pull-request: https://github.com/d2learn/xim-pkgindex/pull/9
xpkg包文件: https://github.com/d2learn/xim-pkgindex/blob/main/pkgs/p/project-graph.lua
基础信息 | Basic Info
- 名称: project-graph
- 协议: mit license
- 简介: 快速绘制节点图的桌面工具,可以用于项目进程拓扑图绘制、快速头脑风暴草稿
- 主页: https://project-graph.top
- 仓库地址: https://github.com/LiRenTech/project-graph
- 支持平台: windows / linux / macos
- d2learn交流版块: https://forum.d2learn.org/category/16/project-graph
XPackage's Pull-Request
- #9
本地测试信息 | Local Test Info
Paste your test console information or picture here (note: xpakcage is your xpackage's filename
ubuntu测试
step1:
xim --add-xpkg yourPath/xpackage.lua
test add to pkgindex database for xpackage
ubuntu
step2:
xim -s xpackage
test search for xpackage
ubuntu
[xlings:xim]: search for *project-graph* ... { "project-graph@1.0.0" = { }, "project-graph@nightly" = { }, "project-graph@1.1.0" = { "project-graph@latest", "project-graph" } }
step3:
xim -i xpackage
test install for xpackage
ubuntu
step4:
xim -i xpackage
test installed for xpackage
step5:
xim -l xpackage
test list for xpackage
speak@speak-pc:~/workspace/github/d2learn/xim-pkgindex$ xim -l project-graph -> project-graph@1.1.0 (project-graph@latest, project-graph)
step6:
xim -r xpackage
test remove/uninstall for xpackage
step7:
xim -r xpackage
test uninstalled for xpackage
-
xlings: xim: xpkg增加自动匹配github上release的url功能在包文件的xpm资源描述字段, 可以使用
github_release_tag
指定github上release的tag, 然后url就会变成一个支持正则表达的pattern, 能自动匹配release页面的特定文件例如下面这个包文件中使用这个功能可以在不修改包文件的情况下获取到最新的nightly版本
- windows - 使用"%.exe$"匹配对应的exe安装包
- linux - 使用"%.deb$"匹配deb安装包
具体的url匹配规则可以基于正则表达式自定义
package = { homepage = "https://project-graph.top", name = "project-graph", description = "快速绘制节点图的桌面工具 - 项目进程拓扑图绘制、头脑风暴草稿", maintainers = "LiRenTech", contributors = "https://github.com/LiRenTech/project-graph/graphs/contributors", licenses = "MIT", repo = "https://github.com/LiRenTech/project-graph", docs = "https://project-graph.top/getting-started", forum = "https://forum.d2learn.org/category/16/project-graph", -- xim pkg info type = "package", -- package, auto-config archs = {"x86_64", "aarch64"}, status = "stable", -- dev, stable, deprecated categories = {"desktop-tools", "graph-tools"}, xpm = { windows = { ["latest"] = { ref = "1.1.0" }, ["nightly"] = { url = "%.exe$", -- url pattern github_release_tag = "nightly", }, .... }, debian = { ["latest"] = { ref = "1.1.0" }, ["nightly"] = { url = "%.deb$", -- url pattern github_release_tag = "nightly", ... }, ubuntu = { ref = "debian" }, archlinux = { ref = "debian" }, manjaro = { ref = "debian" }, }, } ...
完整的包文件: https://github.com/d2learn/xim-pkgindex/blob/main/pkgs/p/project-graph.lua
-
run命令找到了文件但报错failed(-1)@Moe-Form 问题已修复, 可以重新安装覆盖老的版本后再试一试
问题原因
windows的路径问题
\
被识别成转义字符代码修复的commit
https://github.com/d2learn/xlings/commit/713a96d67cdfa92a7b9234738ed7952a65554c8f
测试截图
-
run命令找到了文件但报错failed(-1)可能是一个bug我排查一下
-
[安装问题]在弹出安装成功后显示Path already contains -
xlings: 如何添加一个XPackage到包索引仓库(xim-pkgindex)? - 不止软件安装, 还有环境配置欢迎把你开发/喜欢的工具软件或一些环境的配置添加到XIM的包索引仓库中, 让更多人能一键下载安装和配置环境
目录
- 第一步: 创建个Add XPackage & 填写基础信息
- 第二步: 复制一份包模板文件
- 第三步: 修改文件名和包内容 (可以参考仓库中的包或xpackage规范示例)
- 第四步: 对包内容进行测试
- 添加包到索引数据库:
xim --add-xpkg yourLocalPath/filename.lua
- 搜索测试:
xim -s filename
- 安装测试:
xim -i filename
- 已经安装测试:
xim -i filename
(会显示包已安装) - 安装列表测试:
xim -l filename
- 卸载测试:
xim -r filename
- 已卸载测试:
xim -r filename
(会显示包没有安装)
- 添加包到索引数据库:
- 第五步: 当第四步通过后, 把测试信息补充到第一步中创建的问题里
- 第六步: fork项目, 并把包文件放到
pkgs
目录下的对应位置 - 第七步: 发起合入Pull-Request, 把PR地址补充到问题里并在评论区@项目维护人员
- 第八步: TODO (reviewer本地验证&approval)
xlings开源仓库: https://github.com/d2learn/xlings
xim包索引仓库: https://github.com/d2learn/xim-pkgindex
第一步 - 创建一个Add XPackage
在
xim-pkgindex
的issues创建选择界面选择Add XPackage
模板并先填写包的基础信息- 包名
- 包的简短描述
- 主页
- 开源 or 闭源
- 仓库
- 协议
- ...
第二步: 复制一份包模板文件
复制一份包模板文件。一个包文件有两大部分组成: package + hooks/actions, 并且包文件的语法对应的就是lua语言的基础语法(并不需要特殊学习lua, 只要参考已有的包里的用法即可)
package域
基础信息描述部分
基础信息部分主要是要来描述和记录这个包的相关信息的。**这些信息会在安装的时候进行显示, 但是他们不会实质的影响安装的过程。**但为了包的完整度应该尽可能的填写相关字段(至少包含
name
、description
、type
、keywords
)。具体格式如下:package = { -- base info homepage = "https://example.com", name = "package-name", description = "Package description", authors = "Author Name", maintainers = "Maintainer Name or url", contributors = "Contributor Name or url", license = "MIT", repo = "https://example.com/repo", docs = "https://example.com/docs", -- xim pkg info type = "package", -- package, auto-config archs = {"x86_64"}, status = "stable", -- dev, stable, deprecated categories = {"category1", "category2"}, keywords = {"keyword1", "keyword2"}, date = "2024-12-01", --... }
平台&依赖&资源描述部分 - xpm
xpm字段描述了这个包支持的具体的平台, 以及每个平台上安装这个包需要的依赖和网络资源。这个部分会实质性的影响安装过程且没有描述的平台/系统和版本将不会添加到用户的本地索引数据库中, 即不可查询和安装
- 系统名是xpm的中的key, 表示要支持的系统/平台
- 系统key对应的值包含:
- deps是可选项, 用来描述这个包在对应平台下需要的依赖(这些依赖需要已经在索引仓库中)
- 版本项也是kv结构
["key"] = {"url", "sha256"}
- 它的key的格式一般为
x.x.x
其中x是数字, 也可以用latest
描述(用户默认安装的版本) - 它的值的格式为一对字符串, 第一个是网络资源url, 第二个为这个资源对应的sha256校验码(为可选项, xim会自动的下载资源并校验, 路径会存在pkginfo.install_file中)
- 它的key的格式一般为
- 在xpm的中系统字段和版本字段支持同级引用, 如:
["latest"] = { ref = "1.0.1"}
latest对应的值将会是1.0.1
里的值
package = { -- ... xpm = { windows = { deps = {"dep1", "dep2"}, ["1.0.1"] = {"url", "sha256"}, ["1.0.0"] = {"url", "sha256"}, }, ubuntu = { deps = {"dep3", "dep4"}, ["latest"] = { ref = "1.0.1"}, ["1.0.1"] = {"url", "sha256"}, ["1.0.0"] = {"url", "sha256"}, }, }, }
注:
1.latest版本一般会使用ref引用到一个具体的版本上
2.如果没有网络资源时(例如是auto-config包)可以填写一个空列表。如:
["1.0.1"] = { },
hooks/actions域
hooks域主要是安装或卸载时实际对应的lua函数, 最少要包含:
installed
、install
、uninstall
这三个函数, 他们描述了包对应动作下的具体行为。installed
用来检测对应版本是否被安装, 支持返回true/false或直接返回包含版本的字符串, 框架中会自动的检测字符串是否包含对应的版本号, 常用的实现是直接返回
os.iorun("program --version")
。对于无法直接获取版本号的包/软件, 可以通过代码自行判断并和当前要执行的版本号进行对比, 然后返回true或falsefunction installed() -- ... end
install/uninstall
install和uninstall主要是对应的安装和卸载, 可以使用lua代码对资源文件进行操作。通常使用os.exec函数等同与命令行
注: 所有的hooks都运行在和所下载资源的同级目录
第三步: 修改文件名和包内容 - mdbook包文件示例
把包模板文件重命令为
mdbook.lua
并修改文件内容mdbook安装的核心逻辑是, 把解压出来的执行文件复制到系统的bin目录或其他已经添加到path环境变量中的路径里
添加mdbook基础信息
package = { -- base info name = "mdbook", description = "Create book from markdown files. Like Gitbook but implemented in Rust", authors = "Mathieu David, Michael-F-Bryan, Matt Ickstadt", contributors = "https://github.com/rust-lang/mdBook/graphs/contributors", license = "MPL-2.0", repo = "https://github.com/rust-lang/mdBook", docs = "https://rust-lang.github.io/mdBook", -- xim pkg info type = "package", categories = {"book", "markdown"}, keywords = {"book", "gitbook", "rustbook", "markdown"}, }
添加xpm基础信息
- 主要支持平台为: windows, linux(ubuntu, debian, archlinux)
- mdbook没有依赖, 所以不需要deps字段
- 把mdbook的不同平台的二进制执行文件包的url添加到对应版本的value中
- windows支持0.4.40, debain支持0.4.40, 0.4.43版本
- 设置每个平台下的latest版本对应的具体版本, windows上ref到
0.4.40
, debain上ref到0.4.43
- 由于mdbook支持所有linux系统, 所以
ubuntu, archlinux
可以直接ref到debian
package = { -- ... xpm = { windows = { ["latest"] = { ref = "0.4.40" }, ["0.4.40"] = { url = "https://gitee.com/sunrisepeak/xlings-pkg/releases/download/mdbook/mdbook-v0.4.40-x86_64-pc-windows-msvc.zip", sha256 = nil } }, debain = { ["latest"] = { ref = "0.4.43" }, ["0.4.43"] = { url = "https://github.com/rust-lang/mdBook/releases/download/v0.4.43/mdbook-v0.4.43-x86_64-unknown-linux-gnu.tar.gz", sha256 = "d20c2f20eb1c117dc5ebeec120e2d2f6455c90fe8b4f21b7466625d8b67b9e60" }, ["0.4.40"] = { url = "https://github.com/rust-lang/mdBook/releases/download/v0.4.40/mdbook-v0.4.40-x86_64-unknown-linux-gnu.tar.gz", sha256 = "9ef07fd288ba58ff3b99d1c94e6d414d431c9a61fdb20348e5beb74b823d546b" }, }, archlinux = { ref = "debain" }, ubuntu = { ref = "debain" }, }, }
编写mdbook的hooks函数
- 使用import语法导入xim的platform模块, 用于获取系统的bin目录
- 由于mdbook的压缩包解压出来就是一个mdbook的可执行文件, windows上为
mdbook.exe
, linux上为mdbook
。所以使用lua语法定义局部变量mdbook_file用于表示不同平台下的对应的文件名 - 实现
installed
函数: mdbook本身可以用mdbook --version
查询当前版本, 所以这里就执行返回os.iorun("mdbook --version")
这个命令运行后的字符串就可以了 - 实现
install
函数: 并且xim的框架会自动的解压下载的压缩包, 所以实际的安装就是复制这个可执行文件到bin目录 - 实现
uninstall
函数: 同理卸载mdbook, 就是直接把这个文件删除
-- package... import("platform") local bindir = platform.get_config_info().bindir local mdbook_file = { windows = "mdbook.exe", linux = "mdbook", } function installed() return os.iorun("mdbook --version") end function install() os.cp(mdbook_file[os.host()], bindir) return true end function uninstall() os.tryrm(path.join(bindir, mdbook_file[os.host()])) return true end
注: 更多复杂的包文件实现, 可以参考索引仓库中的其他包文件
第四步: 对包内容进行测试
通过把包文件添加到索引数据库进行相关操作的测试和验证
添加包到索引数据库
xim --add-xpkg yourLocalPath/mdbook.lua
示例
speak@speak-pc:~$ xim --add-xpkg mdbook.lua [xlings:xim]: convert xpkg-file to runtime path - mdbook.lua [xlings:xim]: add xpkg - /home/speak/mdbook.lua [xlings:xim]: update index database
搜索测试
检测是是否能正常显示包可安装的版本
xim -s mdbook
示例
speak@speak-pc:~$ xim -s mdbook [xlings:xim]: search for *mdbook* ... { "mdbook@0.4.40" = { }, "mdbook@0.4.43" = { "mdbook", "mdbook@latest" } }
安装测试
执行包的安装命令测试资源和hooks函数是否正常执行
xim -i mdbook
示例
speak@speak-pc:~$ xim -i mdbook [xlings:xim]: create pm executor for mdbook ... --- [package] info name: mdbook version: 0.4.43 authors: Mathieu David, Michael-F-Bryan, Matt Ickstadt contributors: https://github.com/rust-lang/mdBook/graphs/contributors license: MPL-2.0 repo: https://github.com/rust-lang/mdBook docs: https://rust-lang.github.io/mdBook Create book from markdown files. Like Gitbook but implemented in Rust -> install mdbook? (y/n)
命令会执行如下动作
- installed
- download - 不需要实现
- build - 可选
- install
- config - 可选
安装完成后可以, 重新打开一个窗口(刷新环境), 再次运行安装看是否会重复安装
安装列表测试
执行list命令, 查看被安装的版本是否正确
xim -l mdbook
speak@speak-pc:~$ xim -l mdbook -> mdbook@0.4.43 (mdbook@latest, mdbook)
卸载测试
测试卸载功能
xim -r mdbook
示例
speak@speak-pc:~$ xim -r mdbook [xlings:xim]: create pm executor for mdbook ... --- [package] info name: mdbook version: 0.4.43 authors: Mathieu David, Michael-F-Bryan, Matt Ickstadt contributors: https://github.com/rust-lang/mdBook/graphs/contributors license: MPL-2.0 repo: https://github.com/rust-lang/mdBook docs: https://rust-lang.github.io/mdBook Create book from markdown files. Like Gitbook but implemented in Rust -> uninstall/remove mdbook? (y/n) y xxx [xlings:xim]: mdbook - removed 反馈 & 交流 | Feedback & Discourse (if encounter any problem, please report it) https://forum.d2learn.org/category/9/xlings https://github.com/d2learn/xlings/issues [xlings:xim]: update index database
同理, 卸载后可以在此执行卸载命令进行测试是否能检测到包已经被卸载
第五步: 把测试信息补充到第一步中创建的问题里
把第四步中测试的log或则截图补充到第一步创建的issue里
第六步: 索引仓库和包文件位置
fork包索引仓库xim-pkgindex, 并把包文件放到
pkgs
目录下的对应字母目录索引仓库是按文件名的首字母进行分类的
第七步: 发起合入请求
- 先把添加的文件提交到自己fork的仓库
- 发起合入的Pull-Request
- 把PR地址补充到问题里
- 在评论区@项目维护人员
第八步: TODO (reviewer本地验证&approval)
交流讨论 & 验证通过后合入仓库
第九步: 更新本地索引数据库
xim会自动同步最新的包索引数据库到本地, 然后就可以对该包进行管理了
xim --update index
-
pwn-0x00(C语言是如何进行函数调用的)@妈耶厥了 可以再加一个参数, 显示函数传参是怎么完成的
-
如何使用ImGui中的DrawList制动一个动画控件? - Loading动画控件https://github.com/Sunrisepeak/Hanim/blob/main/old_project/ImGui.hanim.hpp 这个里有具体实现
动画数据是用相对坐标生成的(假设开始是(0, 0)), 渲染的时候根据父窗口做平移
-
开源协议争议: 使用rust重写pre-commit项目引发的开源协议争议问题的思考和疑惑 -- 对于以有开源项目用其他语言重写的项目协议方面怎么界定? 不同角度是不是有不同看法?一、大概背景
一个开源作者对(MIT协议的)知名Python项目 pre-commit 使用rust进行了重写的一个项目pre-commit-rs, 然后原pre-commit作者给这个重写项目的issues中进了一个留言谈到了 "协议包含问题"、"hostile fork"、"道德问题"等 展开了一些交流
原作者似乎诉求是在重写项目中:
- 1.包含原项目的协议文件
- 2.不要使用pre-commit-rs这个名字
注: 总体来看似乎原项目作者和重写项目作者在项目的使用上理解是有偏差的, 但在原作者的提议下目前重写项目的作者已经按照诉求进行包含协议和修改项目名字
二、具体对话
原pre-commit作者
pre-commit重写项目作者
三、相关思考&问题
- 1.对于这种重写类项目协议上怎么界定比较好? 是不是这方面不同人有不同理解?
- 2.在协议的使用的实际操作上, 特别是项目早期 可能很多在协议的选择或对依赖关系的处理是不那么完善和严谨的? (这可能导致一些无意识下涉及到了协议争议问题)
- 3.假设这类协议争议问题发生时, 是否应该尽可能以包容/宽松的方式进行交流提醒?
四、Ref