配信ファイルをバイナリに取り込める静的ファイルサーバ
https://gyazo.com/f71cffd2e4f237030e7f6c745ce3eeeb
https://gyazo.com/d41fdb81ab57a2eb548ea7993ba9746a
file://プロトコルでは使えないブラウザの機能を使いたい、などの理由で、ローカルに置かれているファイルを雑にホストしたいことがあります。pythonやrubyでワンライナーを書いたり、Nodejsで書かれたserveなどのツールを利用することが多いでしょう。しかし、これらの方法では、実行するためにランタイムが必要になってしまいます。
everestはシングルバイナリで動作するマルチプラットフォームな静的ファイルサーバです。そのため、いかなるランタイムにも依存せず、WindowsでもmacOSでもLinuxでも、バイナリをダウンロードして実行すれば使えます。便利ですね。 ...というのは誰でも思いつくことです。
さて、静的ファイルサーバがシングルバイナリで動いても、結局ホストするHTMLやJavaScriptファイルは依然として必要になってしまいますね。もし、これらのファイルまで含めてシングルバイナリで動作する静的ファイルサーバがあるとしたらすごくないですか?
everestは上記の通り、ローカルファイルをホストするような通常の静的ファイルサーバとしても利用できますが、配信するファイルをバイナリに取り込むことで真のシングルバイナリを実現するという特徴を持っています。
具体的には
code: everest.sh
$ everest path/to/files
で通常の静的ファイルサーバとして、指定したパスのファイルを配信しますが、
code: everest2.sh
$ everest rebuild-with path/to/files
$ everest # if you execute everest with no arguments, imported files are served.
とやるとファイルがバイナリに取り込まれ、以降は元のファイルを削除しても配信できるようになります。魔法のようですね。
トリックとしては、rebuild-withコマンドを実行したときに、everestは
指定されたパスのファイルを、内容をバイト列として変数に格納したGoのファイルに変換
自分自身を上記Goファイル含めて再ビルドし、生成されたバイナリを自分自身と置き換える
ということをやっています。自分自身を再ビルドするために、everest自体のコードもGoのファイルとしてバイナリに含まれています。