1
0
mirror of https://github.com/goreleaser/goreleaser.git synced 2025-04-11 11:42:15 +02:00

feat: multiple snapcraft (#1025)

* feat: multiple snapcraft

* test: more tests
This commit is contained in:
Carlos Alexandro Becker 2019-05-27 12:47:05 -03:00 committed by GitHub
parent f438398d55
commit 3ec6e5f05b
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
6 changed files with 294 additions and 180 deletions

View File

@ -70,6 +70,7 @@ func (Pipe) Default(ctx *context.Context) error {
func (Pipe) Run(ctx *context.Context) error {
for _, nfpm := range ctx.Config.NFPMs {
if len(nfpm.Formats) == 0 {
// FIXME: this assumes other nfpm configs will fail too...
return pipe.Skip("no output formats configured")
}
if err := doRun(ctx, nfpm); err != nil {

View File

@ -7,14 +7,17 @@ import (
"os"
"os/exec"
"path/filepath"
"reflect"
"strings"
"github.com/apex/log"
"github.com/goreleaser/goreleaser/internal/artifact"
"github.com/goreleaser/goreleaser/internal/deprecate"
"github.com/goreleaser/goreleaser/internal/linux"
"github.com/goreleaser/goreleaser/internal/pipe"
"github.com/goreleaser/goreleaser/internal/semerrgroup"
"github.com/goreleaser/goreleaser/internal/tmpl"
"github.com/goreleaser/goreleaser/pkg/config"
"github.com/goreleaser/goreleaser/pkg/context"
"github.com/pkg/errors"
yaml "gopkg.in/yaml.v2"
@ -62,22 +65,45 @@ func (Pipe) String() string {
// Default sets the pipe defaults
func (Pipe) Default(ctx *context.Context) error {
var snap = &ctx.Config.Snapcraft
if snap.NameTemplate == "" {
snap.NameTemplate = defaultNameTemplate
if len(ctx.Config.Snapcrafts) == 0 {
ctx.Config.Snapcrafts = append(ctx.Config.Snapcrafts, ctx.Config.Snapcraft)
if !reflect.DeepEqual(ctx.Config.Snapcraft, config.Snapcraft{}) {
deprecate.Notice("snapcraft")
}
}
for i := range ctx.Config.Snapcrafts {
var snap = &ctx.Config.Snapcrafts[i]
if snap.NameTemplate == "" {
snap.NameTemplate = defaultNameTemplate
}
if len(snap.Builds) == 0 {
for _, b := range ctx.Config.Builds {
snap.Builds = append(snap.Builds, b.ID)
}
}
}
return nil
}
// Run the pipe
func (Pipe) Run(ctx *context.Context) error {
if ctx.Config.Snapcraft.Summary == "" && ctx.Config.Snapcraft.Description == "" {
for _, snap := range ctx.Config.Snapcrafts {
// TODO: deal with pipe.skip?
if err := doRun(ctx, snap); err != nil {
return err
}
}
return nil
}
func doRun(ctx *context.Context, snap config.Snapcraft) error {
if snap.Summary == "" && snap.Description == "" {
return pipe.Skip("no summary nor description were provided")
}
if ctx.Config.Snapcraft.Summary == "" {
if snap.Summary == "" {
return ErrNoSummary
}
if ctx.Config.Snapcraft.Description == "" {
if snap.Description == "" {
return ErrNoDescription
}
_, err := exec.LookPath("snapcraft")
@ -90,6 +116,7 @@ func (Pipe) Run(ctx *context.Context) error {
artifact.And(
artifact.ByGoos("linux"),
artifact.ByType(artifact.Binary),
artifact.ByIDs(snap.Builds...),
),
).GroupByPlatform() {
arch := linux.Arch(platform)
@ -99,7 +126,7 @@ func (Pipe) Run(ctx *context.Context) error {
}
binaries := binaries
g.Go(func() error {
return create(ctx, arch, binaries)
return create(ctx, snap, arch, binaries)
})
}
return g.Wait()
@ -118,11 +145,11 @@ func (Pipe) Publish(ctx *context.Context) error {
return g.Wait()
}
func create(ctx *context.Context, arch string, binaries []artifact.Artifact) error {
func create(ctx *context.Context, snap config.Snapcraft, arch string, binaries []artifact.Artifact) error {
var log = log.WithField("arch", arch)
folder, err := tmpl.New(ctx).
WithArtifact(binaries[0], ctx.Config.Snapcraft.Replacements).
Apply(ctx.Config.Snapcraft.NameTemplate)
WithArtifact(binaries[0], snap.Replacements).
Apply(snap.NameTemplate)
if err != nil {
return err
}
@ -140,25 +167,25 @@ func create(ctx *context.Context, arch string, binaries []artifact.Artifact) err
var metadata = &Metadata{
Version: ctx.Version,
Summary: ctx.Config.Snapcraft.Summary,
Description: ctx.Config.Snapcraft.Description,
Grade: ctx.Config.Snapcraft.Grade,
Confinement: ctx.Config.Snapcraft.Confinement,
Summary: snap.Summary,
Description: snap.Description,
Grade: snap.Grade,
Confinement: snap.Confinement,
Architectures: []string{arch},
Apps: map[string]AppMetadata{},
}
if ctx.Config.Snapcraft.Base != "" {
metadata.Base = ctx.Config.Snapcraft.Base
if snap.Base != "" {
metadata.Base = snap.Base
}
if ctx.Config.Snapcraft.License != "" {
metadata.License = ctx.Config.Snapcraft.License
if snap.License != "" {
metadata.License = snap.License
}
metadata.Name = ctx.Config.ProjectName
if ctx.Config.Snapcraft.Name != "" {
metadata.Name = ctx.Config.Snapcraft.Name
if snap.Name != "" {
metadata.Name = snap.Name
}
for _, binary := range binaries {
@ -169,7 +196,7 @@ func create(ctx *context.Context, arch string, binaries []artifact.Artifact) err
appMetadata := AppMetadata{
Command: name,
}
if configAppMetadata, ok := ctx.Config.Snapcraft.Apps[name]; ok {
if configAppMetadata, ok := snap.Apps[name]; ok {
appMetadata.Plugs = configAppMetadata.Plugs
appMetadata.Daemon = configAppMetadata.Daemon
appMetadata.Command = strings.Join([]string{
@ -178,7 +205,7 @@ func create(ctx *context.Context, arch string, binaries []artifact.Artifact) err
}, " ")
}
metadata.Apps[name] = appMetadata
metadata.Plugs = ctx.Config.Snapcraft.Plugs
metadata.Plugs = snap.Plugs
destBinaryPath := filepath.Join(primeDir, filepath.Base(binary.Path))
log.WithField("src", binary.Path).
@ -207,20 +234,20 @@ func create(ctx *context.Context, arch string, binaries []artifact.Artifact) err
return err
}
var snap = filepath.Join(ctx.Config.Dist, folder+".snap")
log.WithField("snap", snap).Info("creating")
var snapFile = filepath.Join(ctx.Config.Dist, folder+".snap")
log.WithField("snap", snapFile).Info("creating")
/* #nosec */
var cmd = exec.CommandContext(ctx, "snapcraft", "pack", primeDir, "--output", snap)
var cmd = exec.CommandContext(ctx, "snapcraft", "pack", primeDir, "--output", snapFile)
if out, err = cmd.CombinedOutput(); err != nil {
return fmt.Errorf("failed to generate snap package: %s", string(out))
}
if !ctx.Config.Snapcraft.Publish {
if !snap.Publish {
return nil
}
ctx.Artifacts.Add(artifact.Artifact{
Type: artifact.PublishableSnapcraft,
Name: folder + ".snap",
Path: snap,
Path: snapFile,
Goos: binaries[0].Goos,
Goarch: binaries[0].Goarch,
Goarm: binaries[0].Goarm,

View File

@ -32,7 +32,9 @@ func TestRunPipeMissingInfo(t *testing.T) {
t.Run(fmt.Sprintf("testing if %v happens", eerr), func(t *testing.T) {
var ctx = &context.Context{
Config: config.Project{
Snapcraft: snap,
Snapcrafts: []config.Snapcraft{
snap,
},
},
}
assert.Equal(t, eerr, Pipe{}.Run(ctx))
@ -49,18 +51,36 @@ func TestRunPipe(t *testing.T) {
var ctx = context.New(config.Project{
ProjectName: "mybin",
Dist: dist,
Snapcraft: config.Snapcraft{
NameTemplate: "foo_{{.Arch}}",
Summary: "test summary",
Description: "test description",
Publish: true,
Snapcrafts: []config.Snapcraft{
{
NameTemplate: "foo_{{.Arch}}",
Summary: "test summary",
Description: "test description",
Publish: true,
Builds: []string{"foo"},
},
{
NameTemplate: "foo_and_bar_{{.Arch}}",
Summary: "test summary",
Description: "test description",
Publish: true,
Builds: []string{"foo", "bar"},
},
{
NameTemplate: "bar_{{.Arch}}",
Summary: "test summary",
Description: "test description",
Publish: true,
Builds: []string{"bar"},
},
},
})
ctx.Git.CurrentTag = "v1.2.3"
ctx.Version = "v1.2.3"
addBinaries(t, ctx, "mybin", dist, "mybin")
addBinaries(t, ctx, "foo", filepath.Join(dist, "foo"), "foo")
addBinaries(t, ctx, "bar", filepath.Join(dist, "bar"), "bar")
assert.NoError(t, Pipe{}.Run(ctx))
assert.Len(t, ctx.Artifacts.Filter(artifact.ByType(artifact.PublishableSnapcraft)).List(), 2)
assert.Len(t, ctx.Artifacts.Filter(artifact.ByType(artifact.PublishableSnapcraft)).List(), 6)
}
func TestRunPipeInvalidNameTemplate(t *testing.T) {
@ -72,15 +92,18 @@ func TestRunPipeInvalidNameTemplate(t *testing.T) {
var ctx = context.New(config.Project{
ProjectName: "mybin",
Dist: dist,
Snapcraft: config.Snapcraft{
NameTemplate: "foo_{{.Arch}",
Summary: "test summary",
Description: "test description",
Snapcrafts: []config.Snapcraft{
{
NameTemplate: "foo_{{.Arch}",
Summary: "test summary",
Description: "test description",
Builds: []string{"foo"},
},
},
})
ctx.Git.CurrentTag = "v1.2.3"
ctx.Version = "v1.2.3"
addBinaries(t, ctx, "mybin", dist, "mybin")
addBinaries(t, ctx, "foo", dist, "mybin")
assert.EqualError(t, Pipe{}.Run(ctx), `template: tmpl:1: unexpected "}" in operand`)
}
@ -93,18 +116,21 @@ func TestRunPipeWithName(t *testing.T) {
var ctx = context.New(config.Project{
ProjectName: "testprojectname",
Dist: dist,
Snapcraft: config.Snapcraft{
NameTemplate: "foo_{{.Arch}}",
Name: "testsnapname",
Base: "core18",
License: "MIT",
Summary: "test summary",
Description: "test description",
Snapcrafts: []config.Snapcraft{
{
NameTemplate: "foo_{{.Arch}}",
Name: "testsnapname",
Base: "core18",
License: "MIT",
Summary: "test summary",
Description: "test description",
Builds: []string{"foo"},
},
},
})
ctx.Git.CurrentTag = "v1.2.3"
ctx.Version = "v1.2.3"
addBinaries(t, ctx, "testprojectname", dist, "mybin")
addBinaries(t, ctx, "foo", dist, "mybin")
assert.NoError(t, Pipe{}.Run(ctx))
yamlFile, err := ioutil.ReadFile(filepath.Join(dist, "foo_amd64", "prime", "meta", "snap.yaml"))
assert.NoError(t, err)
@ -127,16 +153,19 @@ func TestRunPipeWithBinaryInDir(t *testing.T) {
var ctx = context.New(config.Project{
ProjectName: "testprojectname",
Dist: dist,
Snapcraft: config.Snapcraft{
NameTemplate: "foo_{{.Arch}}",
Name: "testsnapname",
Summary: "test summary",
Description: "test description",
Snapcrafts: []config.Snapcraft{
{
NameTemplate: "foo_{{.Arch}}",
Name: "testsnapname",
Summary: "test summary",
Description: "test description",
Builds: []string{"foo"},
},
},
})
ctx.Git.CurrentTag = "v1.2.3"
ctx.Version = "v1.2.3"
addBinaries(t, ctx, "testprojectname", dist, "bin/mybin")
addBinaries(t, ctx, "foo", dist, "bin/mybin")
assert.NoError(t, Pipe{}.Run(ctx))
yamlFile, err := ioutil.ReadFile(filepath.Join(dist, "foo_amd64", "prime", "meta", "snap.yaml"))
assert.NoError(t, err)
@ -159,27 +188,30 @@ func TestRunPipeMetadata(t *testing.T) {
var ctx = context.New(config.Project{
ProjectName: "testprojectname",
Dist: dist,
Snapcraft: config.Snapcraft{
NameTemplate: "foo_{{.Arch}}",
Summary: "test summary",
Description: "test description",
Apps: map[string]config.SnapcraftAppMetadata{
"mybin": {
Plugs: []string{"home", "network", "personal-files"},
Daemon: "simple",
Args: "--foo --bar",
Snapcrafts: []config.Snapcraft{
{
NameTemplate: "foo_{{.Arch}}",
Summary: "test summary",
Description: "test description",
Apps: map[string]config.SnapcraftAppMetadata{
"mybin": {
Plugs: []string{"home", "network", "personal-files"},
Daemon: "simple",
Args: "--foo --bar",
},
},
},
Plugs: map[string]interface{}{
"personal-files": map[string]interface{}{
"read": []string{"$HOME/test"},
Plugs: map[string]interface{}{
"personal-files": map[string]interface{}{
"read": []string{"$HOME/test"},
},
},
Builds: []string{"foo"},
},
},
})
ctx.Git.CurrentTag = "v1.2.3"
ctx.Version = "v1.2.3"
addBinaries(t, ctx, "mybin", dist, "mybin")
addBinaries(t, ctx, "foo", dist, "mybin")
assert.NoError(t, Pipe{}.Run(ctx))
yamlFile, err := ioutil.ReadFile(filepath.Join(dist, "foo_amd64", "prime", "meta", "snap.yaml"))
assert.NoError(t, err)
@ -202,18 +234,27 @@ func TestNoSnapcraftInPath(t *testing.T) {
}()
assert.NoError(t, os.Setenv("PATH", ""))
var ctx = context.New(config.Project{
Snapcraft: config.Snapcraft{
Summary: "dummy",
Description: "dummy",
Snapcrafts: []config.Snapcraft{
{
Summary: "dummy",
Description: "dummy",
},
},
})
assert.EqualError(t, Pipe{}.Run(ctx), ErrNoSnapcraft.Error())
}
func TestDefault(t *testing.T) {
var ctx = context.New(config.Project{})
var ctx = context.New(config.Project{
Builds: []config.Build{
{
ID: "foo",
},
},
})
assert.NoError(t, Pipe{}.Default(ctx))
assert.Equal(t, defaultNameTemplate, ctx.Config.Snapcraft.NameTemplate)
assert.Equal(t, defaultNameTemplate, ctx.Config.Snapcrafts[0].NameTemplate)
assert.Equal(t, []string{"foo"}, ctx.Config.Snapcrafts[0].Builds)
}
func TestPublish(t *testing.T) {
@ -230,20 +271,32 @@ func TestPublish(t *testing.T) {
}
func TestDefaultSet(t *testing.T) {
var ctx = context.New(config.Project{
Snapcrafts: []config.Snapcraft{
{
NameTemplate: "foo",
},
},
})
assert.NoError(t, Pipe{}.Default(ctx))
assert.Equal(t, "foo", ctx.Config.Snapcrafts[0].NameTemplate)
}
func TestDefaultDeprecate(t *testing.T) {
var ctx = context.New(config.Project{
Snapcraft: config.Snapcraft{
NameTemplate: "foo",
},
})
assert.NoError(t, Pipe{}.Default(ctx))
assert.Equal(t, "foo", ctx.Config.Snapcraft.NameTemplate)
assert.Equal(t, "foo", ctx.Config.Snapcrafts[0].NameTemplate)
}
func addBinaries(t *testing.T, ctx *context.Context, name, dist, dest string) {
for _, goos := range []string{"linux", "darwin"} {
for _, goarch := range []string{"amd64", "386", "arm6"} {
var folder = goos + goarch
assert.NoError(t, os.Mkdir(filepath.Join(dist, folder), 0755))
assert.NoError(t, os.MkdirAll(filepath.Join(dist, folder), 0755))
var binPath = filepath.Join(dist, folder, name)
_, err := os.Create(binPath)
assert.NoError(t, err)
@ -253,6 +306,9 @@ func addBinaries(t *testing.T, ctx *context.Context, name, dist, dest string) {
Goarch: goarch,
Goos: goos,
Type: artifact.Binary,
Extra: map[string]interface{}{
"ID": name,
},
})
}
}

View File

@ -226,6 +226,7 @@ type Snapcraft struct {
Replacements map[string]string `yaml:",omitempty"`
Publish bool `yaml:",omitempty"`
Builds []string `yaml:",omitempty"`
Name string `yaml:",omitempty"`
Summary string `yaml:",omitempty"`
Description string `yaml:",omitempty"`
@ -312,28 +313,29 @@ type Put struct {
// Project includes all project configuration
type Project struct {
ProjectName string `yaml:"project_name,omitempty"`
Env []string `yaml:",omitempty"`
Release Release `yaml:",omitempty"`
Brew Homebrew `yaml:",omitempty"`
Scoop Scoop `yaml:",omitempty"`
Builds []Build `yaml:",omitempty"`
Archive Archive `yaml:",omitempty"` // TODO: remove this
Archives []Archive `yaml:",omitempty"`
NFPM NFPM `yaml:",omitempty"` // TODO: remove this
NFPMs []NFPM `yaml:"nfpms,omitempty"`
Snapcraft Snapcraft `yaml:",omitempty"`
Snapshot Snapshot `yaml:",omitempty"`
Checksum Checksum `yaml:",omitempty"`
Dockers []Docker `yaml:",omitempty"`
Artifactories []Put `yaml:",omitempty"`
Puts []Put `yaml:",omitempty"`
S3 []S3 `yaml:"s3,omitempty"`
Changelog Changelog `yaml:",omitempty"`
Dist string `yaml:",omitempty"`
Sign Sign `yaml:",omitempty"`
EnvFiles EnvFiles `yaml:"env_files,omitempty"`
Before Before `yaml:",omitempty"`
ProjectName string `yaml:"project_name,omitempty"`
Env []string `yaml:",omitempty"`
Release Release `yaml:",omitempty"`
Brew Homebrew `yaml:",omitempty"`
Scoop Scoop `yaml:",omitempty"`
Builds []Build `yaml:",omitempty"`
Archive Archive `yaml:",omitempty"` // TODO: remove this
Archives []Archive `yaml:",omitempty"`
NFPM NFPM `yaml:",omitempty"` // TODO: remove this
NFPMs []NFPM `yaml:"nfpms,omitempty"`
Snapcraft Snapcraft `yaml:",omitempty"` // TODO: remove this
Snapcrafts []Snapcraft `yaml:",omitempty"`
Snapshot Snapshot `yaml:",omitempty"`
Checksum Checksum `yaml:",omitempty"`
Dockers []Docker `yaml:",omitempty"`
Artifactories []Put `yaml:",omitempty"`
Puts []Put `yaml:",omitempty"`
S3 []S3 `yaml:"s3,omitempty"`
Changelog Changelog `yaml:",omitempty"`
Dist string `yaml:",omitempty"`
Sign Sign `yaml:",omitempty"`
EnvFiles EnvFiles `yaml:"env_files,omitempty"`
Before Before `yaml:",omitempty"`
// this is a hack ¯\_(ツ)_/¯
SingleBuild Build `yaml:"build,omitempty"`

View File

@ -33,6 +33,29 @@ to this:
-->
### snapcraft
> since 2019-05-39
We now allow multiple Snapcraft configs, so the `snapcraft` statement will be removed.
Change this:
```yaml
snapcraft:
publish: true
# ...
```
to this:
```yaml
snapcrafts:
-
publish: true
# ...
```
### nfpm
> since 2019-05-07

View File

@ -18,101 +18,106 @@ Available options:
```yml
# .goreleaser.yml
snapcraft:
# You can change the name of the package.
# Default: `{{ .ProjectName }}_{{ .Version }}_{{ .Os }}_{{ .Arch }}{{ if .Arm }}v{{ .Arm }}{{ end }}`
name_template: "{{ .ProjectName }}_{{ .Version }}_{{ .Os }}_{{ .Arch }}"
snapcrafts:
-
# Build IDs for the builds you want to create snapcraft packages for.
# Defaults to all builds.
builds:
- foo
- bar
# Replacements for GOOS and GOARCH in the package name.
# Keys should be valid GOOSs or GOARCHs.
# Values are the respective replacements.
# Default is empty.
replacements:
amd64: 64-bit
386: 32-bit
darwin: macOS
linux: Tux
# You can change the name of the package.
# Default: `{{ .ProjectName }}_{{ .Version }}_{{ .Os }}_{{ .Arch }}{{ if .Arm }}v{{ .Arm }}{{ end }}`
name_template: "{{ .ProjectName }}_{{ .Version }}_{{ .Os }}_{{ .Arch }}"
# The name of the snap. This is optional.
# Default is project name.
name: drumroll
# Replacements for GOOS and GOARCH in the package name.
# Keys should be valid GOOSs or GOARCHs.
# Values are the respective replacements.
# Default is empty.
replacements:
amd64: 64-bit
386: 32-bit
darwin: macOS
linux: Tux
# Wether to publish the snap to the snapcraft store.
# Remember you need to `snapcraft login` first.
# Defaults to false.
publish: true
# The name of the snap. This is optional.
# Default is project name.
name: drumroll
# Single-line elevator pitch for your amazing snap.
# 79 char long at most.
summary: Software to create fast and easy drum rolls.
# Wether to publish the snap to the snapcraft store.
# Remember you need to `snapcraft login` first.
# Defaults to false.
publish: true
# This the description of your snap. You have a paragraph or two to tell the
# most important story about your snap. Keep it under 100 words though,
# we live in tweetspace and your description wants to look good in the snap
# store.
description: |
This is the best drum roll application out there.
Install it and awe!
# Single-line elevator pitch for your amazing snap.
# 79 char long at most.
summary: Software to create fast and easy drum rolls.
# A guardrail to prevent you from releasing a snap to all your users before
# it is ready.
# `devel` will let you release only to the `edge` and `beta` channels in the
# store. `stable` will let you release also to the `candidate` and `stable`
# channels. More info about channels here:
# https://snapcraft.io/docs/reference/channels
grade: stable
# This the description of your snap. You have a paragraph or two to tell the
# most important story about your snap. Keep it under 100 words though,
# we live in tweetspace and your description wants to look good in the snap
# store.
description: This is the best drum roll application out there. Install it and awe!
# Snaps can be setup to follow three different confinement policies:
# `strict`, `devmode` and `classic`. A strict confinement where the snap
# can only read and write in its own namespace is recommended. Extra
# permissions for strict snaps can be declared as `plugs` for the app, which
# are explained later. More info about confinement here:
# https://snapcraft.io/docs/reference/confinement
confinement: strict
# Your app's license, based on SPDX license expressions: https://spdx.org/licenses
# Default is empty.
license: MIT
# A snap of type base to be used as the execution environment for this snap.
# Valid values are:
# * bare - Empty base snap;
# * core - Ubuntu Core 16;
# * core18 - Ubuntu Core 18.
# Default is empty.
base: core18
# A guardrail to prevent you from releasing a snap to all your users before
# it is ready.
# `devel` will let you release only to the `edge` and `beta` channels in the
# store. `stable` will let you release also to the `candidate` and `stable`
# channels. More info about channels here:
# https://snapcraft.io/docs/reference/channels
grade: stable
# Each binary built by GoReleaser is an app inside the snap. In this section
# you can declare extra details for those binaries. It is optional.
apps:
# Snaps can be setup to follow three different confinement policies:
# `strict`, `devmode` and `classic`. A strict confinement where the snap
# can only read and write in its own namespace is recommended. Extra
# permissions for strict snaps can be declared as `plugs` for the app, which
# are explained later. More info about confinement here:
# https://snapcraft.io/docs/reference/confinement
confinement: strict
# The name of the app must be the same name as the binary built or the snapcraft name.
drumroll:
# Your app's license, based on SPDX license expressions: https://spdx.org/licenses
# Default is empty.
license: MIT
# If your app requires extra permissions to work outside of its default
# confined space, declare them here.
# You can read the documentation about the available plugs and the
# things they allow:
# https://snapcraft.io/docs/reference/interfaces.
plugs: ["home", "network", "personal-files"]
# A snap of type base to be used as the execution environment for this snap.
# Valid values are:
# * bare - Empty base snap;
# * core - Ubuntu Core 16;
# * core18 - Ubuntu Core 18.
# Default is empty.
base: core18
# If you want your app to be autostarted and to always run in the
# background, you can make it a simple daemon.
daemon: simple
# Each binary built by GoReleaser is an app inside the snap. In this section
# you can declare extra details for those binaries. It is optional.
apps:
# If you any to pass args to your binary, you can add them with the
# args option.
args: --foo
# Allows plugs to be configured. Plugs like system-files and personal-files
# require this.
# Default is empty.
plugs:
personal-files:
read:
- $HOME/.foo
write:
- $HOME/.foo
- $HOME/.foobar
# The name of the app must be the same name as the binary built or the snapcraft name.
drumroll:
# If your app requires extra permissions to work outside of its default
# confined space, declare them here.
# You can read the documentation about the available plugs and the
# things they allow:
# https://snapcraft.io/docs/reference/interfaces.
plugs: ["home", "network", "personal-files"]
# If you want your app to be autostarted and to always run in the
# background, you can make it a simple daemon.
daemon: simple
# If you any to pass args to your binary, you can add them with the
# args option.
args: --foo
# Allows plugs to be configured. Plugs like system-files and personal-files
# require this.
# Default is empty.
plugs:
personal-files:
read:
- $HOME/.foo
write:
- $HOME/.foo
- $HOME/.foobar
```
> Learn more about the [name template engine](/templates).