在Ruby gem的默认框架代码中,.gemspec
类内的Gem::Specification
文件有这一行:
spec.files = `git ls-files -z`.split("\x0")
< - 请注意此问题末尾的PS
当我在终端中运行git ls-files -z
时,我得到了
.gitignoreGemfileLICENSE.txtREADME.mdRakefiledogeify.gemspeclib/dogeify.rblib/dogeify/version.rb
.split("\x0")
方法究竟产生什么作为输出?
PS:参考第一行代码,``字符是否允许终端执行代码并将结果与Ruby方法结合起来?
答案 0 :(得分:11)
git(1)帮助说:
$ git help ls-files
[...]
-z
\0 line termination on output.
因此,当您说git ls-files -z
时,它会列出零字节的文件作为文件名之间的分隔符。当您说find ... -print0
或使用xargs -0
时,您会看到类似格式的输出。您使用零字节作为分隔符的原因是它们不能出现在文件名中,但任何其他分隔符(例如空格)都可以。
然后回到Ruby,你需要解压缩\x0
- 分隔列表。如果你string.split("\x0")
,你将在零字节(string
)上分开"\x0"
并将这些部分作为数组返回;例如:
> "where\x0is\x0pancakes\x0house?".split("\x0")
=> ["where", "is", "pancakes", "house?"]
因此,git ls-files -z
会为您提供文件名之间零字节的文件列表,split("\x0")
会将该字符串分解为文件名数组。