1
0
mirror of https://github.com/goreleaser/goreleaser.git synced 2025-02-03 13:11:48 +02:00
Carlos Alexandro Becker b6dd26c091
feat: infer package name from go.mod (#3827)
If all other strategies fail, try to infer the `package_name` property
from the `go.mod` file, using its last segment as the actual package
name.

This is not perfect, but usually this will only be used when running
against a new project, with no git url, empty/default config, etc... so,
in reality, it'll rarely be used.

closes #3825

Signed-off-by: Carlos A Becker <caarlos0@users.noreply.github.com>
2023-03-03 09:50:02 -03:00

58 lines
1.2 KiB
Go

// Package project sets "high level" defaults related to the project.
package project
import (
"fmt"
"os/exec"
"strings"
"github.com/goreleaser/goreleaser/pkg/context"
)
// Pipe implemens defaulter to set the project name.
type Pipe struct{}
func (Pipe) String() string {
return "project name"
}
// Default set project defaults.
func (Pipe) Default(ctx *context.Context) error {
if ctx.Config.ProjectName != "" {
return nil
}
for _, candidate := range []string{
ctx.Config.Release.GitHub.Name,
ctx.Config.Release.GitLab.Name,
ctx.Config.Release.Gitea.Name,
moduleName(),
} {
if candidate == "" {
continue
}
ctx.Config.ProjectName = candidate
return nil
}
return fmt.Errorf("couldn't guess project_name, please add it to your config")
}
func moduleName() string {
bts, err := exec.Command("go", "list", "-m").CombinedOutput()
if err != nil {
return ""
}
mod := strings.TrimSpace(string(bts))
// this is the default module used when go runs without a go module.
// https://pkg.go.dev/cmd/go@master#hdr-Package_lists_and_patterns
if mod == "command-line-arguments" {
return ""
}
parts := strings.Split(mod, "/")
return strings.TrimSpace(parts[len(parts)-1])
}