描述bug
在尝试为新组件编写文档时,组件搜索失败
BUG:
一个大的红色弹出窗口,白色文本开始
在项目中搜索组件时发生错误。ENAMETOOLONG:名称太长,scandir '/
IMPACT:
无法使用UI为任何用户记录任何组件
可能对任何主机上的任何用户发生
SYMPTOMTS:
-1列出的路径远离项目目录,但位于项目所在根文件系统目录中
-2故事板出于某种原因扫描项目目录之外的目录
-3此BUG可对任何用户在任何主机上发生
显然,扫描不会过滤循环符号路径。需要绝对路径Map
文件系统不保证特定节点的路径唯一性,即使解析了符号链接,因此必须实现递归限制,如Go限制为100个符号链接
CAUSE:
Storybook决定扫描文件系统中的一些允许使用符号链接的操作,但无法成功完成
复现链接
N/A
复现步骤
安装纯故事书
在浏览器的故事书中,点击“查找组件”搜索框旁边的“+下一步”按钮
在lightbox中添加一个新故事./components/**/*.tsx搜索框,输入一个字符
5条答案
按热度按时间u5rb5r591#
看起来是由于Go项目中的一个伪GoPATH目录结构最终被相对父目录中的go.mod符号链接回自己的xyz导致的。
在这里,可以对scandir代码进行建模,参考Go的filepath.EvalSymlinks https://pkg.go.dev/path/filepath#EvalSymlinks
@google写道,它可以工作。这段代码遍历任何内容,避免了循环路径的递归。它没有包括最新的学习成果,但不会崩溃。我不知道其他人是否也在这样做。比如@facebook并不这样做。
https://pkg.go.dev/github.com/haraldrudell/parl@v0.4.184/pfs#Traverser
遍历符号链接是一个巨大的问题空间。这段代码可以很容易地转换为ECMAScript,并且每次都可以正常工作。
rlcwz9us2#
我能够在沙箱中重现这个问题:
.gitignore
中移除/sandbox
button
=> 它会返回一堆结果ln -s ../../.. boom
button
=> 它会卡住 -- 我觉得它是无限遍历符号链接我尝试在
globby
中添加以下选项,但它没有解决问题:当我从选项中移除
gitignore: true
时:followSymLinks
被尊重)因此,似乎
globby
gitignore 是有问题且引入了性能退化。我在想我们能否在globby
中得到修复?mwyxok5s3#
在我看来,设置
followSymbolicLinks: false
不是一个选项。符号链接很常见,而且在正确设置的情况下,它们通常不会引起循环。既然
globby
尊重用户的 .gitignore 文件,那么在 .gitignore 文件中添加一个进一步的条目是否可以解决这个问题,从而排除符号链接的文件夹?@shilman 另外,你能尝试一下 deep 选项吗?默认情况下,它被设置为
Infinity.
。也许我们应该将文件夹深度限制在例如 100 以内。d6kp6zgx4#
@haraldrudell 为了让你知道背景:我们没有自己实现glob搜索,而是依赖于globby库。如果你认为循环符号链接应该以不同的方式处理,那么我认为在那里打开一个bug报告是有意义的,除非globby本身无法配置它。
x33g5p2x5#
@valentinpalkovic ,我认为
deep
不是一个好的解决方案。deep: 50
仍然会崩溃,而deep: 20
可以工作,但每次搜索需要10秒才能完成。这个bug对我来说很重要,因为我想将
fileSearch
作为遥测的一部分使用,我需要它具有高性能。它可以在每天启动时运行一次(我会缓存结果)。我想我可以只为遥测情况传递followSymbolicLinks: false
,然后我们可以将其留给true
进行搜索 UI。但是遗憾的是,gitignore 与followSymLinks
不兼容。