mirror of
https://github.com/goreleaser/goreleaser.git
synced 2025-01-24 04:16:27 +02:00
feat: allow to use .Path and .Name on universal binary post hooks (#2891)
* feat: allow to use .Path and .Name on universal binary post hooks This allows the usage of `{{ .Path }}` and `{{ .Name }}` on post templates. Closes #2890 * docs: improve docs * test: add more tests
This commit is contained in:
parent
5f30f3606a
commit
c457d8fff7
@ -16,6 +16,7 @@ import (
|
|||||||
"github.com/goreleaser/goreleaser/internal/semerrgroup"
|
"github.com/goreleaser/goreleaser/internal/semerrgroup"
|
||||||
"github.com/goreleaser/goreleaser/internal/shell"
|
"github.com/goreleaser/goreleaser/internal/shell"
|
||||||
"github.com/goreleaser/goreleaser/internal/tmpl"
|
"github.com/goreleaser/goreleaser/internal/tmpl"
|
||||||
|
"github.com/goreleaser/goreleaser/pkg/build"
|
||||||
"github.com/goreleaser/goreleaser/pkg/config"
|
"github.com/goreleaser/goreleaser/pkg/config"
|
||||||
"github.com/goreleaser/goreleaser/pkg/context"
|
"github.com/goreleaser/goreleaser/pkg/context"
|
||||||
)
|
)
|
||||||
@ -51,13 +52,18 @@ func (Pipe) Run(ctx *context.Context) error {
|
|||||||
for _, unibin := range ctx.Config.UniversalBinaries {
|
for _, unibin := range ctx.Config.UniversalBinaries {
|
||||||
unibin := unibin
|
unibin := unibin
|
||||||
g.Go(func() error {
|
g.Go(func() error {
|
||||||
if err := runHook(ctx, unibin.Hooks.Pre); err != nil {
|
opts := build.Options{
|
||||||
|
Target: "darwin_all",
|
||||||
|
Goos: "darwin",
|
||||||
|
Goarch: "all",
|
||||||
|
}
|
||||||
|
if err := runHook(ctx, &opts, unibin.Hooks.Pre); err != nil {
|
||||||
return fmt.Errorf("pre hook failed: %w", err)
|
return fmt.Errorf("pre hook failed: %w", err)
|
||||||
}
|
}
|
||||||
if err := makeUniversalBinary(ctx, unibin); err != nil {
|
if err := makeUniversalBinary(ctx, &opts, unibin); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
if err := runHook(ctx, unibin.Hooks.Post); err != nil {
|
if err := runHook(ctx, &opts, unibin.Hooks.Post); err != nil {
|
||||||
return fmt.Errorf("post hook failed: %w", err)
|
return fmt.Errorf("post hook failed: %w", err)
|
||||||
}
|
}
|
||||||
if !unibin.Replace {
|
if !unibin.Replace {
|
||||||
@ -69,7 +75,7 @@ func (Pipe) Run(ctx *context.Context) error {
|
|||||||
return g.Wait()
|
return g.Wait()
|
||||||
}
|
}
|
||||||
|
|
||||||
func runHook(ctx *context.Context, hooks config.Hooks) error {
|
func runHook(ctx *context.Context, opts *build.Options, hooks config.Hooks) error {
|
||||||
if len(hooks) == 0 {
|
if len(hooks) == 0 {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
@ -78,8 +84,9 @@ func runHook(ctx *context.Context, hooks config.Hooks) error {
|
|||||||
var envs []string
|
var envs []string
|
||||||
envs = append(envs, ctx.Env.Strings()...)
|
envs = append(envs, ctx.Env.Strings()...)
|
||||||
|
|
||||||
|
tpl := tmpl.New(ctx).WithBuildOptions(*opts)
|
||||||
for _, rawEnv := range hook.Env {
|
for _, rawEnv := range hook.Env {
|
||||||
env, err := tmpl.New(ctx).Apply(rawEnv)
|
env, err := tpl.Apply(rawEnv)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -87,12 +94,13 @@ func runHook(ctx *context.Context, hooks config.Hooks) error {
|
|||||||
envs = append(envs, env)
|
envs = append(envs, env)
|
||||||
}
|
}
|
||||||
|
|
||||||
dir, err := tmpl.New(ctx).Apply(hook.Dir)
|
tpl = tpl.WithEnvS(envs)
|
||||||
|
dir, err := tpl.Apply(hook.Dir)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
sh, err := tmpl.New(ctx).WithEnvS(envs).Apply(hook.Cmd)
|
sh, err := tpl.Apply(hook.Cmd)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
@ -125,13 +133,15 @@ const (
|
|||||||
)
|
)
|
||||||
|
|
||||||
// heavily based on https://github.com/randall77/makefat
|
// heavily based on https://github.com/randall77/makefat
|
||||||
func makeUniversalBinary(ctx *context.Context, unibin config.UniversalBinary) error {
|
func makeUniversalBinary(ctx *context.Context, opts *build.Options, unibin config.UniversalBinary) error {
|
||||||
name, err := tmpl.New(ctx).Apply(unibin.NameTemplate)
|
name, err := tmpl.New(ctx).Apply(unibin.NameTemplate)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
opts.Name = name
|
||||||
|
|
||||||
path := filepath.Join(ctx.Config.Dist, name+"_darwin_all", name)
|
path := filepath.Join(ctx.Config.Dist, name+"_darwin_all", name)
|
||||||
|
opts.Path = path
|
||||||
if err := os.MkdirAll(filepath.Dir(path), 0o755); err != nil {
|
if err := os.MkdirAll(filepath.Dir(path), 0o755); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
@ -185,6 +185,7 @@ func TestRun(t *testing.T) {
|
|||||||
},
|
},
|
||||||
Post: []config.Hook{
|
Post: []config.Hook{
|
||||||
{Cmd: "touch " + post},
|
{Cmd: "touch " + post},
|
||||||
|
{Cmd: `sh -c 'echo "{{ .Name }} {{ .Os }} {{ .Arch }} {{ .Arm }} {{ .Target }} {{ .Ext }}" > {{ .Path }}.post'`, Output: true},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
@ -268,6 +269,11 @@ func TestRun(t *testing.T) {
|
|||||||
require.NoError(t, Pipe{}.Run(ctx5))
|
require.NoError(t, Pipe{}.Run(ctx5))
|
||||||
require.FileExists(t, pre)
|
require.FileExists(t, pre)
|
||||||
require.FileExists(t, post)
|
require.FileExists(t, post)
|
||||||
|
post := filepath.Join(dist, "foo_darwin_all/foo.post")
|
||||||
|
require.FileExists(t, post)
|
||||||
|
bts, err := os.ReadFile(post)
|
||||||
|
require.NoError(t, err)
|
||||||
|
require.Equal(t, "foo darwin all darwin_all \n", string(bts))
|
||||||
})
|
})
|
||||||
|
|
||||||
t.Run("failing pre-hook", func(t *testing.T) {
|
t.Run("failing pre-hook", func(t *testing.T) {
|
||||||
|
@ -37,6 +37,7 @@ universal_binaries:
|
|||||||
# Hooks can be used to customize the final binary,
|
# Hooks can be used to customize the final binary,
|
||||||
# for example, to run generators.
|
# for example, to run generators.
|
||||||
# Those fields allow templates.
|
# Those fields allow templates.
|
||||||
|
#
|
||||||
# Default is both hooks empty.
|
# Default is both hooks empty.
|
||||||
hooks:
|
hooks:
|
||||||
pre: rice embed-go
|
pre: rice embed-go
|
||||||
@ -73,3 +74,22 @@ You can use the Go template engine to remove it if you'd like.
|
|||||||
- id: bar
|
- id: bar
|
||||||
name_template: bin2
|
name_template: bin2
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Naming templates
|
||||||
|
|
||||||
|
Most fields that support [templating](/customization/templates/) will also
|
||||||
|
support the following build details:
|
||||||
|
|
||||||
|
| Key | Description |
|
||||||
|
|---------|-----------------------------------|
|
||||||
|
| .Os | `GOOS`, always `darwin` |
|
||||||
|
| .Arch | `GOARCH`, always `all` |
|
||||||
|
| .Arm | `GOARM`, always empty |
|
||||||
|
| .Ext | Extension, always empty |
|
||||||
|
| .Target | Build target, always `darwin_all` |
|
||||||
|
| .Path | The binary path |
|
||||||
|
| .Name | The binary name |
|
||||||
|
|
||||||
|
!!! tip
|
||||||
|
Notice that `.Path` and `.Name` will only be available after they are
|
||||||
|
evaluated, so they are mostly only useful in the `post` hooks.
|
||||||
|
Loading…
x
Reference in New Issue
Block a user