概括
--ignore=<regex>
我放入的行.stowrc
不起作用。运行 Stow 时,它显示“从 .stowrc 加载默认值”,但没有任何效果。但是--ignore=<regex>
直接将行传递给命令是可行的。
问题
假设这个目录:
user@user-machine:~/test-stow/stow$ tree -a
.
├── a
│ └── car
└── .stowrc
1 directory, 2 files
内容./.stowrc
:
--ignore='car'
所以我的期望是,在该目录中运行命令stow --verbose=3 a/
相当于在文件不存在stow --ignore='car' --verbose=3 a/
时运行。./.stowrc
现在我运行:
user@user-machine:~/test-stow/stow$ stow --verbose=3 a
Loading defaults from .stowrc
stow dir is /home/user/test-stow/stow
stow dir path relative to target /home/user/test-stow is stow
cwd now /home/user/test-stow
cwd restored to /home/user/test-stow/stow
cwd now /home/user/test-stow
Planning stow of package a...
Stowing contents of stow/a (cwd=~/test-stow)
Stowing stow/a/car
LINK: car => stow/a/car
Planning stow of package a... done
cwd restored to /home/user/test-stow/stow
Processing tasks...
cwd now /home/user/test-stow
cwd restored to /home/user/test-stow/stow
Processing tasks... done
请注意,这做创建符号链接到,./car
尽管.ignore
./.stowrc
现在我通过运行撤消操作stow -D --verbose=3 a/
:
user@user-machine:~/test-stow/stow$ stow -D --verbose=3 a/
stow dir is /home/user/test-stow/stow
stow dir path relative to target /home/user/test-stow is stow
cwd now /home/user/test-stow
Planning unstow of package a...
Unstowing from . (cwd=~/test-stow, stow dir=stow)
Unstowing stow/a/car
car did not exist to be unstowed
Planning unstow of package a... done
cwd restored to /home/user/test-stow/stow
cwd now /home/user/test-stow
cwd restored to /home/user/test-stow/stow
Processing tasks...
如果我删除所有内容./.stowrc
并运行stow --verbose=3 --ignore='car' a/
,我会得到不同的结果:
user@user-machine:~/test-stow/stow$ stow --verbose=3 --ignore='car' a/
stow dir is /home/user/test-stow/stow
stow dir path relative to target /home/user/test-stow is stow
cwd now /home/user/test-stow
cwd restored to /home/user/test-stow/stow
cwd now /home/user/test-stow
Planning stow of package a...
Stowing contents of stow/a (cwd=~/test-stow)
Planning stow of package a... done
cwd restored to /home/user/test-stow/stow
Processing tasks...
现在的符号链接./car
是不是正如预期和期望的那样创建。
关于什么$HOME/.stowrc
?
将.stowrc
文件放在主目录中而不是$HOME/test-stow/stow
具有相同的效果;car
仍然会创建到该文件的符号链接。
忽略列表
$HOME/test-stow/stow/.stow-local-ignore
使用内容为“car”的文件而不是该.stowrc
文件也不起作用。car
仍然会创建指向该文件的符号链接。
GNU 存储版本:2.2.0
Perl版本:perl 5,版本 18
更新
这里这是我对亚当·斯皮尔斯的回答的回复。
答案1
感谢您提供出色的错误报告!我可以回答您的问题,作为 Stow 维护者,我也可以解决这些问题,但我希望您能从用户体验的角度提供反馈,以便我们找到最佳解决方案。
首先,值得注意的是,它将--verbose=5
为您提供有关忽略机制内部结构的更多详细信息,尽管在这种情况下,它不足以解释为什么事情没有按照您期望的方式运行。
您的两个文件都不起作用的原因有两个.stowrc
:
- 解析器
.stowrc
根据空格字符而不是 来拆分(选项,值)对=
。因此该文件中忽略选项的行应该以--ignore
not开头--ignore=
。 - 解析器
.stowrc
不会自动去掉引号。当--ignore
选项(或任何其他选项)通过 CLI 传递时,shell 将在 Stow 看到引号之前将其去除。这就是它在那里起作用的原因。
因此,这两者的组合意味着您.stowrc
应该包含:
--ignore car
我已经测试过了,确实有效。
现在,可能有有效的论据表明这两点中的任何一个甚至两个实际上都是用户体验错误。我当然同意他们不提供直观的用户界面。问题是是否应该改变行为,或者是否最好在文档中更清楚地说明这一点。
我目前的想法是基于波斯特尔定律,解析器应该接受空格和 的分割=
,但它不应该去掉引号,因为如果用户确实想要忽略'car'
而不仅仅是忽略怎么办car
?还有一个现有的和相关的带有空格的选项会中断的错误报告stowrc
,因此在实施任何修复时都应考虑到这一点。 (发布此答案后,我将更新该错误。)
我欢迎您对这些提出意见。
最后,我相信你的.stow-local-ignore
方法不起作用,因为你将它放在 stow 目录中而不是放在a/
package 目录中。关于这一点的文档对我来说似乎很清楚,所以我认为将其作为飞行员错误注销是公平的。但是,如果您对如何使文档更清晰有任何建议,我会洗耳恭听。
再次感谢!顺便说一句,将来您可能需要考虑将错误报告发送至邮件bug-stow
列表(或者可怕但道德正确的萨凡纳错误追踪器或到不太道德但更有用的 github 问题跟踪器)和帮助请求邮件help-stow
列表。是的,我知道对于这样一个小而安静的项目来说,这些选择太多了;这是另一天的待办事项......