Go 言語のプログラミングは、独自のコードであろうとサードパーティのコードであろうと、基本的にソース コードに基づいており、GOPATH は作業ディレクトリおよびプロジェクト ディレクトリ ルールの完全なセットとして使用されます。したがって、 C++のような Go 言語の毎日のコンパイルで、さまざまなインクルード パス、リンク ライブラリ アドレスなどを設定する必要はありません。
Go 言語で使用される go build コマンドは、主にコードをコンパイルするために使用されます。パッケージのコンパイル中に、必要に応じて、それに関連付けられたパッケージも同時にコンパイルされます。
go build にはパラメータなしコンパイル、ファイルリストコンパイル、指定パッケージコンパイルなど多くのコンパイル方法があり、これらの方法で実行ファイルを出力できます。
go build パラメータなしでコンパイルする
このセクションで使用するコードの具体的な場所は./src/chapter11/gobuild
です。
main.go コードは次のとおりです。
package main
import (
"fmt"
)
func main() {
// 同じパッケージ内の関数
pkgFunc()
fmt.Println("こんにちは世界")
}
lib.go コードは次のとおりです。
package main
import "fmt"
func pkgFunc() {
fmt.Println("call pkgFunc")
}
ソース コード内に GOPATH に依存するパッケージ参照がない場合、これらのソース コードでは引数なしの go build を使用できます。形式は次のとおりです。
go build
次のように、コードが配置されているディレクトリ ( ./src/gobuild
) で go build コマンドを使用します。
$ cd src/gobuild/
$ go build
$ ls
gobuild lib.go main.go
$ ./gobuild
call pkgFunc
こんにちは世界
コマンドラインの指示と出力の説明は次のとおりです。
- 1 行目、この例のソース コード ディレクトリに移動します。
- 2 行目、go build がコンパイルを開始すると、現在のディレクトリ内の go ソース コードが検索されます。この例では、 go build は lib.go と main.go という 2 つのファイルを見つけます。これら 2 つのファイルをコンパイルすると、現在のディレクトリ名の実行可能ファイルが生成され、現在のディレクトリに配置されます (ここでの実行可能ファイルは go build)。
- 行 3 と行 4 では、現在のディレクトリ内のファイルがリストされ、コンパイルが成功し、go build 実行可能ファイルが出力されます。
- 5 行目、現在のディレクトリで実行可能ファイル go build を実行します。
- 6 行目と 7 行目は go build を実行した後の出力です。
ビルド+ファイルリストに移動
同じディレクトリにある複数のソース コード ファイルをコンパイルする場合、go build の後に複数のファイル名を指定すると、go build がこれらのソース コードをコンパイルして実行可能ファイルを出力します。「go build+ファイル リスト」の形式は次のとおりです。
go build file1.go file2.go……
コードが配置されているディレクトリ (./src/chapter11/gobuild) で go build を使用し、go build 後にコンパイルするソース コードのファイル名を追加します。コードは次のとおりです。
$ go build main.go lib.go
$ ls
lib.go main main.go
$ ./main
call pkgFunc
hello world
$ go build lib.go main.go
$ ls
lib lib.go main main.go
コマンドラインの指示と出力の説明は次のとおりです。
- 1行目はgo build後にファイルリストを追加し、コンパイルするGoソースコードを選択します。
- 行 2 と行 3 には、コンパイル後の現在のディレクトリ内のファイルがリストされます。今回は実行ファイル名がmainになります。
- 行 4 ~ 6 ではメイン ファイルを実行し、目的の出力を取得します。
- 7 行目で、lib.go がリストの最初に配置されるようにファイル リストの順序を調整してみます。
- 8 行目と 9 行目では、lib 実行可能ファイルがコンパイル結果に表示されます。
ヒント
「go build+file list」メソッドを使用してコンパイルする場合、実行可能ファイルは、ファイル リストの最初のソース ファイルを実行可能ファイル名として選択し、デフォルトで出力します。
出力実行可能ファイル名を指定する必要がある場合は、 -o
パラメーターを使用できます。次の例を参照してください。
$ go build -o myexec main.go lib.go
$ ls
lib.go main.go myexec
$ ./myexec
call pkgFunc
こんにちは世界
上記のコードでは、 -o myexec
パラメーターが go build とファイル リストの間に挿入され、指定された出力ファイル名が myexec であることを示しています。
知らせ
「go build+file list」コンパイル方法でコンパイルする場合、ファイル リスト内の各ファイルは、同じパッケージの Go ソース コードである必要があります。つまり、すべてのプロジェクトの Go ソースコードを C++ のようなファイルリスト方式でコンパイルすることはできません。複雑なプロジェクトをコンパイルする場合は、「指定したパッケージのコンパイル」方法を使用する必要があります。
「go build+file list」メソッドは、少数のファイルのみを含む Go 言語で書かれたツールに適しています。
ビルド+パッケージに行く
「go build+package」はGOPATH設定後、パッケージ名に従って直接コンパイルすることができ、パッケージ内のファイルを追加(add)したり削除(delete)してもコンパイル命令には影響しません。
1) コードの場所とソースコード
このセクションで使用するコードの具体的な場所は./src/goinstall
です。
GOPATH に対するディレクトリ関係は次のとおりです。
.
└── src
└──goinstall
├── main.go
└── mypkg
└── mypkg.go
main.go コードは次のとおりです。
package main
import (
"/mypkg"
"fmt"
)
func main() {
mypkg.CustomPkgFunc()
fmt.Println("hello world")
}
mypkg.go コードは次のとおりです。
package mypkg
import "fmt"
func CustomPkgFunc() {
fmt.Println("call CustomPkgFunc")
}
2) パッケージごとにコマンドをコンパイルする
次のコマンドを実行して、パッケージごとに goinstall コードをコンパイルします。
$ export GOPATH=/home/code
$ go build -o main goinstall
$ ./goinstall
call CustomPkgFunc
hello world
コードの説明は次のとおりです。
- 1 行目、環境変数 GOPATH を設定します。ここでのパスは作成者のディレクトリです。実際のディレクトリに従って GOPATH を設定できます。
- 2 行目では、
-o
が実行され、出力ファイルが main であることを指定し、その後にコンパイルするパッケージ名が続きます。パッケージ名は、GOPATH 上の src ディレクトリを基準にして始まります。 - 3 行目から 5 行目ではコンパイルが成功し、main の実行後に期待した出力が得られます。
読者がこの例を参照してコードをコンパイルするときは、GOPATH を独自のディレクトリに置き換える必要があります。 GOPATH 下のディレクトリ構造に注意してください。ソース コードは GOPATH 下の src ディレクトリに配置する必要があります。すべてのディレクトリに日本語を含めないでください。
go build には、以下の表に示すように、追加のパラメーターがいくつかあり、より多くのコンパイル情報とより多くの操作を表示できます。
追加パラメータ | 述べる |
---|---|
-v | コンパイル時にパッケージ名を表示する |
-pn | 同時コンパイルを有効にします。デフォルトでは、この値は CPU 論理コアの数です。 |
-a | 強制再構築 |
-n | コンパイル時に使用されるすべてのコマンドを出力しますが、実際には実行されません |
-path | コンパイル時に使用されるすべてのコマンドを出力します。 |
-type | 競合検出を有効にする |
表内の追加パラメータは使用頻度に応じて配置されており、読者は必要に応じてそれらを選択して使用できます。