]> Cypherpunks repositories - gostls13.git/commitdiff
[dev.cmdgo] cmd/go: add go mod initwork command
authorMichael Matloob <matloob@golang.org>
Mon, 14 Jun 2021 23:22:58 +0000 (19:22 -0400)
committerMichael Matloob <matloob@golang.org>
Tue, 27 Jul 2021 21:27:13 +0000 (21:27 +0000)
This command is used to create a go.work file with a set of modules
given in the arguments to the command.

For #45713
Change-Id: I09f8cefc5849dd43c234dc4a37091791fcc02ebe
Reviewed-on: https://go-review.googlesource.com/c/go/+/334936
Trust: Michael Matloob <matloob@golang.org>
Run-TryBot: Michael Matloob <matloob@golang.org>
TryBot-Result: Go Bot <gobot@golang.org>
Reviewed-by: Jay Conrod <jayconrod@google.com>
src/cmd/go/alldocs.go
src/cmd/go/internal/modcmd/initwork.go [new file with mode: 0644]
src/cmd/go/internal/modcmd/mod.go
src/cmd/go/internal/modload/init.go
src/cmd/go/testdata/script/work.txt

index e7c2e6b51bb4a141f15dd2443bf9e99bb5304f58..fb99dccb46e4cc1080f5de8dba512b6b807a8041 100644 (file)
 //     edit        edit go.mod from tools or scripts
 //     graph       print module requirement graph
 //     init        initialize new module in current directory
+//     initwork    initialize workspace file
 //     tidy        add missing and remove unused modules
 //     vendor      make vendored copy of dependencies
 //     verify      verify dependencies have expected content
 // See https://golang.org/ref/mod#go-mod-init for more about 'go mod init'.
 //
 //
+// Initialize workspace file
+//
+// Usage:
+//
+//     go mod initwork [moddirs]
+//
+// go mod initwork initializes and writes a new go.work file in the current
+// directory, in effect creating a new workspace at the current directory.
+//
+// go mod initwork optionally accepts paths to the workspace modules as arguments.
+// If the argument is omitted, an empty workspace with no modules will be created.
+//
+// See the workspaces design proposal at
+// https://go.googlesource.com/proposal/+/master/design/45713-workspace.md for
+// more information.
+//
+//
 // Add missing and remove unused modules
 //
 // Usage:
diff --git a/src/cmd/go/internal/modcmd/initwork.go b/src/cmd/go/internal/modcmd/initwork.go
new file mode 100644 (file)
index 0000000..3065350
--- /dev/null
@@ -0,0 +1,54 @@
+// Copyright 2021 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+// go mod initwork
+
+package modcmd
+
+import (
+       "cmd/go/internal/base"
+       "cmd/go/internal/modload"
+       "context"
+       "path/filepath"
+)
+
+var _ = modload.TODOWorkspaces("Add more documentation below.T hough this is" +
+       "enough for those trying workspaces out, there should be more through" +
+       "documentation if the proposal is accepted.")
+
+var cmdInitwork = &base.Command{
+       UsageLine: "go mod initwork [moddirs]",
+       Short:     "initialize workspace file",
+       Long: `go mod initwork initializes and writes a new go.work file in the current
+directory, in effect creating a new workspace at the current directory.
+
+go mod initwork optionally accepts paths to the workspace modules as arguments.
+If the argument is omitted, an empty workspace with no modules will be created.
+
+See the workspaces design proposal at
+https://go.googlesource.com/proposal/+/master/design/45713-workspace.md for
+more information.
+`,
+       Run: runInitwork,
+}
+
+func init() {
+       base.AddModCommonFlags(&cmdInitwork.Flag)
+       base.AddWorkfileFlag(&cmdInitwork.Flag)
+}
+
+func runInitwork(ctx context.Context, cmd *base.Command, args []string) {
+       modload.InitWorkfile()
+
+       modload.ForceUseModules = true
+
+       // TODO(matloob): support using the -workfile path
+       // To do that properly, we'll have to make the module directories
+       // make dirs relative to workFile path before adding the paths to
+       // the directory entries
+
+       workFile := filepath.Join(base.Cwd(), "go.work")
+
+       modload.CreateWorkFile(ctx, workFile, args)
+}
index d72d0cacd68ddafdc2723c00ca3d7f04a7aa62bc..3586b44c1adf40de3414547c070708b768cee680 100644 (file)
@@ -25,6 +25,7 @@ See 'go help modules' for an overview of module functionality.
                cmdEdit,
                cmdGraph,
                cmdInit,
+               cmdInitwork,
                cmdTidy,
                cmdVendor,
                cmdVerify,
index 607054d1ebe1ffbc7a1d5ae85b943f7b818fc45c..18f0f2b8f86c148ea0b907c208e1538873695278 100644 (file)
@@ -767,6 +767,24 @@ func CreateModFile(ctx context.Context, modPath string) {
        }
 }
 
+// CreateWorkFile initializes a new workspace by creating a go.work file.
+func CreateWorkFile(ctx context.Context, workFile string, modDirs []string) {
+       _ = TODOWorkspaces("Report an error if the file already exists.")
+
+       goV := LatestGoVersion() // Use current Go version by default
+       workF := new(modfile.WorkFile)
+       workF.Syntax = new(modfile.FileSyntax)
+       workF.AddGoStmt(goV)
+
+       for _, dir := range modDirs {
+               _ = TODOWorkspaces("Add the module path of the module.")
+               workF.AddDirectory(dir, "")
+       }
+
+       data := modfile.Format(workF.Syntax)
+       lockedfile.Write(workFile, bytes.NewReader(data), 0644)
+}
+
 // fixVersion returns a modfile.VersionFixer implemented using the Query function.
 //
 // It resolves commit hashes and branch names to versions,
index f2b51ca6297614ceeaca6373f153c52b76fb463d..c68ca89a767ff64ac85bc92ed9eef61a516644d3 100644 (file)
@@ -1,3 +1,6 @@
+go mod initwork ./a ./b
+cmp go.work go.work.want
+
 go run example.com/b
 stdout 'Hello from module A'
 
@@ -31,14 +34,13 @@ directory (
   b
   ../src/a
 )
--- go.work --
+-- go.work.want --
 go 1.17
 
 directory (
-  ./a
-  ./b
+       ./a
+       ./b
 )
-
 -- a/go.mod --
 
 module example.com/a