build package - go/build - Go Packages (original) (raw)
Package build gathers information about Go packages.
Build Constraints ¶
A build constraint, also known as a build tag, is a condition under which a file should be included in the package. Build constraints are given by a line comment that begins
//go:build
Build constraints may also be part of a file's name (for example, source_windows.go will only be included if the target operating system is windows).
See 'go help buildconstraint' (https://pkg.go.dev/cmd/go#hdr-Build_constraints) for details.
Go Path ¶
The Go path is a list of directory trees containing Go source code. It is consulted to resolve imports that cannot be found in the standard Go tree. The default path is the value of the GOPATH environment variable, interpreted as a path list appropriate to the operating system (on Unix, the variable is a colon-separated string; on Windows, a semicolon-separated string; on Plan 9, a list).
Each directory listed in the Go path must have a prescribed structure:
The src/ directory holds source code. The path below 'src' determines the import path or executable name.
The pkg/ directory holds installed package objects. As in the Go tree, each target operating system and architecture pair has its own subdirectory of pkg (pkg/GOOS_GOARCH).
If DIR is a directory listed in the Go path, a package with source in DIR/src/foo/bar can be imported as "foo/bar" and has its compiled form installed to "DIR/pkg/GOOS_GOARCH/foo/bar.a" (or, for gccgo, "DIR/pkg/gccgo/foo/libbar.a").
The bin/ directory holds compiled commands. Each command is named for its source directory, but only using the final element, not the entire path. That is, the command with source in DIR/src/foo/quux is installed into DIR/bin/quux, not DIR/bin/foo/quux. The foo/ is stripped so that you can add DIR/bin to your PATH to get at the installed commands.
Here's an example directory layout:
GOPATH=/home/user/gocode
/home/user/gocode/ src/ foo/ bar/ (go code in package bar) x.go quux/ (go code in package main) y.go bin/ quux (installed command) pkg/ linux_amd64/ foo/ bar.a (installed package object)
Binary-Only Packages ¶
In Go 1.12 and earlier, it was possible to distribute packages in binary form without including the source code used for compiling the package. The package was distributed with a source file not excluded by build constraints and containing a "//go:binary-only-package" comment. Like a build constraint, this comment appeared at the top of a file, preceded only by blank lines and other line comments and with a blank line following the comment, to separate it from the package documentation. Unlike build constraints, this comment is only recognized in non-test Go source files.
The minimal source code for a binary-only package was therefore:
//go:binary-only-package
package mypkg
The source code could include additional Go code. That code was never compiled but would be processed by tools like godoc and might be useful as end-user documentation.
"go build" and other commands no longer support binary-only-packages.Import and ImportDir will still set the BinaryOnly flag in packages containing these comments for use in tools and error messages.
- Variables
- func ArchChar(goarch string) (string, error)
- func IsLocalImport(path string) bool
- type Context
- type Directive
- type ImportMode
- type MultiplePackageError
- type NoGoError
- type Package
This section is empty.
ToolDir is the directory containing build tools.
ArchChar returns "?" and an error. In earlier versions of Go, the returned string was used to derive the compiler and linker tool names, the default object file suffix, and the default linker output name. As of Go 1.5, those strings no longer vary by architecture; they are compile, link, .o, and a.out, respectively.
IsLocalImport reports whether the import path is a local import path, like ".", "..", "./foo", or "../foo".
A Context specifies the supporting context for a build.
var Default Context = defaultContext()
Default is the default Context for builds. It uses the GOARCH, GOOS, GOROOT, and GOPATH environment variables if set, or else the compiled code's GOARCH, GOOS, and GOROOT.
Import returns details about the Go package named by the import path, interpreting local import paths relative to the srcDir directory. If the path is a local import path naming a package that can be imported using a standard import path, the returned package will set p.ImportPath to that path.
In the directory containing the package, .go, .c, .h, and .s files are considered part of the package except for:
- .go files in package documentation
- files starting with _ or . (likely editor temporary files)
- files with build constraints not satisfied by the context
If an error occurs, Import returns a non-nil error and a non-nil *Package containing partial information.
ImportDir is like Import but processes the Go package found in the named directory.
MatchFile reports whether the file with the given name in the given directory matches the context and would be included in a Package created by ImportDirof that directory.
MatchFile considers the name of the file and may use ctxt.OpenFile to read some or all of the file's content.
SrcDirs returns a list of package source root directories. It draws from the current Go root and Go path but omits directories that do not exist.
A Directive is a Go directive comment (//go:zzz...) found in a source file.
An ImportMode controls the behavior of the Import method.
const (
FindOnly [ImportMode](#ImportMode) = 1 << [iota](/builtin#iota)
AllowBinary
ImportComment
IgnoreVendor)
MultiplePackageError describes a directory containing multiple buildable Go source files for multiple packages.
type NoGoError struct { Dir string }
NoGoError is the error used by Import to describe a directory containing no buildable Go source files. (It may still contain test files, files hidden by build tags, and so on.)
A Package describes the Go package found in a directory.
Import is shorthand for Default.Import.
ImportDir is shorthand for Default.ImportDir.
func (*Package) IsCommand ¶
func (p *Package) IsCommand() bool
IsCommand reports whether the package is considered a command to be installed (not just a library). Packages named "main" are treated as commands.