Go Wiki:PackagePublishing
简介
现在,您已经花费了许多时间编写软件包、调试和测试它(您确实测试了它,不是吗?),您希望发布它,以便其他人可以go get您的软件包。
首先,你需要在线托管它。三个主要的代码托管网站是 bitbucket (hg/git)、GitHub (git) 和 launchpad (bzr)。我建议选择你熟悉的版本控制系统,或者你的代码在你的机器上是本地版本控制的。Git (git) 是中央 Go 存储库使用的版本控制系统,因此它最接近保证,因为想要使用你的项目的开发人员将拥有正确的软件。如果你以前从未使用过版本控制,这些网站有一些不错的 HOWTO,并且你可以通过在 Google 中搜索“{name} 教程”找到许多很棒的教程,其中 {name} 是你想要学习的版本控制系统的名称。
包设置
选择导入
你的包的完整导入通常包含一些标识其作者的内容(特别是在 GitHub 等托管网站上,“github.com/kylelemons/…” 是完整导入),始终应包含项目名称,并且如果与项目名称不同,则应以你开发的包的名称结尾。例如,go-gypsy 项目提供了一个 yaml 包,由 Kyle Lemons 编写,因此具有以下导入路径
import "github.com/kylelemons/go-gypsy/yaml"
^ ^ ^ ^
| | | `-- Package name
| | `-------- Project name
| `------------------- Author's handle
`----------------------------- Hosting site
Go >= 版本 1 支持包存储库的子目录。
子目录
通常,你为包使用的名称将包含“Go”作为其前缀、后缀或缩写的一部分,你可能希望它成为 go 源文件中的实际命令或包名称的一部分,也可能不希望。通常,你的包中既可以包含库,也可以包含命令,并且它们不能共存于同一目录中。当发生这种情况时,你将需要使用子目录来构建你的存储库。
例如,考虑一个提供“epub”包和“publish”命令的项目“Go-PublishingExample”。目录结构可以是
./epub/ # Package source, all files package "epub"
./publish/ # Command source
./doc/ # Documentation which won't be downloaded
./examples/ # Example code which won't be downloaded
包的导入语句将如下所示
import "codesite.tld/authorName/Go-PublishingExample/epub"
通常最好确保最后一个目录路径(在本例中为“epub”)与目录中源文件使用的包名称匹配。在本例中,基本目录中不包含任何可获取的文件,因为二进制文件和包都不被命名为“Go-PublishingExample”。
分支和标签
请注意,本节已过时。以下伪版本号适用于 Go < 版本 1;此外,Go 存储库本身现在使用 Git 而不是 Mercurial。也许我们应该删除本节。
你可以使用“go help get”和“go help importpath”获取 go get 的最新信息。
通常情况下,Go 源代码树可以存在三种基本状态。它可以检出到 Go 发布分支(在撰写本文时为 r60(在 Google Code 上)——这是大多数用户应该使用的地方),或者它可以检出到 Go Weekly(大约每周制作一次新标记),或者检出到 tip(Mercurial 中最新更改的术语)。后两者主要用于 Go 语言本身的开发者或需要尚未引入最新版本的功能或修复的开发者。
由于你可能会继续与你的团队合作开发尚未准备好供一般使用代码的项目,因此建议你利用版本控制系统的标记或分支功能。go get 工具理解一些特殊标记和分支,你可能希望使用它们来确保用户获得兼容版本的包
go.r60 -- A "go.r##" tag will be checked out if the user has that Go release installed
go.weekly.2011-07-19 -- A "go.weekly.YYYY-MM-DD" tag will be checked out if the user has that weekly installed
如果已安装的标记没有匹配项,go get 将尝试回退到上一个标记,如果找不到,则默认安装 tip。
在 Mercurial 中创建和维护你的发行版本标记
## Create or update a release tag
hg tag myProj-v0.0 # tag an easy-to-remember version number if you wish
hg tag go.r60 # tag this as being go release.r60 compatible
在 Git 中创建和维护发行版本分支
## Create a release branch
git tag myProj-v0.0 # Tag an easy-to-remember version number if you wish
git checkout -b go.r60 # create a release branch
git checkout master # to switch back to your master branch
## Update the release branch
git checkout go.r60 # switch to the release branch
git merge master # merge in changes from the master branch since last release
git checkout master # switch back to master branch
如果你正在使用其他分支名称,请在必要时替换这些名称。
通常不需要维护每周标记或分支,但维护发行版本分支或标记非常有用,因为这将确保你的项目拥有最广泛的受众。
命令与包
由于 go get 不使用项目的 Makefile,因此了解它将如何实际构建你的项目非常重要。
同一目录中的所有文件应始终共享相同的包名称。任何以_test
或_os
和/或_arch
后缀命名的文件都将被忽略(除非操作系统/架构匹配)。如果包名称为“main”,go get 将根据目录名称(仅使用最后一个路径段)从源文件构建一个可执行文件。如果包名称是其他任何内容,go get 将将其构建为一个包,并且导入路径将是你项目的根目录的 Web 可访问 URL,后跟子目录。请参阅go get 文档,了解如何为除主要四个站点之外的其他代码托管站点创建导入路径。
同一项目中的包之间的依赖关系很常见。如果项目中的一个包或命令依赖于另一个,则必须使用完整导入路径,以便 go get 识别依赖关系并确保其已构建。如果项目中的源文件中导入了第三方包,并且该包尚未存在,go get 也会自动下载并安装该包。
为了重复使用上面的示例,文件 ./publish/main.go
可能类似于以下内容
package main
import (
"flag"
)
import "codesite.tld/authorName/Go-PublishingExample/epub"
var dir = flag.String("dir", ".", "Directory to publish")
func main() {
flag.Parse()
epub.Publish(*dir)
}
希望安装此可执行文件的用户将执行
go get codesite.tld/authorName/Go-PublishingExample/publish
由于依赖关系,此命令还将安装 ".../epub"
包。希望仅安装库的开发人员可以执行
go get codesite.tld/authorName/Go-PublishingExample/epub
并且(如果他们尚未安装 publish
)只会下载并安装该包。请注意,在所有这些情况下,都不会下载示例或文档;在大多数情况下,可以通过代码站点浏览这些内容。
文档
godoc
在准备发布包时,你应该通过运行 godoc 的本地副本来确保文档看起来正确。如果你的包已安装到 go 包树中,则可以使用以下命令
godoc -http=:6060 &
然后浏览到 https://127.0.0.1:6060/pkg/ 并找到你的包。
仪表板
Go 仪表板将使用包级注释的第一行(也使用常规 godoc 格式)作为“信息”文本,因此请确保已设置此项。例如
// Package epub is an example publishing library.
package epub
有关 godoc 的更多信息,请参阅 记录 Go 代码 博客文章。
此内容是 Go Wiki 的一部分。