github.com/gernest/nezuko@v0.1.2/internal/modload/help.go (about) 1 // Copyright 2018 The Go Authors. All rights reserved. 2 // Use of this source code is governed by a BSD-style 3 // license that can be found in the LICENSE file. 4 5 package modload 6 7 import "github.com/gernest/nezuko/internal/base" 8 9 // TODO(rsc): The "module code layout" section needs to be written. 10 11 var HelpModules = &base.Command{ 12 UsageLine: "modules", 13 Short: "modules, module versions, and more", 14 Long: ` 15 A module is a collection of related Go packages. 16 Modules are the unit of source code interchange and versioning. 17 The go command has direct support for working with modules, 18 including recording and resolving dependencies on other modules. 19 Modules replace the old GOPATH-based approach to specifying 20 which source files are used in a given build. 21 22 Preliminary module support 23 24 Go 1.11 includes preliminary support for Go modules, 25 including a new module-aware 'go get' command. 26 We intend to keep revising this support, while preserving compatibility, 27 until it can be declared official (no longer preliminary), 28 and then at a later point we may remove support for work 29 in GOPATH and the old 'go get' command. 30 31 The quickest way to take advantage of the new Go 1.11 module support 32 is to check out your repository into a directory outside GOPATH/src, 33 create a z.mod file (described in the next section) there, and run 34 go commands from within that file tree. 35 36 For more fine-grained control, the module support in Go 1.11 respects 37 a temporary environment variable, GO111MODULE, which can be set to one 38 of three string values: off, on, or auto (the default). 39 If GO111MODULE=off, then the go command never uses the 40 new module support. Instead it looks in vendor directories and GOPATH 41 to find dependencies; we now refer to this as "GOPATH mode." 42 If GO111MODULE=on, then the go command requires the use of modules, 43 never consulting GOPATH. We refer to this as the command being 44 module-aware or running in "module-aware mode". 45 If GO111MODULE=auto or is unset, then the go command enables or 46 disables module support based on the current directory. 47 Module support is enabled only when the current directory is outside 48 GOPATH/src and itself contains a z.mod file or is below a directory 49 containing a z.mod file. 50 51 In module-aware mode, GOPATH no longer defines the meaning of imports 52 during a build, but it still stores downloaded dependencies (in GOPATH/pkg/mod) 53 and installed commands (in GOPATH/bin, unless GOBIN is set). 54 55 Defining a module 56 57 A module is defined by a tree of Go source files with a z.mod file 58 in the tree's root directory. The directory containing the z.mod file 59 is called the module root. Typically the module root will also correspond 60 to a source code repository root (but in general it need not). 61 The module is the set of all Go packages in the module root and its 62 subdirectories, but excluding subtrees with their own z.mod files. 63 64 The "module path" is the import path prefix corresponding to the module root. 65 The z.mod file defines the module path and lists the specific versions 66 of other modules that should be used when resolving imports during a build, 67 by giving their module paths and versions. 68 69 For example, this z.mod declares that the directory containing it is the root 70 of the module with path example.com/m, and it also declares that the module 71 depends on specific versions of golang.org/x/text and gopkg.in/yaml.v2: 72 73 module example.com/m 74 75 require ( 76 golang.org/x/text v0.3.0 77 gopkg.in/yaml.v2 v2.1.0 78 ) 79 80 The z.mod file can also specify replacements and excluded versions 81 that only apply when building the module directly; they are ignored 82 when the module is incorporated into a larger build. 83 For more about the z.mod file, see 'go help z.mod'. 84 85 To start a new module, simply create a z.mod file in the root of the 86 module's directory tree, containing only a module statement. 87 The 'z mod init' command can be used to do this: 88 89 z mod init example.com/m 90 91 In a project already using an existing dependency management tool like 92 godep, glide, or dep, 'z mod init' will also add require statements 93 matching the existing configuration. 94 95 Once the z.mod file exists, no additional steps are required: 96 go commands like 'go build', 'go test', or even 'go list' will automatically 97 add new dependencies as needed to satisfy imports. 98 99 The main module and the build list 100 101 The "main module" is the module containing the directory where the go command 102 is run. The go command finds the module root by looking for a z.mod in the 103 current directory, or else the current directory's parent directory, 104 or else the parent's parent directory, and so on. 105 106 The main module's z.mod file defines the precise set of packages available 107 for use by the go command, through require, replace, and exclude statements. 108 Dependency modules, found by following require statements, also contribute 109 to the definition of that set of packages, but only through their z.mod 110 files' require statements: any replace and exclude statements in dependency 111 modules are ignored. The replace and exclude statements therefore allow the 112 main module complete control over its own build, without also being subject 113 to complete control by dependencies. 114 115 The set of modules providing packages to builds is called the "build list". 116 The build list initially contains only the main module. Then the go command 117 adds to the list the exact module versions required by modules already 118 on the list, recursively, until there is nothing left to add to the list. 119 If multiple versions of a particular module are added to the list, 120 then at the end only the latest version (according to semantic version 121 ordering) is kept for use in the build. 122 123 The 'go list' command provides information about the main module 124 and the build list. For example: 125 126 go list -m # print path of main module 127 go list -m -f={{.Dir}} # print root directory of main module 128 go list -m all # print build list 129 130 Maintaining module requirements 131 132 The z.mod file is meant to be readable and editable by both 133 programmers and tools. The go command itself automatically updates the z.mod file 134 to maintain a standard formatting and the accuracy of require statements. 135 136 Any go command that finds an unfamiliar import will look up the module 137 containing that import and add the latest version of that module 138 to z.mod automatically. In most cases, therefore, it suffices to 139 add an import to source code and run 'go build', 'go test', or even 'go list': 140 as part of analyzing the package, the go command will discover 141 and resolve the import and update the z.mod file. 142 143 Any go command can determine that a module requirement is 144 missing and must be added, even when considering only a single 145 package from the module. On the other hand, determining that a module requirement 146 is no longer necessary and can be deleted requires a full view of 147 all packages in the module, across all possible build configurations 148 (architectures, operating systems, build tags, and so on). 149 The 'z mod tidy' command builds that view and then 150 adds any missing module requirements and removes unnecessary ones. 151 152 As part of maintaining the require statements in z.mod, the go command 153 tracks which ones provide packages imported directly by the current module 154 and which ones provide packages only used indirectly by other module 155 dependencies. Requirements needed only for indirect uses are marked with a 156 "// indirect" comment in the z.mod file. Indirect requirements are 157 automatically removed from the z.mod file once they are implied by other 158 direct requirements. Indirect requirements only arise when using modules 159 that fail to state some of their own dependencies or when explicitly 160 upgrading a module's dependencies ahead of its own stated requirements. 161 162 Because of this automatic maintenance, the information in z.mod is an 163 up-to-date, readable description of the build. 164 165 The 'go get' command updates z.mod to change the module versions used in a 166 build. An upgrade of one module may imply upgrading others, and similarly a 167 downgrade of one module may imply downgrading others. The 'go get' command 168 makes these implied changes as well. If z.mod is edited directly, commands 169 like 'go build' or 'go list' will assume that an upgrade is intended and 170 automatically make any implied upgrades and update z.mod to reflect them. 171 172 The 'z mod' command provides other functionality for use in maintaining 173 and understanding modules and z.mod files. See 'go help mod'. 174 175 The -mod build flag provides additional control over updating and use of z.mod. 176 177 If invoked with -mod=readonly, the go command is disallowed from the implicit 178 automatic updating of z.mod described above. Instead, it fails when any changes 179 to z.mod are needed. This setting is most useful to check that z.mod does 180 not need updates, such as in a continuous integration and testing system. 181 The "go get" command remains permitted to update z.mod even with -mod=readonly, 182 and the "z mod" commands do not take the -mod flag (or any other build flags). 183 184 If invoked with -mod=vendor, the go command assumes that the vendor 185 directory holds the correct copies of dependencies and ignores 186 the dependency descriptions in z.mod. 187 188 Pseudo-versions 189 190 The z.mod file and the go command more generally use semantic versions as 191 the standard form for describing module versions, so that versions can be 192 compared to determine which should be considered earlier or later than another. 193 A module version like v1.2.3 is introduced by tagging a revision in the 194 underlying source repository. Untagged revisions can be referred to 195 using a "pseudo-version" like v0.0.0-yyyymmddhhmmss-abcdefabcdef, 196 where the time is the commit time in UTC and the final suffix is the prefix 197 of the commit hash. The time portion ensures that two pseudo-versions can 198 be compared to determine which happened later, the commit hash identifes 199 the underlying commit, and the prefix (v0.0.0- in this example) is derived from 200 the most recent tagged version in the commit graph before this commit. 201 202 There are three pseudo-version forms: 203 204 vX.0.0-yyyymmddhhmmss-abcdefabcdef is used when there is no earlier 205 versioned commit with an appropriate major version before the target commit. 206 (This was originally the only form, so some older z.mod files use this form 207 even for commits that do follow tags.) 208 209 vX.Y.Z-pre.0.yyyymmddhhmmss-abcdefabcdef is used when the most 210 recent versioned commit before the target commit is vX.Y.Z-pre. 211 212 vX.Y.(Z+1)-0.yyyymmddhhmmss-abcdefabcdef is used when the most 213 recent versioned commit before the target commit is vX.Y.Z. 214 215 Pseudo-versions never need to be typed by hand: the go command will accept 216 the plain commit hash and translate it into a pseudo-version (or a tagged 217 version if available) automatically. This conversion is an example of a 218 module query. 219 220 Module queries 221 222 The go command accepts a "module query" in place of a module version 223 both on the command line and in the main module's z.mod file. 224 (After evaluating a query found in the main module's z.mod file, 225 the go command updates the file to replace the query with its result.) 226 227 A fully-specified semantic version, such as "v1.2.3", 228 evaluates to that specific version. 229 230 A semantic version prefix, such as "v1" or "v1.2", 231 evaluates to the latest available tagged version with that prefix. 232 233 A semantic version comparison, such as "<v1.2.3" or ">=v1.5.6", 234 evaluates to the available tagged version nearest to the comparison target 235 (the latest version for < and <=, the earliest version for > and >=). 236 237 The string "latest" matches the latest available tagged version, 238 or else the underlying source repository's latest untagged revision. 239 240 A revision identifier for the underlying source repository, 241 such as a commit hash prefix, revision tag, or branch name, 242 selects that specific code revision. If the revision is 243 also tagged with a semantic version, the query evaluates to 244 that semantic version. Otherwise the query evaluates to a 245 pseudo-version for the commit. 246 247 All queries prefer release versions to pre-release versions. 248 For example, "<v1.2.3" will prefer to return "v1.2.2" 249 instead of "v1.2.3-pre1", even though "v1.2.3-pre1" is nearer 250 to the comparison target. 251 252 Module versions disallowed by exclude statements in the 253 main module's z.mod are considered unavailable and cannot 254 be returned by queries. 255 256 For example, these commands are all valid: 257 258 go get github.com/gorilla/mux@latest # same (@latest is default for 'go get') 259 go get github.com/gorilla/mux@v1.6.2 # records v1.6.2 260 go get github.com/gorilla/mux@e3702bed2 # records v1.6.2 261 go get github.com/gorilla/mux@c856192 # records v0.0.0-20180517173623-c85619274f5d 262 go get github.com/gorilla/mux@master # records current meaning of master 263 264 Module compatibility and semantic versioning 265 266 The go command requires that modules use semantic versions and expects that 267 the versions accurately describe compatibility: it assumes that v1.5.4 is a 268 backwards-compatible replacement for v1.5.3, v1.4.0, and even v1.0.0. 269 More generally the go command expects that packages follow the 270 "import compatibility rule", which says: 271 272 "If an old package and a new package have the same import path, 273 the new package must be backwards compatible with the old package." 274 275 Because the go command assumes the import compatibility rule, 276 a module definition can only set the minimum required version of one 277 of its dependencies: it cannot set a maximum or exclude selected versions. 278 Still, the import compatibility rule is not a guarantee: it may be that 279 v1.5.4 is buggy and not a backwards-compatible replacement for v1.5.3. 280 Because of this, the go command never updates from an older version 281 to a newer version of a module unasked. 282 283 In semantic versioning, changing the major version number indicates a lack 284 of backwards compatibility with earlier versions. To preserve import 285 compatibility, the go command requires that modules with major version v2 286 or later use a module path with that major version as the final element. 287 For example, version v2.0.0 of example.com/m must instead use module path 288 example.com/m/v2, and packages in that module would use that path as 289 their import path prefix, as in example.com/m/v2/sub/pkg. Including the 290 major version number in the module path and import paths in this way is 291 called "semantic import versioning". Pseudo-versions for modules with major 292 version v2 and later begin with that major version instead of v0, as in 293 v2.0.0-20180326061214-4fc5987536ef. 294 295 As a special case, module paths beginning with gopkg.in/ continue to use the 296 conventions established on that system: the major version is always present, 297 and it is preceded by a dot instead of a slash: gopkg.in/yaml.v1 298 and gopkg.in/yaml.v2, not gopkg.in/yaml and gopkg.in/yaml/v2. 299 300 The go command treats modules with different module paths as unrelated: 301 it makes no connection between example.com/m and example.com/m/v2. 302 Modules with different major versions can be used together in a build 303 and are kept separate by the fact that their packages use different 304 import paths. 305 306 In semantic versioning, major version v0 is for initial development, 307 indicating no expectations of stability or backwards compatibility. 308 Major version v0 does not appear in the module path, because those 309 versions are preparation for v1.0.0, and v1 does not appear in the 310 module path either. 311 312 Code written before the semantic import versioning convention 313 was introduced may use major versions v2 and later to describe 314 the same set of unversioned import paths as used in v0 and v1. 315 To accommodate such code, if a source code repository has a 316 v2.0.0 or later tag for a file tree with no z.mod, the version is 317 considered to be part of the v1 module's available versions 318 and is given an +incompatible suffix when converted to a module 319 version, as in v2.0.0+incompatible. The +incompatible tag is also 320 applied to pseudo-versions derived from such versions, as in 321 v2.0.1-0.yyyymmddhhmmss-abcdefabcdef+incompatible. 322 323 In general, having a dependency in the build list (as reported by 'go list -m all') 324 on a v0 version, pre-release version, pseudo-version, or +incompatible version 325 is an indication that problems are more likely when upgrading that 326 dependency, since there is no expectation of compatibility for those. 327 328 See https://research.swtch.com/vgo-import for more information about 329 semantic import versioning, and see https://semver.org/ for more about 330 semantic versioning. 331 332 Module code layout 333 334 For now, see https://research.swtch.com/vgo-module for information 335 about how source code in version control systems is mapped to 336 module file trees. 337 338 Module downloading and verification 339 340 The go command maintains, in the main module's root directory alongside 341 z.mod, a file named go.sum containing the expected cryptographic checksums 342 of the content of specific module versions. Each time a dependency is 343 used, its checksum is added to go.sum if missing or else required to match 344 the existing entry in go.sum. 345 346 The go command maintains a cache of downloaded packages and computes 347 and records the cryptographic checksum of each package at download time. 348 In normal operation, the go command checks these pre-computed checksums 349 against the main module's go.sum file, instead of recomputing them on 350 each command invocation. The 'z mod verify' command checks that 351 the cached copies of module downloads still match both their recorded 352 checksums and the entries in go.sum. 353 354 The go command can fetch modules from a proxy instead of connecting 355 to source control systems directly, according to the setting of the GOPROXY 356 environment variable. 357 358 See 'go help goproxy' for details about the proxy and also the format of 359 the cached downloaded packages. 360 361 Modules and vendoring 362 363 When using modules, the go command completely ignores vendor directories. 364 365 By default, the go command satisfies dependencies by downloading modules 366 from their sources and using those downloaded copies (after verification, 367 as described in the previous section). To allow interoperation with older 368 versions of Go, or to ensure that all files used for a build are stored 369 together in a single file tree, 'z mod vendor' creates a directory named 370 vendor in the root directory of the main module and stores there all the 371 packages from dependency modules that are needed to support builds and 372 tests of packages in the main module. 373 374 To build using the main module's top-level vendor directory to satisfy 375 dependencies (disabling use of the usual network sources and local 376 caches), use 'go build -mod=vendor'. Note that only the main module's 377 top-level vendor directory is used; vendor directories in other locations 378 are still ignored. 379 `, 380 } 381 382 var HelpGoMod = &base.Command{ 383 UsageLine: "z.mod", 384 Short: "the z.mod file", 385 Long: ` 386 A module version is defined by a tree of source files, with a z.mod 387 file in its root. When the go command is run, it looks in the current 388 directory and then successive parent directories to find the z.mod 389 marking the root of the main (current) module. 390 391 The z.mod file itself is line-oriented, with // comments but 392 no /* */ comments. Each line holds a single directive, made up of a 393 verb followed by arguments. For example: 394 395 module my/thing 396 go 1.12 397 require other/thing v1.0.2 398 require new/thing/v2 v2.3.4 399 exclude old/thing v1.2.3 400 replace bad/thing v1.4.5 => good/thing v1.4.5 401 402 The verbs are 403 module, to define the module path; 404 go, to set the expected language version; 405 require, to require a particular module at a given version or later; 406 exclude, to exclude a particular module version from use; and 407 replace, to replace a module version with a different module version. 408 Exclude and replace apply only in the main module's z.mod and are ignored 409 in dependencies. See https://research.swtch.com/vgo-mvs for details. 410 411 The leading verb can be factored out of adjacent lines to create a block, 412 like in Go imports: 413 414 require ( 415 new/thing v2.3.4 416 old/thing v1.2.3 417 ) 418 419 The z.mod file is designed both to be edited directly and to be 420 easily updated by tools. The 'z mod edit' command can be used to 421 parse and edit the z.mod file from programs and tools. 422 See 'go help mod edit'. 423 424 The go command automatically updates z.mod each time it uses the 425 module graph, to make sure z.mod always accurately reflects reality 426 and is properly formatted. For example, consider this z.mod file: 427 428 module M 429 430 require ( 431 A v1 432 B v1.0.0 433 C v1.0.0 434 D v1.2.3 435 E dev 436 ) 437 438 exclude D v1.2.3 439 440 The update rewrites non-canonical version identifiers to semver form, 441 so A's v1 becomes v1.0.0 and E's dev becomes the pseudo-version for the 442 latest commit on the dev branch, perhaps v0.0.0-20180523231146-b3f5c0f6e5f1. 443 444 The update modifies requirements to respect exclusions, so the 445 requirement on the excluded D v1.2.3 is updated to use the next 446 available version of D, perhaps D v1.2.4 or D v1.3.0. 447 448 The update removes redundant or misleading requirements. 449 For example, if A v1.0.0 itself requires B v1.2.0 and C v1.0.0, 450 then z.mod's requirement of B v1.0.0 is misleading (superseded by 451 A's need for v1.2.0), and its requirement of C v1.0.0 is redundant 452 (implied by A's need for the same version), so both will be removed. 453 If module M contains packages that directly import packages from B or 454 C, then the requirements will be kept but updated to the actual 455 versions being used. 456 457 Finally, the update reformats the z.mod in a canonical formatting, so 458 that future mechanical changes will result in minimal diffs. 459 460 Because the module graph defines the meaning of import statements, any 461 commands that load packages also use and therefore update z.mod, 462 including go build, go get, go install, go list, go test, z mod graph, 463 z mod tidy, and z mod why. 464 `, 465 }