LoginSignup
14
2

More than 1 year has passed since last update.

はじめに

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

image.png

日本には28箇所のElixirコミュニティがあります

image.png

日程からイベントを探すならElixirイベントカレンダー:calendar:

image.png

  1. https://qiita.com/torifukukaiou/items/173a6d86d7a15649c5b5#fn-2

14
2
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
14
2