はじめに
Elixir でtar.gz
ファイルを解凍するには:erl_tar.extract/2が便利なようです。
ちょっと癖があるので軽くまとめます。
論より Run。実際にイゴかしてみます。1
IEx(もしくはLivebook Desktop)を開く
Elixir言語をRunできる環境を準備します。
IExに使い慣れてる方はいつも通りに開きます。
初めての方にはLivebook Desktopが便利です。
iex
HTTP クライアントreqをインストール
複数あるElixirのHTTPクライアントの中で比較的使いやすいreqを使用します。
Mix.install([:req])
試しにNervesの.tar.gz
ファイルをダウンロード
tarball_url = "https://github.com/nerves-project/nerves_system_rpi0/releases/download/v1.20.0/nerves_system_rpi0-portable-1.20.0-F0DA416.tar.gz"
%{status: 200, body: compressed_data} = Req.get!(tarball_url)
compressed_data
解凍する
解凍方法は大きく分けて2通りあります。
:cwd
解凍結果をローカルのファイルシステムに保存するやり方です。
# 保存先のディレクトリ
tmp_dir = "tmp"
# 解凍結果の場所
root_dir = (
[
tmp_dir,
Path.split(tarball_url)
|> Enum.reverse()
|> hd()
|> String.trim_trailing(".tar.gz")
]
|> Path.join()
)
# 解凍する
:erl_tar.extract({:binary, compressed_data}, [:compressed, {:cwd, tmp_dir}])
# 解凍結果を検証
files1 = File.ls!(root_dir)
:memory
メモリー上で展開するパターンです。
# 解凍する
files2 =
with {:ok, decompressed} <-
:erl_tar.extract({:binary, compressed_data}, [:compressed, :memory]) do
decompressed
# ファイル名がcharlistなのでElixirで扱いやすいStringにする。
|> Enum.map(fn {file, content} -> {to_string(file), content} end)
# ファイル名で簡単にアクセスできるようMapにする。
|> Map.new()
end
# 解凍結果を検証
files2 |> Map.keys()
files2["nerves_system_rpi0-portable-1.20.0-F0DA416/.config"]
おわりに
:erl_tar.extract/2のご紹介をしました。
特別難しくはないですが暗記しづらい処理なのでこういったハンズオンの記事があると便利なんじゃないかな〜と思いまとめてみました。
自分用のメモですが、参考になれば幸いです。
Elixirを楽しみましょう!
Elixirコミュニティに初めて接する方は下記がオススメです
Elixirコミュニティ の歩き方 -国内オンライン編-
https://speakerdeck.com/elijo/elixirkomiyunitei-falsebu-kifang-guo-nei-onrainbian
日程からイベントを探すならElixirイベントカレンダー