0

所以...

我正在编写一个 ruby​​ 脚本来初始化生产主机以运行应用程序(创建用户组、用户、SSH 密钥等),但我一直在安装 NPM / Node。我不想使用包管理器来安装它,而是简单地获取我想要的版本(在本例中为 6.9.1)的 .tar.xz 文件并将其解压到我想要添加的二进制文件的位置走向我的道路。目前,我们将从Node 下载中获得它...

我找到了我用来尝试让我的脚本正常工作的这个SO 答案。看起来 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

...我绝对可以使用中间文件和更多系统命令(甚至只是一个 curl 调用,但我试图尽可能不使用系统调用)。我看到有我可以使用的 Gems 但我不想包含任何依赖项。关于实现优雅解决方案的任何想法?

4

1 回答 1

2

system太弱了。你想要IO::popen这个。

IO.popen(['tar', '-xJC', target_dir, '-f', '-'], 'wb') do |io|
  io.write(IO.binread(source))
end

popen将打开一个子进程,并让您io连接到它的标准输入/标准输出。不需要 FileUtils,-C选项告诉tar把东西放在哪里。

于 2016-12-02T00:56:47.287 回答