1
0
mirror of https://github.com/goreleaser/goreleaser.git synced 2025-10-30 23:58:09 +02:00

fix: improve output a bit (#2174)

* fix: improve output a bit

Signed-off-by: Carlos Alexandro Becker <caarlos0@gmail.com>

* fix: improve output a bit

Signed-off-by: Carlos Alexandro Becker <caarlos0@gmail.com>

* fix: revert unwanted changes

Signed-off-by: Carlos Alexandro Becker <caarlos0@gmail.com>

* fix: skip err

Signed-off-by: Carlos Alexandro Becker <caarlos0@gmail.com>

* fix: tests

Signed-off-by: Carlos Alexandro Becker <caarlos0@gmail.com>

* fix: test

Signed-off-by: Carlos Alexandro Becker <caarlos0@gmail.com>

* chore: build

Signed-off-by: Carlos Alexandro Becker <caarlos0@gmail.com>

Co-authored-by: kodiakhq[bot] <49736102+kodiakhq[bot]@users.noreply.github.com>
This commit is contained in:
Carlos Alexandro Becker
2021-04-19 09:31:57 -03:00
committed by GitHub
parent a9efdcab4a
commit f61d8c820c
22 changed files with 96 additions and 65 deletions

View File

@@ -10,10 +10,14 @@ import (
// errors.
func ErrHandler(action Action) Action {
return func(ctx *context.Context) error {
var err = action(ctx)
err := action(ctx)
if err == nil {
return nil
}
if pipe.IsExpectedSkip(err) {
log.WithError(err).Debug("pipe skipped")
return nil
}
if pipe.IsSkip(err) {
log.WithError(err).Warn("pipe skipped")
return nil

View File

@@ -17,6 +17,10 @@ func TestError(t *testing.T) {
require.NoError(t, ErrHandler(mockAction(pipe.ErrSkipValidateEnabled))(ctx))
})
t.Run("pipe expected skipped", func(t *testing.T) {
require.NoError(t, ErrHandler(mockAction(pipe.ErrSkipDisabledPipe))(ctx))
})
t.Run("some err", func(t *testing.T) {
require.Error(t, ErrHandler(mockAction(fmt.Errorf("pipe errored")))(ctx))
})

View File

@@ -14,7 +14,7 @@ type Padding int
const DefaultInitialPadding Padding = 3
// ExtraPadding is the double of the DefaultInitialPadding.
const ExtraPadding Padding = DefaultInitialPadding * 2
const ExtraPadding = DefaultInitialPadding * 2
// Logging pretty prints the given action and its title.
// You can have different padding levels by providing different initial

View File

@@ -36,7 +36,7 @@ func (Pipe) Default(ctx *context.Context) error {
// Docs: https://www.jfrog.com/confluence/display/RTF/Artifactory+REST+API#ArtifactoryRESTAPI-Example-DeployinganArtifact
func (Pipe) Publish(ctx *context.Context) error {
if len(ctx.Config.Artifactories) == 0 {
return pipe.Skip("artifactory section is not configured")
return pipe.ErrSkipDisabledPipe
}
// Check requirements for every instance we have configured.

View File

@@ -36,10 +36,10 @@ func (Pipe) Default(ctx *context.Context) error {
// Publish to specified blob bucket url.
func (Pipe) Publish(ctx *context.Context) error {
if len(ctx.Config.Blobs) == 0 {
return pipe.Skip("blobs section is not configured")
return pipe.ErrSkipDisabledPipe
}
var g = semerrgroup.New(ctx.Parallelism)
g := semerrgroup.New(ctx.Parallelism)
for _, conf := range ctx.Config.Blobs {
conf := conf
g.Go(func() error {

View File

@@ -63,9 +63,9 @@ func (Pipe) Publish(ctx *context.Context) error {
func publishAll(ctx *context.Context, cli client.Client) error {
// even if one of them skips, we run them all, and then show return the skips all at once.
// this is needed so we actually create the `dist/foo.rb` file, which is useful for debugging.
var skips = pipe.SkipMemento{}
skips := pipe.SkipMemento{}
for _, brew := range ctx.Config.Brews {
var err = doRun(ctx, brew, cli)
err := doRun(ctx, brew, cli)
if err != nil && pipe.IsSkip(err) {
skips.Remember(err)
continue
@@ -80,7 +80,7 @@ func publishAll(ctx *context.Context, cli client.Client) error {
// Default sets the pipe defaults.
func (Pipe) Default(ctx *context.Context) error {
for i := range ctx.Config.Brews {
var brew = &ctx.Config.Brews[i]
brew := &ctx.Config.Brews[i]
if brew.Install == "" {
brew.Install = fmt.Sprintf(`bin.install "%s"`, ctx.Config.ProjectName)
@@ -105,7 +105,7 @@ func (Pipe) Default(ctx *context.Context) error {
func doRun(ctx *context.Context, brew config.Homebrew, cl client.Client) error {
if brew.Tap.Name == "" {
return pipe.Skip("brew section is not configured")
return pipe.ErrSkipDisabledPipe
}
if brew.Tap.Token != "" {
@@ -122,7 +122,7 @@ func doRun(ctx *context.Context, brew config.Homebrew, cl client.Client) error {
}
// TODO: properly cover this with tests
var filters = []artifact.Filter{
filters := []artifact.Filter{
artifact.Or(
artifact.ByGoos("darwin"),
artifact.ByGoos("linux"),
@@ -142,7 +142,7 @@ func doRun(ctx *context.Context, brew config.Homebrew, cl client.Client) error {
filters = append(filters, artifact.ByIDs(brew.IDs...))
}
var archives = ctx.Artifacts.Filter(artifact.And(filters...)).List()
archives := ctx.Artifacts.Filter(artifact.And(filters...)).List()
if len(archives) == 0 {
return ErrNoArchivesFound
}
@@ -158,10 +158,10 @@ func doRun(ctx *context.Context, brew config.Homebrew, cl client.Client) error {
return err
}
var filename = brew.Name + ".rb"
var path = filepath.Join(ctx.Config.Dist, filename)
filename := brew.Name + ".rb"
path := filepath.Join(ctx.Config.Dist, filename)
log.WithField("formula", path).Info("writing")
if err := ioutil.WriteFile(path, []byte(content), 0644); err != nil { //nolint: gosec
if err := ioutil.WriteFile(path, []byte(content), 0o644); err != nil { //nolint: gosec
return fmt.Errorf("failed to write brew formula: %w", err)
}
@@ -177,12 +177,12 @@ func doRun(ctx *context.Context, brew config.Homebrew, cl client.Client) error {
repo := client.RepoFromRef(brew.Tap)
var gpath = buildFormulaPath(brew.Folder, filename)
gpath := buildFormulaPath(brew.Folder, filename)
log.WithField("formula", gpath).
WithField("repo", repo.String()).
Info("pushing")
var msg = fmt.Sprintf("Brew formula update for %s version %s", ctx.Config.ProjectName, ctx.Git.CurrentTag)
msg := fmt.Sprintf("Brew formula update for %s version %s", ctx.Config.ProjectName, ctx.Git.CurrentTag)
return cl.CreateFile(ctx, brew.CommitAuthor, repo, []byte(content), gpath, msg)
}
@@ -232,7 +232,7 @@ func doBuildFormula(ctx *context.Context, data templateData) (string, error) {
}
func dataFor(ctx *context.Context, cfg config.Homebrew, cl client.Client, artifacts []*artifact.Artifact) (templateData, error) {
var result = templateData{
result := templateData{
Name: formulaNameFor(cfg.Name),
Desc: cfg.Description,
Homepage: cfg.Homepage,
@@ -270,7 +270,7 @@ func dataFor(ctx *context.Context, cfg config.Homebrew, cl client.Client, artifa
if err != nil {
return result, err
}
var down = downloadable{
down := downloadable{
DownloadURL: url,
SHA256: sum,
}

View File

@@ -46,7 +46,7 @@ func (Pipe) Run(ctx *context.Context) error {
ctx.ReleaseNotes = notes
}
if ctx.Config.Changelog.Skip {
return pipe.Skip("changelog should not be built")
return pipe.ErrSkipDisabledPipe
}
if ctx.Snapshot {
return pipe.Skip("not available for snapshots")
@@ -110,9 +110,9 @@ func (Pipe) Run(ctx *context.Context) error {
ctx.ReleaseNotes += "\n"
}
var path = filepath.Join(ctx.Config.Dist, "CHANGELOG.md")
path := filepath.Join(ctx.Config.Dist, "CHANGELOG.md")
log.WithField("changelog", path).Info("writing")
return ioutil.WriteFile(path, []byte(ctx.ReleaseNotes), 0644) //nolint: gosec
return ioutil.WriteFile(path, []byte(ctx.ReleaseNotes), 0o644) //nolint: gosec
}
func loadFromFile(file string) (string, error) {
@@ -140,7 +140,7 @@ func buildChangelog(ctx *context.Context) ([]string, error) {
if err != nil {
return nil, err
}
var entries = strings.Split(log, "\n")
entries := strings.Split(log, "\n")
entries = entries[0 : len(entries)-1]
entries, err = filterEntries(ctx, entries)
if err != nil {
@@ -161,15 +161,15 @@ func filterEntries(ctx *context.Context, entries []string) ([]string, error) {
}
func sortEntries(ctx *context.Context, entries []string) []string {
var direction = ctx.Config.Changelog.Sort
direction := ctx.Config.Changelog.Sort
if direction == "" {
return entries
}
var result = make([]string, len(entries))
result := make([]string, len(entries))
copy(result, entries)
sort.Slice(result, func(i, j int) bool {
var imsg = extractCommitInfo(result[i])
var jmsg = extractCommitInfo(result[j])
imsg := extractCommitInfo(result[i])
jmsg := extractCommitInfo(result[j])
if direction == "asc" {
return strings.Compare(imsg, jmsg) < 0
}
@@ -203,7 +203,7 @@ func getChangelog(tag string) (string, error) {
}
func gitLog(refs ...string) (string, error) {
var args = []string{"log", "--pretty=oneline", "--abbrev-commit", "--no-decorate", "--no-color"}
args := []string{"log", "--pretty=oneline", "--abbrev-commit", "--no-decorate", "--no-color"}
args = append(args, refs...)
return git.Run(args...)
}

View File

@@ -38,7 +38,7 @@ func (Pipe) Default(ctx *context.Context) error {
// Run the pipe.
func (Pipe) Run(ctx *context.Context) (err error) {
if ctx.Config.Checksum.Disable {
return pipe.Skip("checksum.disable is set")
return pipe.ErrSkipDisabledPipe
}
filter := artifact.Or(
artifact.ByType(artifact.UploadableArchive),
@@ -55,7 +55,7 @@ func (Pipe) Run(ctx *context.Context) (err error) {
return nil
}
var g = semerrgroup.New(ctx.Parallelism)
g := semerrgroup.New(ctx.Parallelism)
sumLines := make([]string, len(artifactList))
for i, artifact := range artifactList {
i := i
@@ -82,7 +82,7 @@ func (Pipe) Run(ctx *context.Context) (err error) {
file, err := os.OpenFile(
filepath.Join(ctx.Config.Dist, filename),
os.O_APPEND|os.O_WRONLY|os.O_CREATE|os.O_TRUNC,
0644,
0o644,
)
if err != nil {
return err

View File

@@ -6,6 +6,7 @@ import (
"testing"
"github.com/goreleaser/goreleaser/internal/artifact"
"github.com/goreleaser/goreleaser/internal/pipe"
"github.com/goreleaser/goreleaser/internal/testlib"
"github.com/goreleaser/goreleaser/pkg/config"
"github.com/goreleaser/goreleaser/pkg/context"
@@ -114,7 +115,7 @@ func TestPipeSkipTrue(t *testing.T) {
)
var err = Pipe{}.Run(ctx)
testlib.AssertSkipped(t, err)
require.EqualError(t, err, `checksum.disable is set`)
require.EqualError(t, err, pipe.ErrSkipDisabledPipe.Error())
}
func TestPipeFileNotExist(t *testing.T) {

View File

@@ -18,7 +18,7 @@ func (Pipe) String() string {
// Publish artifacts.
func (Pipe) Publish(ctx *context.Context) error {
if len(ctx.Config.Publishers) == 0 {
return pipe.Skip("publishers section is not configured")
return pipe.ErrSkipDisabledPipe
}
return exec.Execute(ctx, ctx.Config.Publishers)

View File

@@ -32,7 +32,7 @@ func (Pipe) String() string {
// Default sets the pipe defaults.
func (Pipe) Default(ctx *context.Context) error {
for i := range ctx.Config.Dockers {
var docker = &ctx.Config.Dockers[i]
docker := &ctx.Config.Dockers[i]
if docker.Goos == "" {
docker.Goos = "linux"
@@ -62,7 +62,7 @@ func (Pipe) Default(ctx *context.Context) error {
// Run the pipe.
func (Pipe) Run(ctx *context.Context) error {
if len(ctx.Config.Dockers) == 0 || len(ctx.Config.Dockers[0].ImageTemplates) == 0 {
return pipe.Skip("docker section is not configured")
return pipe.ErrSkipDisabledPipe
}
_, err := exec.LookPath("docker")
if err != nil {
@@ -76,7 +76,7 @@ func (Pipe) Publish(ctx *context.Context) error {
if ctx.SkipPublish {
return pipe.ErrSkipPublishEnabled
}
var images = ctx.Artifacts.Filter(artifact.ByType(artifact.PublishableDockerImage)).List()
images := ctx.Artifacts.Filter(artifact.ByType(artifact.PublishableDockerImage)).List()
for _, image := range images {
if err := dockerPush(ctx, image); err != nil {
return err
@@ -86,12 +86,12 @@ func (Pipe) Publish(ctx *context.Context) error {
}
func doRun(ctx *context.Context) error {
var g = semerrgroup.NewSkipAware(semerrgroup.New(ctx.Parallelism))
g := semerrgroup.NewSkipAware(semerrgroup.New(ctx.Parallelism))
for _, docker := range ctx.Config.Dockers {
docker := docker
g.Go(func() error {
log.WithField("docker", docker).Debug("looking for artifacts matching")
var filters = []artifact.Filter{
filters := []artifact.Filter{
artifact.ByGoos(docker.Goos),
artifact.ByGoarch(docker.Goarch),
artifact.ByGoarm(docker.Goarm),
@@ -103,7 +103,7 @@ func doRun(ctx *context.Context) error {
if len(docker.IDs) > 0 {
filters = append(filters, artifact.ByIDs(docker.IDs...))
}
var artifacts = ctx.Artifacts.Filter(artifact.And(filters...))
artifacts := ctx.Artifacts.Filter(artifact.And(filters...))
log.WithField("artifacts", artifacts.Paths()).Debug("found artifacts")
return process(ctx, docker, artifacts.List())
})
@@ -127,7 +127,7 @@ func process(ctx *context.Context, docker config.Docker, artifacts []*artifact.A
return fmt.Errorf("failed to link dockerfile: %w", err)
}
for _, file := range docker.Files {
if err := os.MkdirAll(filepath.Join(tmp, filepath.Dir(file)), 0755); err != nil {
if err := os.MkdirAll(filepath.Join(tmp, filepath.Dir(file)), 0o755); err != nil {
return fmt.Errorf("failed to link extra file '%s': %w", file, err)
}
if err := link(file, filepath.Join(tmp, file)); err != nil {
@@ -217,7 +217,7 @@ func link(src, dest string) error {
// - dest = "dist/linuxamd64/b"
// - path = "a/b/c.txt"
// So we join "a/b" with "c.txt" and use it as the destination.
var dst = filepath.Join(dest, strings.Replace(path, src, "", 1))
dst := filepath.Join(dest, strings.Replace(path, src, "", 1))
log.WithFields(log.Fields{
"src": path,
"dst": dst,
@@ -232,7 +232,7 @@ func link(src, dest string) error {
func dockerBuild(ctx *context.Context, root string, images, flags []string, buildx bool) error {
log.WithField("image", images[0]).WithField("buildx", buildx).Info("building docker image")
/* #nosec */
var cmd = exec.CommandContext(ctx, "docker", buildCommand(buildx, images, flags)...)
cmd := exec.CommandContext(ctx, "docker", buildCommand(buildx, images, flags)...)
cmd.Dir = root
log.WithField("cmd", cmd.Args).WithField("cwd", cmd.Dir).Debug("running")
out, err := cmd.CombinedOutput()
@@ -258,7 +258,7 @@ func buildCommand(buildx bool, images, flags []string) []string {
func dockerPush(ctx *context.Context, image *artifact.Artifact) error {
log.WithField("image", image.Name).Info("pushing docker image")
/* #nosec */
var cmd = exec.CommandContext(ctx, "docker", "push", image.Name)
cmd := exec.CommandContext(ctx, "docker", "push", image.Name)
log.WithField("cmd", cmd.Args).Debug("running")
out, err := cmd.CombinedOutput()
if err != nil {

View File

@@ -53,7 +53,7 @@ func (Pipe) Run(ctx *context.Context) error {
ctx.ModulePath = result
if !ctx.Config.GoMod.Proxy {
return pipe.Skip("gomod.proxy is disabled")
return pipe.ErrSkipDisabledPipe
}
if ctx.Snapshot {

View File

@@ -63,11 +63,10 @@ func doPublish(ctx *context.Context, vcsClient client.Client) error {
milestone := &ctx.Config.Milestones[i]
if !milestone.Close {
return pipe.Skip("milestone pipe is disabled")
return pipe.ErrSkipDisabledPipe
}
name, err := tmpl.New(ctx).Apply(milestone.NameTemplate)
if err != nil {
return err
}

View File

@@ -22,14 +22,31 @@ var ErrSkipSignEnabled = Skip("artifact signing is disabled")
// It means that the part of a Piper that validates some things was not run.
var ErrSkipValidateEnabled = Skip("validation is disabled")
// ErrSkipDisabledPipe happens when a pipe is skipped because it is not configured.
var ErrSkipDisabledPipe = ErrSkip{
reason: "pipe not configured/disabled",
expected: true,
}
// IsSkip returns true if the error is an ErrSkip.
func IsSkip(err error) bool {
return errors.As(err, &ErrSkip{})
}
// IsExpectedSkip returns true if the given error is ErrSkip and if it is an
// expected skip.
func IsExpectedSkip(err error) bool {
skipErr := ErrSkip{}
if !errors.As(err, &skipErr) {
return false
}
return skipErr.expected
}
// ErrSkip occurs when a pipe is skipped for some reason.
type ErrSkip struct {
reason string
reason string
expected bool
}
// Error implements the error interface. returns the reason the pipe was skipped.

View File

@@ -8,19 +8,25 @@ import (
)
func TestSkipPipe(t *testing.T) {
var reason = "this is a test"
var err = Skip(reason)
reason := "this is a test"
err := Skip(reason)
require.Error(t, err)
require.Equal(t, reason, err.Error())
}
func TestIsSkip(t *testing.T) {
require.True(t, IsSkip(Skip("whatever")))
require.True(t, IsSkip(ErrSkipDisabledPipe))
require.False(t, IsSkip(errors.New("nope")))
}
func TestIsExpectedSkip(t *testing.T) {
require.True(t, IsSkip(ErrSkipDisabledPipe))
require.True(t, IsSkip(Skip("nope")))
}
func TestSkipMemento(t *testing.T) {
var m = SkipMemento{}
m := SkipMemento{}
m.Remember(Skip("foo"))
m.Remember(Skip("bar"))
// test duplicated errors

View File

@@ -113,7 +113,7 @@ func (Pipe) Publish(ctx *context.Context) error {
func doPublish(ctx *context.Context, client client.Client) error {
if ctx.Config.Release.Disable {
return pipe.Skip("release pipe is disabled")
return pipe.ErrSkipDisabledPipe
}
log.WithField("tag", ctx.Git.CurrentTag).
WithField("repo", ctx.Config.Release.GitHub.String()).
@@ -143,7 +143,7 @@ func doPublish(ctx *context.Context, client client.Client) error {
})
}
var filters = artifact.Or(
filters := artifact.Or(
artifact.ByType(artifact.UploadableArchive),
artifact.ByType(artifact.UploadableBinary),
artifact.ByType(artifact.UploadableSourceArchive),
@@ -158,7 +158,7 @@ func doPublish(ctx *context.Context, client client.Client) error {
filters = artifact.Or(filters, artifact.ByType(artifact.UploadableFile))
var g = semerrgroup.New(ctx.Parallelism)
g := semerrgroup.New(ctx.Parallelism)
for _, artifact := range ctx.Artifacts.Filter(filters).List() {
artifact := artifact
g.Go(func() error {

View File

@@ -64,7 +64,7 @@ func (Pipe) Default(ctx *context.Context) error {
func doRun(ctx *context.Context, cl client.Client) error {
scoop := ctx.Config.Scoop
if scoop.Bucket.Name == "" {
return pipe.Skip("scoop section is not configured")
return pipe.ErrSkipDisabledPipe
}
if scoop.Bucket.Token != "" {
@@ -85,7 +85,7 @@ func doRun(ctx *context.Context, cl client.Client) error {
return pipe.Skip("archive format is binary")
}
var archives = ctx.Artifacts.Filter(
archives := ctx.Artifacts.Filter(
artifact.And(
artifact.ByGoos("windows"),
artifact.ByType(artifact.UploadableArchive),
@@ -95,7 +95,7 @@ func doRun(ctx *context.Context, cl client.Client) error {
return ErrNoWindows
}
var path = scoop.Name + ".json"
path := scoop.Name + ".json"
data, err := dataFor(ctx, cl, archives)
if err != nil {
@@ -170,7 +170,7 @@ func doBuildManifest(manifest Manifest) (bytes.Buffer, error) {
}
func dataFor(ctx *context.Context, cl client.Client, artifacts []*artifact.Artifact) (Manifest, error) {
var manifest = Manifest{
manifest := Manifest{
Version: ctx.Version,
Architecture: map[string]Resource{},
Homepage: ctx.Config.Scoop.Homepage,
@@ -239,7 +239,7 @@ func dataFor(ctx *context.Context, cl client.Client, artifacts []*artifact.Artif
func binaries(a *artifact.Artifact) []string {
// nolint: prealloc
var bins []string
var wrap = a.ExtraOr("WrappedIn", "").(string)
wrap := a.ExtraOr("WrappedIn", "").(string)
for _, b := range a.ExtraOr("Builds", []*artifact.Artifact{}).([]*artifact.Artifact) {
bins = append(bins, filepath.Join(wrap, b.Name))
}

View File

@@ -469,7 +469,7 @@ func Test_doRun(t *testing.T) {
{Name: "foo_1.0.1_windows_amd64.tar.gz", Goos: "windows", Goarch: "amd64"},
{Name: "foo_1.0.1_windows_386.tar.gz", Goos: "windows", Goarch: "386"},
},
shouldErr("scoop section is not configured"),
shouldErr(pipe.ErrSkipDisabledPipe.Error()),
},
{
"no publish",

View File

@@ -26,7 +26,7 @@ func (Pipe) Default(ctx *context.Context) error {
func (Pipe) Run(ctx *context.Context) error {
if !ctx.Snapshot {
return pipe.Skip("not a snapshot")
return pipe.ErrSkipDisabledPipe
}
name, err := tmpl.New(ctx).Apply(ctx.Config.Snapshot.NameTemplate)
if err != nil {

View File

@@ -22,15 +22,15 @@ func (Pipe) String() string {
// Run the pipe.
func (Pipe) Run(ctx *context.Context) (err error) {
if !ctx.Config.Source.Enabled {
return pipe.Skip("source pipe is disabled")
return pipe.ErrSkipDisabledPipe
}
name, err := tmpl.New(ctx).Apply(ctx.Config.Source.NameTemplate)
if err != nil {
return err
}
var filename = name + "." + ctx.Config.Source.Format
var path = filepath.Join(ctx.Config.Dist, filename)
filename := name + "." + ctx.Config.Source.Format
path := filepath.Join(ctx.Config.Dist, filename)
log.WithField("file", filename).Info("creating source archive")
out, err := git.Clean(git.Run("archive", "-o", path, ctx.Git.FullCommit))
log.Debug(out)
@@ -47,7 +47,7 @@ func (Pipe) Run(ctx *context.Context) (err error) {
// Default sets the pipe defaults.
func (Pipe) Default(ctx *context.Context) error {
var archive = &ctx.Config.Source
archive := &ctx.Config.Source
if archive.Format == "" {
archive.Format = "tar.gz"
}

View File

@@ -26,7 +26,7 @@ func (Pipe) Default(ctx *context.Context) error {
// Publish artifacts.
func (Pipe) Publish(ctx *context.Context) error {
if len(ctx.Config.Uploads) == 0 {
return pipe.Skip("uploads section is not configured")
return pipe.ErrSkipDisabledPipe
}
// Check requirements for every instance we have configured.

View File

@@ -15,7 +15,7 @@ Configuration options available are described bellow.
gomod:
# Proxy a module from proxy.golang.org, making the builds verifiable.
# This will only be effective if running against a tag. Snapshots will ignore this setting.
# PS: for this to work you `build.main` must be a package, not a `.go` file.
# Notice: for this to work you `build.main` must be a package, not a `.go` file.
#
# Default is false.
proxy: true