Go Wiki: パッケージ公開

はじめに

パッケージの記述、デバッグ、テストに多くの時間を費やした今(テストしましたよね?)、他のユーザーがgo getを使ってパッケージを利用できるように公開したいでしょう。

まず、オンラインでホスティングする必要があります。主要なコードホスティングサイトとしては、bitbucket(hg/git)、GitHub(git)、launchpad(bzr)の3つがあります。お使いのバージョン管理システム、またはローカルマシンでコードのバージョン管理に使用しているシステムを選択することをお勧めします。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.0以降のバージョンでは、パッケージリポジトリのサブディレクトリがサポートされています。

サブディレクトリ

多くの場合、パッケージに使用される名前には「Go」という接頭辞、接尾辞、または頭字語の一部が含まれ、Goソースファイルのコマンドやパッケージ名の一部にするかどうかを検討する必要があるかもしれません。多くの場合、パッケージにはライブラリとコマンドの両方が含まれることがあり、これらは同じディレクトリに共存できません。このような状況では、サブディレクトリを使用してリポジトリの構造を構築することをお勧めします。

たとえば、「Go-PublishingExample」というプロジェクトで「epub」パッケージと「publish」コマンドを提供する場合、ディレクトリ構造は次のようになります。

./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 get可能なファイルは含まれていません。

ブランチとタグ

このセクションは古くなっています。以下の擬似バージョン番号はGo < 1.0に適用されます。また、Goリポジトリ自体も現在はMercurialではなくGitを使用しています。このセクションを削除した方が良いかもしれません。

「go help get」と「go help importpath」を使用して、go getに関する最新の情報を入手できます。

一般的に、Goソースツリーは3つの基本的な状態のいずれかになります。Goリリースブランチ(この記事を書いている時点ではGoogle Codeのr60 - ほとんどのユーザーはこちらを使用する必要があります)、Go Weekly(およそ週1回新しいタグが作成されます)、またはtip(Mercurialで最新の変更を示す用語)でチェックアウトできます。最後の2つは、主に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

他のブランチ名を使用している場合は、必要に応じてそれらの名前を置き換えてください。

通常、Weeklyタグやブランチを維持する必要はありませんが、リリースブランチやタグを維持することは非常に役立ちます。これにより、プロジェクトの利用範囲が広がります。

コマンドとパッケージ

go getはプロジェクトのMakefileを使用しないため、プロジェクトが実際にどのようにビルドされるかを理解することが重要です。

同じディレクトリ内のすべてのファイルは、常に同じパッケージ名を持つ必要があります。_test_os、および/または_archサフィックスが付いたファイルは無視されます(os/archが一致する場合を除きます)。パッケージ名が「main」の場合、go getはソースファイルから実行可能ファイルをビルドし、ディレクトリ名(最後のパスセグメントのみを使用)に従って名前を付けます。パッケージ名が他の場合、go getはパッケージとしてビルドし、インポートパスはプロジェクトのルートのWebアクセス可能なURLとサブディレクトリになります。主要な4つのサイト以外のコードホスティングサイトのインポートパスを作成する方法については、go getのドキュメントを参照してください。

同じプロジェクト内のパッケージ間の依存関係は一般的です。プロジェクト内の1つのパッケージまたはコマンドが別のものに依存している場合、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 &

その後、http://localhost:6060/pkg/にアクセスして、パッケージを見つけます。

ダッシュボード

Goダッシュボードは、パッケージレベルのコメントの最初の行(通常のgodoc形式も使用)を「情報」テキストとして使用するため、これが設定されていることを確認してください。たとえば

// Package epub is an example publishing library.
package epub

godocの詳細については、Goコードのドキュメント化ブログ記事を参照してください。


このコンテンツは、Go Wikiの一部です。