[dev.cmdgo] cmd/go: add go mod initwork command

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>
This commit is contained in:
Michael Matloob 2021-06-14 19:22:58 -04:00
parent f05f5ceffa
commit b2205eab0e
5 changed files with 97 additions and 4 deletions

View file

@ -1034,6 +1034,7 @@
// 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
@ -1229,6 +1230,23 @@
// 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:

View file

@ -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)
}

View file

@ -25,6 +25,7 @@ See 'go help modules' for an overview of module functionality.
cmdEdit,
cmdGraph,
cmdInit,
cmdInitwork,
cmdTidy,
cmdVendor,
cmdVerify,

View 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,

View 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