... SO
我正在编写一个ruby脚本来初始化生产主机以运行应用程序(创建用户组,用户,SSH密钥等),我仍然坚持安装NPM / Node。我不想使用包管理器来安装它,而是简单地获取我想要的版本的.tar.xz文件(在本例中为6.9.1)并将其解压缩到我想要的位置二进制文件添加到我的路径。目前,我们将从Node downloads ...
获取此信息我找到了this我正在使用的答案,试图让我的脚本正常工作。看起来Ruby没有开箱即用的方式来处理" .xz"文件,但我的Ubuntu发行版确实有一个更高版本的tar,所以它可以处理" tar -xJf ..."。我当时正想着做一些......
require 'fileutils'
require 'open-uri'
uri = "https://nodejs.org/dist/v6.9.1/node-v6.9.1-linux-x64.tar.xz"
source = open(uri)
data = system("cat", IO.binread(source), "|", "tar", "-xJf", "-")
# put data where I want using FileUtils
...我绝对可以使用中间文件和更多系统命令(甚至只是卷曲调用,但我尽量不使用系统调用)。我看到有可以使用的Gems,例如this,但我不想包含任何依赖项。有关实现优雅解决方案的任何想法吗?
答案 0 :(得分:2)
system
太弱了。你想要IO::popen
。
IO.popen(['tar', '-xJC', target_dir, '-f', '-'], 'wb') do |io|
io.write(IO.binread(source))
end
popen
将打开一个子进程,并将io
连接到其stdin / stdout。不需要FileUtils,-C
选项告诉tar
放置内容的位置。