BuildN bool // -n flag
BuildO string // -o flag
BuildP = runtime.NumCPU() // -p flag
- BuildModcacheRW bool // -modcacherw flag
BuildPkgdir string // -pkgdir flag
BuildRace bool // -race flag
BuildToolexec []string // -toolexec flag
BuildWork bool // -work flag
BuildX bool // -x flag
+ ModCacheRW bool // -modcacherw flag
+
CmdName string // "build", "install", "list", "mod tidy", etc.
DebugActiongraph string // -debug-actiongraph flag (undocumented, unstable)
)
func init() {
- work.AddBuildFlags(CmdGet, work.OmitModFlag)
+ work.AddBuildFlags(CmdGet, work.OmitModFlag|work.OmitModCommonFlags)
CmdGet.Run = runGet // break init loop
CmdGet.Flag.BoolVar(&Insecure, "insecure", Insecure, "")
}
"cmd/go/internal/modload"
"cmd/go/internal/module"
"cmd/go/internal/par"
+ "cmd/go/internal/work"
)
var cmdDownload = &base.Command{
func init() {
cmdDownload.Run = runDownload // break init cycle
+
+ work.AddModCommonFlags(cmdDownload)
}
type moduleJSON struct {
"cmd/go/internal/modfile"
"cmd/go/internal/modload"
"cmd/go/internal/module"
+ "cmd/go/internal/work"
)
var cmdEdit = &base.Command{
cmdEdit.Flag.Var(flagFunc(flagReplace), "replace", "")
cmdEdit.Flag.Var(flagFunc(flagDropExclude), "dropexclude", "")
+ work.AddModCommonFlags(cmdEdit)
base.AddBuildFlagsNX(&cmdEdit.Flag)
}
"cmd/go/internal/modload"
"cmd/go/internal/module"
"cmd/go/internal/par"
+ "cmd/go/internal/work"
)
var cmdGraph = &base.Command{
Run: runGraph,
}
+func init() {
+ work.AddModCommonFlags(cmdGraph)
+}
+
func runGraph(cmd *base.Command, args []string) {
if len(args) > 0 {
base.Fatalf("go mod graph: graph takes no arguments")
import (
"cmd/go/internal/base"
"cmd/go/internal/modload"
+ "cmd/go/internal/work"
"os"
"strings"
)
Run: runInit,
}
+func init() {
+ work.AddModCommonFlags(cmdInit)
+}
+
func runInit(cmd *base.Command, args []string) {
modload.CmdModInit = true
if len(args) > 1 {
"cmd/go/internal/modfetch"
"cmd/go/internal/modload"
"cmd/go/internal/module"
+ "cmd/go/internal/work"
)
var cmdTidy = &base.Command{
func init() {
cmdTidy.Run = runTidy // break init cycle
cmdTidy.Flag.BoolVar(&cfg.BuildV, "v", false, "")
+ work.AddModCommonFlags(cmdTidy)
}
func runTidy(cmd *base.Command, args []string) {
"cmd/go/internal/modload"
"cmd/go/internal/module"
"cmd/go/internal/semver"
+ "cmd/go/internal/work"
)
var cmdVendor = &base.Command{
func init() {
cmdVendor.Flag.BoolVar(&cfg.BuildV, "v", false, "")
+ work.AddModCommonFlags(cmdVendor)
}
func runVendor(cmd *base.Command, args []string) {
"cmd/go/internal/modfetch"
"cmd/go/internal/modload"
"cmd/go/internal/module"
+ "cmd/go/internal/work"
)
var cmdVerify = &base.Command{
Run: runVerify,
}
+func init() {
+ work.AddModCommonFlags(cmdVerify)
+}
+
func runVerify(cmd *base.Command, args []string) {
if len(args) != 0 {
// NOTE(rsc): Could take a module pattern.
"cmd/go/internal/base"
"cmd/go/internal/modload"
"cmd/go/internal/module"
+ "cmd/go/internal/work"
"fmt"
"strings"
)
func init() {
cmdWhy.Run = runWhy // break init cycle
+ work.AddModCommonFlags(cmdWhy)
}
func runWhy(cmd *base.Command, args []string) {
return err
}
- if !cfg.BuildModcacheRW {
+ if !cfg.ModCacheRW {
// Make dir read-only only *after* renaming it.
// os.Rename was observed to fail for read-only directories on macOS.
makeDirsReadOnly(dir)
const (
DefaultBuildFlags BuildFlagMask = 0
OmitModFlag BuildFlagMask = 1 << iota
+ OmitModCommonFlags
)
-// addBuildFlags adds the flags common to the build, clean, get,
+// AddBuildFlags adds the flags common to the build, clean, get,
// install, list, run, and test commands.
func AddBuildFlags(cmd *base.Command, mask BuildFlagMask) {
cmd.Flag.BoolVar(&cfg.BuildA, "a", false, "")
if mask&OmitModFlag == 0 {
cmd.Flag.StringVar(&cfg.BuildMod, "mod", "", "")
}
+ if mask&OmitModCommonFlags == 0 {
+ AddModCommonFlags(cmd)
+ }
cmd.Flag.StringVar(&cfg.BuildContext.InstallSuffix, "installsuffix", "", "")
cmd.Flag.Var(&load.BuildLdflags, "ldflags", "")
cmd.Flag.BoolVar(&cfg.BuildLinkshared, "linkshared", false, "")
- cmd.Flag.BoolVar(&cfg.BuildModcacheRW, "modcacherw", false, "")
cmd.Flag.StringVar(&cfg.BuildPkgdir, "pkgdir", "", "")
cmd.Flag.BoolVar(&cfg.BuildRace, "race", false, "")
cmd.Flag.BoolVar(&cfg.BuildMSan, "msan", false, "")
cmd.Flag.StringVar(&cfg.DebugActiongraph, "debug-actiongraph", "", "")
}
+// AddModCommonFlags adds the module-related flags common to build commands
+// and 'go mod' subcommands.
+func AddModCommonFlags(cmd *base.Command) {
+ cmd.Flag.BoolVar(&cfg.ModCacheRW, "modcacherw", false, "")
+}
+
// tagsFlag is the implementation of the -tags flag.
type tagsFlag []string
case "":
// ok
case "readonly", "vendor", "mod":
- if load.ModLookup == nil && !inGOFLAGS("-mod") {
+ if !cfg.ModulesEnabled && !inGOFLAGS("-mod") {
base.Fatalf("build flag -mod=%s only valid when using modules", cfg.BuildMod)
}
default:
base.Fatalf("-mod=%s not supported (can be '', 'mod', 'readonly', or 'vendor')", cfg.BuildMod)
}
+ if !cfg.ModulesEnabled {
+ if cfg.ModCacheRW && !inGOFLAGS("-modcacherw") {
+ base.Fatalf("build flag -modcacherw only valid when using modules")
+ }
+ }
}
func inGOFLAGS(flag string) bool {
[!windows] [!root] ! cp $WORK/extraneous.txt $GOPATH/pkg/mod/rsc.io/quote@v1.5.2/extraneous_file.go
! exists $GOPATH/pkg/mod/rsc.io/quote@v1.5.2/extraneous_file.go
+
+# Repeat part of the test with 'go mod download' instead of 'go get' to verify
+# -modcacherw is supported on 'go mod' subcommands.
+go clean -modcache
+go mod download -modcacherw rsc.io/quote
+cp $WORK/extraneous.txt $GOPATH/pkg/mod/rsc.io/quote@v1.5.2/extraneous_file.go
+! go mod verify
+[!root] ! cp $WORK/extraneous.txt $GOPATH/pkg/mod/rsc.io/quote@v1.5.2/go.mod
+
+
-- $WORK/extraneous.txt --
module oops
-- go.mod --