以前に
import
を使って大きな文字列を別のファイルから読み込んだが、
同じ手を使って画像や動的リンクライブラリなどのテキストでないデータも読み込んで埋め込むことができるようだ。
Embed a dynamic library in an executable
リソースの埋め込みはWindowsならリソースコンパイラ、Linuxならobjcopyというのを使うもののようだが、 この方法はどちらでも使えて気軽でいいと思う。
$ tree
.
├── dub.json
├── resources
│ └── dman.png
└── source
└── app.d
2 directories, 3 files
dub.json
{
"name": "dman",
"authors": [
"kotet"
],
"description": "Dman",
"copyright": "Copyright © 2017, kotet",
"license": "MIT",
"stringImportPaths": [
"resources"
]
}
source/app.d
static immutable ubyte[] dman = cast(immutable ubyte[]) import("dman.png");
void main()
{
import std.file : write;
import std.uuid : randomUUID;
write("dman-" ~ randomUUID().toString() ~ ".png", dman);
}
$ ls
dub.json resources source
$ dub build
Performing "debug" build using dmd for x86_64.
dman ~master: target for configuration "application" is up to date.
To force a rebuild of up-to-date targets, run again with --force.
$ ./dman
$ ./dman
$ ./dman
$ ls
dman dman-88c57901-9ce1-4347-a9b7-774fc1faf7e8.png source
dman-212640dc-fde8-4abd-bf85-ea4a6ef2cbdd.png dub.json
dman-3049dffd-db30-4901-b9d9-b2d132f4c0a5.png resources
どこでも実行するたびにD言語くんのpng画像を生み出せるアプリケーションができた。