Как я могу запустить / вызвать Makefile из кода golang?

#go #makefile #protocol-buffers #proto

#Вперед #makefile #протокол-буферы #прото

Вопрос:

Мне нужно скомпилировать файлы proto и динамически генерировать файлы pb. У меня есть мои команды протокола в Makefile. Я планирую запустить это из функции golang init().

Как я могу вызвать этот Makefile из моего кода golang? Пытался найти решение, но все они подсказывают, как я могу добиться этого наоборот.

Спасибо.

Комментарии:

1. поместите сгенерированные вами файлы в зависимость от вашей команды go. добавьте команду для создания ваших файлов, и это сделает свое дело

2. Использовать godoc.org/os/exec для выполнения таких команд, как make. Компиляция протофайлов является одним из вариантов использования go generate команды . Смотрите blog.golang.org/generate

Ответ №1:

В качестве продолжения того, о чем упоминал Muffin Top, я добился этого, используя приведенный ниже код:

 import (
    "bytes"
    "fmt"
    "log"
    "os/exec"
)

func init() {
    e := exec.Command("make", "all")
    var out bytes.Buffer
    e.Stdout = amp;out
    err := e.Run()
    if err != nil {
        log.Fatal(err)
    }
    fmt.Printf("Output: %qn", out.String())
}
  

Ответ №2:

Вы должны использовать синтаксис go:generate:

 package main

//go:generate protoc bla bla bla
  

Когда вы запускаете свою команду «go build», она запускает все в вашем коде с префиксом //go:generate

https://golang.org/pkg/cmd/go/internal/generate/

Комментарии:

1. Мои требования немного отличаются. Этот подход не будет работать для меня

2. go build не просматривает инструкции go:generate. go generate делает. Ни то, ни другое не происходит во время выполнения, что и является целью здесь.