1
0
mirror of https://github.com/goreleaser/goreleaser.git synced 2025-03-17 20:47:50 +02:00

feat: Support per-format NFPM overrides

Support per-format NFPM overrides (as recently implemented in NFPM),
plus a pair or Goreleaser specific overrides, for "Replacements"
and "NameTemplate" (to address #640).

This keeps backward compatibility with existing config files:
settings at the root of the nfpm config section will still work as
previously (which is also useful to define common/shared settings
that we don't want to override anyway).
This commit is contained in:
Benjamin Pineau 2018-04-21 16:48:22 +02:00 committed by Carlos Alexandro Becker
parent 46aa41e27e
commit edb77adc24
4 changed files with 143 additions and 54 deletions

View File

@ -123,23 +123,16 @@ type Release struct {
// NFPM config
type NFPM struct {
NameTemplate string `yaml:"name_template,omitempty"`
Replacements map[string]string `yaml:",omitempty"`
NFPMOverridables `yaml:",inline"`
Overrides map[string]NFPMOverridables `yaml:"overrides,omitempty"`
Formats []string `yaml:",omitempty"`
Dependencies []string `yaml:",omitempty"`
Recommends []string `yaml:",omitempty"`
Suggests []string `yaml:",omitempty"`
Conflicts []string `yaml:",omitempty"`
Vendor string `yaml:",omitempty"`
Homepage string `yaml:",omitempty"`
Maintainer string `yaml:",omitempty"`
Description string `yaml:",omitempty"`
License string `yaml:",omitempty"`
Bindir string `yaml:",omitempty"`
Files map[string]string `yaml:",omitempty"`
ConfigFiles map[string]string `yaml:"config_files,omitempty"`
Scripts NFPMScripts `yaml:"scripts,omitempty"`
}
// NFPMScripts is used to specify maintainer scripts
@ -150,6 +143,19 @@ type NFPMScripts struct {
PostRemove string `yaml:"postremove,omitempty"`
}
// NFPMOverridables is used to specify per package format settings
type NFPMOverridables struct {
NameTemplate string `yaml:"name_template,omitempty"`
Replacements map[string]string `yaml:",omitempty"`
Dependencies []string `yaml:",omitempty"`
Recommends []string `yaml:",omitempty"`
Suggests []string `yaml:",omitempty"`
Conflicts []string `yaml:",omitempty"`
Files map[string]string `yaml:",omitempty"`
ConfigFiles map[string]string `yaml:"config_files,omitempty"`
Scripts NFPMScripts `yaml:"scripts,omitempty"`
}
// Sign config
type Sign struct {
Cmd string `yaml:"cmd,omitempty"`

View File

@ -112,6 +112,28 @@ nfpm:
postinstall: "scripts/postinstall.sh"
preremove: "scripts/preremove.sh"
postremove: "scripts/postremove.sh"
# Some attributes can be overrided per package format.
overrides:
deb:
conflicts:
- subversion
dependencies:
- git
suggests:
- gitk
recommends:
- tig
rpm:
replacements:
amd64: x86_64
name_template: "{{ .ProjectName }}-{{ .Version }}-{{ .Arch }}"
files:
"tmp/man.gz": "/usr/share/man/man8/app.8.gz"
config_files:
"tmp/app_generated.conf": /etc/app-rpm.conf"
scripts:
preinstall: "scripts/preinstall-rpm.sh"
```
Note that GoReleaser will not install `rpmbuild` or any dependencies for you.

View File

@ -9,6 +9,7 @@ import (
"github.com/apex/log"
"github.com/goreleaser/nfpm"
"github.com/imdario/mergo"
"github.com/pkg/errors"
// blank imports here because the formats implementations need register
@ -16,6 +17,7 @@ import (
_ "github.com/goreleaser/nfpm/deb"
_ "github.com/goreleaser/nfpm/rpm"
"github.com/goreleaser/goreleaser/config"
"github.com/goreleaser/goreleaser/context"
"github.com/goreleaser/goreleaser/internal/artifact"
"github.com/goreleaser/goreleaser/internal/filenametemplate"
@ -79,16 +81,35 @@ func doRun(ctx *context.Context) error {
return g.Wait()
}
func mergeOverrides(ctx *context.Context, format string) (*config.NFPMOverridables, error) {
var overrided config.NFPMOverridables
if err := mergo.Merge(&overrided, ctx.Config.NFPM.NFPMOverridables); err != nil {
return nil, err
}
perFormat, ok := ctx.Config.NFPM.Overrides[format]
if ok {
err := mergo.Merge(&overrided, perFormat, mergo.WithOverride)
if err != nil {
return nil, err
}
}
return &overrided, nil
}
func create(ctx *context.Context, format, arch string, binaries []artifact.Artifact) error {
overrided, err := mergeOverrides(ctx, format)
if err != nil {
return err
}
name, err := filenametemplate.Apply(
ctx.Config.NFPM.NameTemplate,
filenametemplate.NewFields(ctx, ctx.Config.NFPM.Replacements, binaries...),
overrided.NameTemplate,
filenametemplate.NewFields(ctx, overrided.Replacements, binaries...),
)
if err != nil {
return err
}
var files = map[string]string{}
for k, v := range ctx.Config.NFPM.Files {
for k, v := range overrided.Files {
files[k] = v
}
var log = log.WithField("package", name+"."+format)
@ -114,17 +135,17 @@ func create(ctx *context.Context, format, arch string, binaries []artifact.Artif
License: ctx.Config.NFPM.License,
Bindir: ctx.Config.NFPM.Bindir,
Overridables: nfpm.Overridables{
Conflicts: ctx.Config.NFPM.Conflicts,
Depends: ctx.Config.NFPM.Dependencies,
Recommends: ctx.Config.NFPM.Recommends,
Suggests: ctx.Config.NFPM.Suggests,
Conflicts: overrided.Conflicts,
Depends: overrided.Dependencies,
Recommends: overrided.Recommends,
Suggests: overrided.Suggests,
Files: files,
ConfigFiles: ctx.Config.NFPM.ConfigFiles,
ConfigFiles: overrided.ConfigFiles,
Scripts: nfpm.Scripts{
PreInstall: ctx.Config.NFPM.Scripts.PreInstall,
PostInstall: ctx.Config.NFPM.Scripts.PostInstall,
PreRemove: ctx.Config.NFPM.Scripts.PreRemove,
PostRemove: ctx.Config.NFPM.Scripts.PostRemove,
PreInstall: overrided.Scripts.PreInstall,
PostInstall: overrided.Scripts.PostInstall,
PreRemove: overrided.Scripts.PreRemove,
PostRemove: overrided.Scripts.PostRemove,
},
},
}

View File

@ -34,10 +34,12 @@ func TestRunPipeInvalidFormat(t *testing.T) {
ProjectName: "nope",
NFPM: config.NFPM{
Bindir: "/usr/bin",
NameTemplate: defaultNameTemplate,
Formats: []string{"nope"},
NFPMOverridables: config.NFPMOverridables{
NameTemplate: defaultNameTemplate,
Files: map[string]string{},
},
},
})
ctx.Git = context.GitInfo{
CurrentTag: "v1.2.3",
@ -70,17 +72,18 @@ func TestRunPipe(t *testing.T) {
Dist: dist,
NFPM: config.NFPM{
Bindir: "/usr/bin",
NameTemplate: defaultNameTemplate,
Formats: []string{"deb", "rpm"},
Dependencies: []string{"make"},
Recommends: []string{"svn"},
Suggests: []string{"bzr"},
Conflicts: []string{"git"},
Description: "Some description",
License: "MIT",
Maintainer: "me@me",
Vendor: "asdf",
Homepage: "https://goreleaser.github.io",
NFPMOverridables: config.NFPMOverridables{
NameTemplate: defaultNameTemplate,
Dependencies: []string{"make"},
Recommends: []string{"svn"},
Suggests: []string{"bzr"},
Conflicts: []string{"git"},
Files: map[string]string{
"./testdata/testfile.txt": "/usr/share/testfile.txt",
},
@ -88,6 +91,14 @@ func TestRunPipe(t *testing.T) {
"./testdata/testfile.txt": "/etc/nope.conf",
},
},
Overrides: map[string]config.NFPMOverridables{
"rpm": config.NFPMOverridables{
ConfigFiles: map[string]string{
"./testdata/testfile.txt": "/etc/nope-rpm.conf",
},
},
},
},
})
ctx.Git = context.GitInfo{CurrentTag: "v1.0.0"}
for _, goos := range []string{"linux", "darwin"} {
@ -111,7 +122,7 @@ func TestInvalidNameTemplate(t *testing.T) {
Artifacts: artifact.New(),
Config: config.Project{
NFPM: config.NFPM{
NameTemplate: "{{.Foo}",
NFPMOverridables: config.NFPMOverridables{NameTemplate: "{{.Foo}"},
Formats: []string{"deb"},
},
},
@ -136,10 +147,12 @@ func TestCreateFileDoesntExist(t *testing.T) {
ProjectName: "asd",
NFPM: config.NFPM{
Formats: []string{"deb", "rpm"},
NFPMOverridables: config.NFPMOverridables{
Files: map[string]string{
"testdata/testfile.txt": "/var/lib/test/testfile.txt",
},
},
},
})
ctx.Git = context.GitInfo{
CurrentTag: "v1.2.3",
@ -192,11 +205,38 @@ func TestDefaultSet(t *testing.T) {
Config: config.Project{
NFPM: config.NFPM{
Bindir: "/bin",
NFPMOverridables: config.NFPMOverridables{
NameTemplate: "foo",
},
},
},
}
assert.NoError(t, Pipe{}.Default(ctx))
assert.Equal(t, "/bin", ctx.Config.NFPM.Bindir)
assert.Equal(t, "foo", ctx.Config.NFPM.NameTemplate)
}
func TestOverrides(t *testing.T) {
var ctx = &context.Context{
Config: config.Project{
NFPM: config.NFPM{
Bindir: "/bin",
NFPMOverridables: config.NFPMOverridables{
NameTemplate: "foo",
},
Overrides: map[string]config.NFPMOverridables{
"deb": config.NFPMOverridables{
NameTemplate: "bar",
},
},
},
},
}
assert.NoError(t, Pipe{}.Default(ctx))
merged, err := mergeOverrides(ctx, "deb")
assert.NoError(t, err)
assert.Equal(t, "/bin", ctx.Config.NFPM.Bindir)
assert.Equal(t, "foo", ctx.Config.NFPM.NameTemplate)
assert.Equal(t, "bar", ctx.Config.NFPM.Overrides["deb"].NameTemplate)
assert.Equal(t, "bar", merged.NameTemplate)
}