いろいろ備忘録日記

主に .NET とか Go とか Flutter とか Python絡みのメモを公開しています。

Goメモ-215 (archive/tar を使ったtarファイル生成サンプル)

概要

たまーに使うことがあるので、忘れないうちにメモメモ。

/*
   archive/tar の サンプルです。

   REFERENCES:
     - https://pkg.go.dev/archive/tar@latest
*/
package main

import (
    "archive/tar"
    "os"
    "time"
)

func _err(err error) {
    if err != nil {
        panic(err)
    }
}

func main() {
    // tar.Writer を 取得
    tw := tar.NewWriter(os.Stdout)

    // tar.Header を書き込み
    fh := tar.Header{
        Name:    "test.txt",
        Size:    11,
        Mode:    0644,
        ModTime: time.Now().Truncate(24 * time.Hour),
    }

    err := tw.WriteHeader(&fh)
    _err(err)

    // データを書き込み
    _, err = tw.Write([]byte("hello world"))
    _err(err)

    // 最後に Close() を呼んでおかないとtarファイルが生成できないので注意
    _err(tw.Flush())
    _err(tw.Close())
}

試すための Taskfile.yml (go-task用のファイル) は以下。

version: '3'

env:
  FILE_NAME: test.tar

tasks:
  default:
    cmds:
      - task: run
      - task: confirm
      - task: extract
      - task: clean
  run:
    cmds:
      - go run main.go > $FILE_NAME
  confirm:
    cmds:
      - file $FILE_NAME
      - tar -tf $FILE_NAME
  extract:
    cmds:
      - mkdir -p tmp
      - tar -xf $FILE_NAME --directory tmp
      - ls -l tmp
  clean:
    cmds:
      - rm $FILE_NAME
      - rm -rf tmp

実行すると以下のようになります。

gitpod /workspace/try-golang (master) $ task -d examples/singleapp/tarfilewrite/
task: [run] go run main.go > $FILE_NAME
task: [confirm] file $FILE_NAME
test.tar: POSIX tar archive
task: [confirm] tar -tf $FILE_NAME
test.txt
task: [extract] mkdir -p tmp
task: [extract] tar -xf $FILE_NAME --directory tmp
task: [extract] ls -l tmp
total 4
-rw-r--r-- 1 gitpod gitpod 11 Jun 20 00:00 test.txt
task: [clean] rm $FILE_NAME
task: [clean] rm -rf tmp

参考情報

taskfile.dev

最近Makefileの代わりに利用しているツールです。とても便利。


過去の記事については、以下のページからご参照下さい。

サンプルコードは、以下の場所で公開しています。