15

ライブラリを構築していますが、スタンドアロンのバイナリとしても使用できるようにしたいと考えています。

たとえば、Tarの実装を構築しているとしましょう。Tarは一般的にコマンドとして使用されますが、ライブラリとしても使用できます。直感的に、私は次のようなことをします:

src/
    tar/
        tar.go # belongs to package tar
        main.go # imports tar and provides a main function

しかし、これはうまくいかないようです。ドキュメントから、「コマンド」はライブラリとは別の名前を付ける必要があるようです。そこに示されている例をこの例に当てはめると、次のディレクトリ構造になります。

src/
    tar/
        tar.go # belongs to package tar
    tarbin/
        main.go # imports tar and provides a main function

ただし、これにより、tarbinではなくtar、と呼ばれるコマンドが作成され$GOPATH/binます。私が見つけた回避策は実行することですgo build -o $GOPATH/bin/tar tarが、私はひどく間違ったことをしているように感じます。もっと良い方法はありますか?

注:tarこれが標準ライブラリに含まれていることはよく知っています。例としてのみ使用しています。

4

1 に答える 1

21

私はおそらくこれを行うだろう

src/
    tar/
        tar.go         # tar libary
        tar/
            main.go    # tar binary

これにより、 と呼ばれるバイナリとtarと呼ばれるライブラリが得られますtar

これを github でホストしているとしましょう。

src/
    github.com/
        you/
            tar/
                tar.go         # tar libary
                tar/
                    main.go    # tar binary

これにより、実行時にtarと呼ばれるバイナリと、実行時にgo get install github.com/you/tar/tar呼び出されるライブラリが提供されgithub.com/you/tarますgo get install github.com/you/tar

どちらがより重要であるかに応じて、ライブラリとバイナリを入れ替えることができます

src/
    github.com/
        you/
            tar/
                main.go            # tar binary
                tar/
                    tar.go         # tar libary

すべてのコードを 1 つのツリーに保持するとgo install ./...、ルートからすべてのパッケージとサブパッケージをビルドできるという利点があります。 go test|fmt ./...また。(実際には 3 つのドットであることに注意してください!)

于 2013-01-11T18:38:08.547 に答える