# ember **Repository Path**: upnoeup/ember ## Basic Information - **Project Name**: ember - **Description**: 第一次尝试翻译 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-01-07 - **Last Updated**: 2021-01-07 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README **ember** Ember是一个轻量级级库和工具,用于在运行时将任意资源嵌入到Go可执行文件中。资源不需要在编译时存在。 支持嵌入二进制文件(如:zip存档和可执行文件)。 **用例** 应用程序通常需要将运行时或用户自定义的配置和资源与可执行文件存储在一起。 这迫使最终用户在复制、移动或分发应用程序时需处理多个文件。它还允许最终用户操作这些附件,但这并不总是可取的。 ember的主要用例是在运行时将这些配置文件和其他资源与应用程序绑在一起。当有新配置时,不需要设置Go工具链来(重新)构建应用程序。 **跨平台** Ember是真正的跨平台。它支持任何操作系统,也可以跨平台进行嵌入资源。 这意味着文件可以附加到windows和linux上的windows可执行文件,反之亦然。 **使用** Ember 有两部分构成。 1、应用导入Ember包,然后接受附件。 2、ember/embedding 包由一个单独的应用程序使用,该应用程序将文件附加到已编译的目标可执行文件。 这个包可以作为一个库使用。另外,在ember/cmd/embedder有一个CLI工具。 **例子** 下面的例子也可以在examples/list找到。 从目标应用程序中访问嵌入的文件 ``` package main import ( "fmt" "io" "log" "os" "github.com/maja42/ember" ) func main() { attachments, err := ember.Open() if err != nil { log.Fatal(err) } defer attachments.Close() fmt.Printf("Executable contains %d attachments\n", attachments.Count()) contents := attachments.List() for _, name := range contents { s := attachments.Size(name) fmt.Printf("\nAttachment %q has %d bytes:\n", name, s) r := attachments.Reader(name) io.Copy(os.Stdout, r) fmt.Println() } } ``` **将文件嵌入到目标可执行文件中** 要将文件嵌入到编译过的go可执行文件中,你可以使用cmd/embedder命令行工具。 另外,您还可以通过导入ember/embedding将内嵌逻辑集成到您自己的应用程序中(更多信息,请参阅GoDoc)。 要使用cmd/embedder,首先创建一个attachments.json文件描述要嵌入的文件: ``` { "file A": "path/to/file A.txt", "file B": "path/to/file B.txt" } ``` 然后,将这些文件附加到一个已经构建好的可执行文件上: ``` cd cmd/embedder go build ./embedder -attachments ./attachments.json -exe ./myApp -out ./myFinishedApp ``` **它的工作原理是什么?** ember使用了一种非常原始的方法来嵌入数据,以支持任何平台,并且独立于go版本、编译器、链接器等。 当嵌入时,可执行文件只需在末尾附加额外的数据即可修改。为了检测原始可执行文件和附件之间的边界,在它们之间插入了一个特殊的标记字符串(魔法字符串)。 ``` +---------------+ | | | original | | executable | | | +---------------+ | marker-string | +---------------+ | TOC | +---------------+ | marker-string | +---------------+ | file1 | +---------------+ | file2 | +---------------+ | file3 | +---------------+ ``` 当启动应用程序并打开附件时,将打开可执行文件并搜索特定的标记字符串。 追加到可执行文件的第一个blob是一个TOC(table of contents),它列出了所有文件、它们的大小和字节偏移量。 这允许迭代和读取单个附件,而无需遍历整个可执行文件。 它还比较大小和偏移量,以确保可执行文件是一致和完整的。 之后的所有内容为附件中的数据。 ember还执行各种安全检查,以确保生成的可执行文件能够正常工作: -检查导入的应用程序是否兼容maja42/ember -确保可执行文件没有包含附件 这种方法还允许使用exe-packer(压缩器)和代码签名。