mirror of
https://github.com/goreleaser/goreleaser.git
synced 2025-03-17 20:47:50 +02:00
feat: Adds template support to binary property (#544)
I added support for using the Go template engine with the binary property. This is needed for generating binaries that include the current version number in their file name. For example `terraform-provider-NAME_vX.Y.Z`.
This commit is contained in:
parent
efd1588119
commit
eef2647570
@ -17,6 +17,13 @@ builds:
|
||||
main: ./cmd/main.go
|
||||
|
||||
# Name of the binary.
|
||||
# This is parsed with the Go template engine and the following variables
|
||||
# are available:
|
||||
# - Date
|
||||
# - Commit
|
||||
# - Tag
|
||||
# - Version (Git tag without `v` prefix)
|
||||
# Date format is `2006-01-02_15:04:05`.
|
||||
# Default is the name of the project directory.
|
||||
binary: program
|
||||
|
||||
|
@ -18,6 +18,9 @@ import (
|
||||
|
||||
// langs to init
|
||||
_ "github.com/goreleaser/goreleaser/internal/builders/golang"
|
||||
"time"
|
||||
"bytes"
|
||||
"text/template"
|
||||
)
|
||||
|
||||
// Pipe for build
|
||||
@ -98,6 +101,13 @@ func runHook(ctx *context.Context, env []string, hook string) error {
|
||||
|
||||
func doBuild(ctx *context.Context, build config.Build, target string) error {
|
||||
var ext = extFor(target)
|
||||
|
||||
binary, err := binary(ctx, build)
|
||||
if err != nil {
|
||||
return err
|
||||
}
|
||||
|
||||
build.Binary = binary
|
||||
var name = build.Binary + ext
|
||||
var path = filepath.Join(ctx.Config.Dist, target, name)
|
||||
log.WithField("binary", path).Info("building")
|
||||
@ -109,6 +119,31 @@ func doBuild(ctx *context.Context, build config.Build, target string) error {
|
||||
})
|
||||
}
|
||||
|
||||
func binary(ctx *context.Context, build config.Build) (string, error) {
|
||||
var data = struct {
|
||||
Commit string
|
||||
Tag string
|
||||
Version string
|
||||
Date string
|
||||
Env map[string]string
|
||||
}{
|
||||
Commit: ctx.Git.Commit,
|
||||
Tag: ctx.Git.CurrentTag,
|
||||
Version: ctx.Version,
|
||||
Date: time.Now().UTC().Format(time.RFC3339),
|
||||
Env: ctx.Env,
|
||||
}
|
||||
var out bytes.Buffer
|
||||
t, err := template.New("binary").
|
||||
Option("missingkey=error").
|
||||
Parse(build.Binary)
|
||||
if err != nil {
|
||||
return "", err
|
||||
}
|
||||
err = t.Execute(&out, data)
|
||||
return out.String(), err
|
||||
}
|
||||
|
||||
func extFor(target string) string {
|
||||
if strings.Contains(target, "windows") {
|
||||
return ".exe"
|
||||
|
@ -52,14 +52,23 @@ func TestBuild(t *testing.T) {
|
||||
Builds: []config.Build{
|
||||
{
|
||||
Lang: "fake",
|
||||
Binary: "testing",
|
||||
Binary: "testing.v{{.Version}}",
|
||||
Flags: "-n",
|
||||
Env: []string{"BLAH=1"},
|
||||
},
|
||||
},
|
||||
}
|
||||
var ctx = context.New(config)
|
||||
assert.NoError(t, doBuild(ctx, ctx.Config.Builds[0], "darwin_amd64"))
|
||||
var ctx = &context.Context{
|
||||
Artifacts: artifact.New(),
|
||||
Git: context.GitInfo{
|
||||
CurrentTag: "v1.2.3",
|
||||
Commit: "123",
|
||||
},
|
||||
Version: "1.2.3",
|
||||
Config: config,
|
||||
}
|
||||
error := doBuild(ctx, ctx.Config.Builds[0], "darwin_amd64")
|
||||
assert.NoError(t, error)
|
||||
}
|
||||
|
||||
func TestRunPipe(t *testing.T) {
|
||||
@ -276,6 +285,33 @@ func TestExtOthers(t *testing.T) {
|
||||
assert.Empty(t, "", extFor("winasdasd_sad"))
|
||||
}
|
||||
|
||||
func TestBinaryFullTemplate(t *testing.T) {
|
||||
var config = config.Project{
|
||||
Builds: []config.Build{
|
||||
{
|
||||
Binary: `-s -w -X main.version={{.Version}} -X main.tag={{.Tag}} -X main.date={{.Date}} -X main.commit={{.Commit}} -X "main.foo={{.Env.FOO}}"`,
|
||||
},
|
||||
},
|
||||
}
|
||||
var ctx = &context.Context{
|
||||
Git: context.GitInfo{
|
||||
CurrentTag: "v1.2.3",
|
||||
Commit: "123",
|
||||
},
|
||||
Version: "1.2.3",
|
||||
Config: config,
|
||||
Env: map[string]string{"FOO": "123"},
|
||||
}
|
||||
binary, err := binary(ctx, ctx.Config.Builds[0])
|
||||
assert.NoError(t, err)
|
||||
assert.Contains(t, binary, "-s -w")
|
||||
assert.Contains(t, binary, "-X main.version=1.2.3")
|
||||
assert.Contains(t, binary, "-X main.tag=v1.2.3")
|
||||
assert.Contains(t, binary, "-X main.commit=123")
|
||||
assert.Contains(t, binary, "-X main.date=")
|
||||
assert.Contains(t, binary, `-X "main.foo=123"`)
|
||||
}
|
||||
|
||||
//
|
||||
// Helpers
|
||||
//
|
||||
|
Loading…
x
Reference in New Issue
Block a user