1. ホーム
  2. go

[解決済み] Goプログラムで静的リソースをバンドルする最良の方法は何ですか?

2022-08-21 20:14:10

質問

開発者のマシンでアプリケーションやウェブサービスをデバッグするためのツールとして使用することを目的として、Goで小さなウェブアプリケーションに取り組んでいます。このプログラムへのインターフェースは、HTML だけでなく、いくつかの JavaScript (機能用)、画像、CSS (スタイル用) を含むウェブページです。私はこのアプリケーションをオープンソースにすることを計画しているので、ユーザーは単にMakefileを実行するだけで、すべてのリソースが必要な場所に移動するようになるはずです。しかし、私はまた、できるだけ少ないファイル/依存関係で実行ファイルを単純に配布することができるようにしたいと思います。 HTML/CSS/JSを実行ファイルにバンドルする良い方法はないでしょうか、そうすればユーザーは1つのファイルだけをダウンロードして心配する必要があります。


今、私のアプリでは、静的ファイルを提供することは、少し次のようになります。

// called via http.ListenAndServe
func switchboard(w http.ResponseWriter, r *http.Request) {

    // snipped dynamic routing...

    // look for static resource
    uri := r.URL.RequestURI()
    if fp, err := os.Open("static" + uri); err == nil {
        defer fp.Close()
        staticHandler(w, r, fp)
        return
    }

    // snipped blackhole route
}

リクエストされたファイルが静的ディレクトリに存在する場合、ハンドラを起動し、単にファイルを開いて、良い Content-Type を設定しようとするだけです。私の考えは、これが実際のファイルシステムに基づく必要がある理由はないということです。コンパイルされたリソースがある場合、私は単にリクエスト URI によってインデックスを作成し、そのようにそれらを提供することができます。

これを行う良い方法がない場合、またはこれを行うことによって私が間違った木を吠えている場合、私に知らせてください。私はただ、エンドユーザーが、管理するためにできるだけ少ないファイルを評価するだろうと考えただけです。

よりも適切なタグがあるのであれば go よりも適切なタグがあれば、遠慮なく追加するか、私に知らせてください。

どのように解決するのですか?

go-bindataパッケージは、あなたが興味を持っているものである可能性があるように見えます。

https://github.com/go-bindata/go-bindata

これは、任意の静的ファイルをコードに埋め込むことができる関数呼び出しに変換することができ、呼び出されたときにファイルの内容のバイトスライスを返します。