modules: Add GOAUTH to module config

Closes #13385
This commit is contained in:
Bjørn Erik Pedersen 2025-02-13 11:00:02 +01:00
parent d89b9d891c
commit 2c77719cd6
4 changed files with 83 additions and 19 deletions

View file

@ -22,6 +22,7 @@ proxy = 'direct'
replacements = '' replacements = ''
vendorClosest = false vendorClosest = false
workspace = 'off' workspace = 'off'
auth = ''
{{< /code-toggle >}} {{< /code-toggle >}}
noProxy noProxy
@ -36,6 +37,9 @@ private
proxy proxy
: (`string`) Defines the proxy server to use to download remote modules. Default is `direct`, which means "git clone" and similar. : (`string`) Defines the proxy server to use to download remote modules. Default is `direct`, which means "git clone" and similar.
auth
: (`string`) {{< new-in 0.144.0 >}} Configures `GOAUTH` when running the Go command for module operations. This is a semicolon-separated list of authentication commands for go-import and HTTPS module mirror interactions. This is useful for private repositories. See `go help goauth` for more information.
vendorClosest vendorClosest
: (`bool`) When enabled, we will pick the vendored module closest to the module using it. The default behavior is to pick the first. Note that there can still be only one dependency of a given module path, so once it is in use it cannot be redefined. Default is `false`. : (`bool`) When enabled, we will pick the vendored module closest to the module using it. The default behavior is to pick the first. Note that there can still be only one dependency of a given module path, so once it is in use it cannot be redefined. Default is `false`.

View file

@ -32,6 +32,7 @@ import (
"github.com/gohugoio/hugo/common/herrors" "github.com/gohugoio/hugo/common/herrors"
"github.com/gohugoio/hugo/common/hexec" "github.com/gohugoio/hugo/common/hexec"
"github.com/gohugoio/hugo/common/loggers" "github.com/gohugoio/hugo/common/loggers"
"github.com/gohugoio/hugo/config"
hglob "github.com/gohugoio/hugo/hugofs/glob" hglob "github.com/gohugoio/hugo/hugofs/glob"
@ -41,8 +42,6 @@ import (
"github.com/gohugoio/hugo/hugofs/files" "github.com/gohugoio/hugo/hugofs/files"
"github.com/gohugoio/hugo/config"
"golang.org/x/mod/module" "golang.org/x/mod/module"
"github.com/gohugoio/hugo/common/hugio" "github.com/gohugoio/hugo/common/hugio"
@ -79,21 +78,6 @@ func NewClient(cfg ClientConfig) *Client {
goModFilename = n goModFilename = n
} }
var env []string
mcfg := cfg.ModuleConfig
config.SetEnvVars(&env,
"PWD", cfg.WorkingDir,
"GO111MODULE", "on",
"GOPROXY", mcfg.Proxy,
"GOPRIVATE", mcfg.Private,
"GONOPROXY", mcfg.NoProxy,
"GOPATH", cfg.CacheDir,
"GOWORK", mcfg.Workspace, // Requires Go 1.18, see https://tip.golang.org/doc/go1.18
// GOCACHE was introduced in Go 1.15. This matches the location derived from GOPATH above.
"GOCACHE", filepath.Join(cfg.CacheDir, "pkg", "mod"),
)
logger := cfg.Logger logger := cfg.Logger
if logger == nil { if logger == nil {
logger = loggers.NewDefault() logger = loggers.NewDefault()
@ -109,8 +93,8 @@ func NewClient(cfg ClientConfig) *Client {
ccfg: cfg, ccfg: cfg,
logger: logger, logger: logger,
noVendor: noVendor, noVendor: noVendor,
moduleConfig: mcfg, moduleConfig: cfg.ModuleConfig,
environ: env, environ: cfg.toEnv(),
GoModulesFilename: goModFilename, GoModulesFilename: goModFilename,
} }
} }
@ -785,6 +769,37 @@ func (c ClientConfig) shouldIgnoreVendor(path string) bool {
return c.IgnoreVendor != nil && c.IgnoreVendor.Match(path) return c.IgnoreVendor != nil && c.IgnoreVendor.Match(path)
} }
func (cfg ClientConfig) toEnv() []string {
mcfg := cfg.ModuleConfig
var env []string
keyVals := []string{
"PWD", cfg.WorkingDir,
"GO111MODULE", "on",
"GOPATH", cfg.CacheDir,
"GOWORK", mcfg.Workspace, // Requires Go 1.18, see https://tip.golang.org/doc/go1.18
// GOCACHE was introduced in Go 1.15. This matches the location derived from GOPATH above.
"GOCACHE", filepath.Join(cfg.CacheDir, "pkg", "mod"),
}
if mcfg.Proxy != "" {
keyVals = append(keyVals, "GOPROXY", mcfg.Proxy)
}
if mcfg.Private != "" {
keyVals = append(keyVals, "GOPRIVATE", mcfg.Private)
}
if mcfg.NoProxy != "" {
keyVals = append(keyVals, "GONOPROXY", mcfg.NoProxy)
}
if mcfg.Auth != "" {
// GOAUTH was introduced in Go 1.24, see https://tip.golang.org/doc/go1.24.
keyVals = append(keyVals, "GOAUTH", mcfg.Auth)
}
config.SetEnvVars(&env, keyVals...)
return env
}
type goBinaryStatus int type goBinaryStatus int
type goModule struct { type goModule struct {

View file

@ -216,3 +216,42 @@ func TestGetModlineSplitter(t *testing.T) {
gosumSplitter := getModlineSplitter(false) gosumSplitter := getModlineSplitter(false)
c.Assert(gosumSplitter("github.com/BurntSushi/toml v0.3.1"), qt.DeepEquals, []string{"github.com/BurntSushi/toml", "v0.3.1"}) c.Assert(gosumSplitter("github.com/BurntSushi/toml v0.3.1"), qt.DeepEquals, []string{"github.com/BurntSushi/toml", "v0.3.1"})
} }
func TestClientConfigToEnv(t *testing.T) {
c := qt.New(t)
ccfg := ClientConfig{
WorkingDir: "/mywork",
CacheDir: "/mycache",
}
env := ccfg.toEnv()
c.Assert(env, qt.DeepEquals, []string{"PWD=/mywork", "GO111MODULE=on", "GOPATH=/mycache", "GOWORK=", filepath.FromSlash("GOCACHE=/mycache/pkg/mod")})
ccfg = ClientConfig{
WorkingDir: "/mywork",
CacheDir: "/mycache",
ModuleConfig: Config{
Proxy: "https://proxy.example.org",
Private: "myprivate",
NoProxy: "mynoproxy",
Workspace: "myworkspace",
Auth: "myauth",
},
}
env = ccfg.toEnv()
c.Assert(env, qt.DeepEquals, []string{
"PWD=/mywork",
"GO111MODULE=on",
"GOPATH=/mycache",
"GOWORK=myworkspace",
filepath.FromSlash("GOCACHE=/mycache/pkg/mod"),
"GOPROXY=https://proxy.example.org",
"GOPRIVATE=myprivate",
"GONOPROXY=mynoproxy",
"GOAUTH=myauth",
})
}

View file

@ -295,6 +295,12 @@ type Config struct {
// Configures GOPRIVATE when running the Go command for module operations. // Configures GOPRIVATE when running the Go command for module operations.
Private string Private string
// Configures GOAUTH when running the Go command for module operations.
// This is a semicolon-separated list of authentication commands for go-import and HTTPS module mirror interactions.
// This is useful for private repositories.
// See `go help goauth` for more information.
Auth string
// Defaults to "off". // Defaults to "off".
// Set to a work file, e.g. hugo.work, to enable Go "Workspace" mode. // Set to a work file, e.g. hugo.work, to enable Go "Workspace" mode.
// Can be relative to the working directory or absolute. // Can be relative to the working directory or absolute.