Как (почему) gobuffalo/packr может работать во время сборки?
Я использую https://github.com/gobuffalo/packr для встраивания файлов шаблонов в свой двоичный файл golang. Рассмотрим этот упрощенный пример:
package main
import (
"github.com/gobuffalo/packr"
)
func main() {
foo, _ := packr.NewBox("./templates").FindString("text.tpl")
println(foo)
}
Согласно документации packr, нужно запустить packr2
для предварительной обработки файлов шаблонов, чтобы они могли быть прочитаны и встроены обычным go-компилятором при последующем запуске.
Однако у меня НЕ установлен репозиторий packr или сам двоичный файл. Эта строка импорта в коде golang - единственная ссылка на packr на моей машине. И все же бегомgo install
по-прежнему создает двоичный файл с правильно встроенными шаблонами.
Вопрос: Как такое может быть? Какой механизм здесь использует packr для вызова во время регулярной сборки?
(Первоначально я предполагал, что packr может просто использовать некоторую магию init() для запуска предварительной обработки. Я также поигрался с аннотациями go-generate, чтобы воспроизвести это поведение. Оба эксперимента не увенчались успехом - функции init() не запускаются во время сборки; и go-generate нужно вызывать явно. Это наводит меня на мысль, что здесь packr использует несколько более тонкую магию.)