blob: 6fe171bee378e004684c638e7ddea8b4bbcf0455 [file] [log] [blame] [view]
<!--{
"Title": "Managing module source"
}-->
When you're developing modules to publish for others to use, you can help ensure
that your modules are easier for other developers to use by following the
repository conventions described in this topic.
This topic describes actions you might take when managing your module
repository. For information about the sequence of workflow steps you'd take when
revising from version to version, see [Module release and versioning
workflow](release-workflow).
Some of the conventions described here are required in modules, while others are
best practices. This content assumes you're familiar with the basic module use
practices described in [Managing dependencies](/doc/modules/managing-dependencies).
Go supports the following repositories for publishing modules: Git, Subversion,
Mercurial, Bazaar, and Fossil.
For an overview of module development, see [Developing and publishing
modules](developing).
## How Go tools find your published module {#tools}
In Go's decentralized system for publishing modules and retrieving their code,
you can publish your module while leaving the code in your repository. Go tools
rely on naming rules that have repository paths and repository tags indicating a
module's name and version number. When your repository follows these
requirements, your module code is downloadable from your repository by Go tools
such as the [`go get`
command](/ref/mod#go-get).
When a developer uses the `go get` command to get source code for packages their
code imports, the command does the following:
1. From `import` statements in Go source code, `go get` identifies the module
path within the package path.
1. Using a URL derived from the module path, the command locates the module
source on a module proxy server or at its repository directly.
1. Locates source for the module version to download by matching the module's
version number to a repository tag to discover the code in the repository.
When a version number to use is not yet known, `go get` locates the latest
release version.
1. Retrieves module source and downloads it to the developer's local module cache.
## Organizing code in the repository {#repository}
You can keep maintenance simple and improve developers' experience with your
module by following the conventions described here. Getting your module code
into a repository is generally as simple as with other code.
The following diagram illustrates a source hierarchy for a simple module with
two packages.
<img src="images/source-hierarchy.png"
alt="Diagram illustrating a module source code hierarchy"
style="width: 250px;" />
Your initial commit should include files listed in the following table:
<table id="module-files" class="DocTable">
<thead>
<tr class="DocTable-head">
<th class="DocTable-cell" width="20%">File</td>
<th class="DocTable-cell">Description</th>
</tr>
</thead>
<tbody>
<tr class="DocTable-row">
<td class="DocTable-cell">LICENSE</td>
<td class="DocTable-cell">The module's license.</td>
</tr>
<tr class="DocTable-row">
<td class="DocTable-cell">go.mod</td>
<td class="DocTable-cell"><p>Describes the module, including its module
path (in effect, its name) and its dependencies. For more, see the
<a href="gomod-ref">go.mod reference</a>.</p>
<p>The module path will be given in a module directive, such as:</p>
<pre>module example.com/mymodule</pre>
<p>For more about choosing a module path, see
<a href="/doc/modules/managing-dependencies#naming_module">Managing
dependencies</a>.</p>
<p>Though you can edit the go.mod file, you'll find it more reliable to
make changes through <code>go</code> commands.</p>
</td>
</tr>
<tr class="DocTable-row">
<td class="DocTable-cell">go.sum</td>
<td class="DocTable-cell"><p>Contains cryptographic hashes that represent
the module's dependencies. Go tools use these hashes to authenticate
downloaded modules, attempting to confirm that the downloaded module is
authentic. Where this confirmation fails, Go will display a security error.<p>
<p>The file will be empty or not present when there are no dependencies.
You shouldn't edit this file except by using the <code>go mod tidy</code>
command, which removes unneeded entries.</p>
</td>
</tr>
<tr class="DocTable-row">
<td class="DocTable-cell">Package directories and .go sources.</td>
<td class="DocTable-cell">Directories and .go files that comprise the Go
packages and sources in the module.</td>
</tr>
</tbody>
</table>
From the command-line, you can create an empty repository, add the files that
will be part of your initial commit, and commit with a message. Here's an
example using git:
```
$ git init
$ git add --all
$ git commit -m "mycode: initial commit"
$ git push
```
## Choosing repository scope {#repository-scope}
You publish code in a module when the code should be versioned independently
from code in other modules.
Designing your repository so that it hosts a single module at its root directory
will help keep maintenance simpler, particularly over time as you publish new
minor and patch versions, branch into new major versions, and so on. However, if
your needs require it, you can instead maintain a collection of modules in a
single repository.
### Sourcing one module per repository {#one-module-source}
You can maintain a repository that has a single module's source in it. In this
model, you place your go.mod file at the repository root, with package
subdirectories containing Go source beneath.
This is the simplest approach, making your module likely easier to manage over
time. It helps you avoid the need to prefix a module version number with a
directory path.
<img src="images/single-module.png"
alt="Diagram illustrating a single module's source in its repository"
style="width: 425px;" />
### Sourcing multiple modules in a single repository {#multiple-module-source}
You can publish multiple modules from a single repository. For example, you
might have code in a single repository that constitutes multiple modules, but
want to version those modules separately.
Each subdirectory that is a module root directory must have its own go.mod file.
Sourcing module code in subdirectories changes the form of the version tag you
must use when publishing a module. You must prefix the version number part of
the tag with the name of the subdirectory that is the module root. For more
about version numbers, see [Module version numbering](/doc/modules/version-numbers).
For example, for module `example.com/mymodules/module1` below, you would have
the following for version v1.2.3:
* Module path: `example.com/mymodules/module1`
* Version tag: `module1/v1.2.3`
* Package path imported by a user: `example.com/mymodules/module1/package1`
* Module path as given in a user's require directive: `example.com/mymodules/module1 module1/v1.2.3`
<img src="images/multiple-modules.png"
alt="Diagram illustrating two modules in a single repository"
style="width: 480px;" />