build

package
v1.23.0 Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Aug 14, 2024 License: MIT Imports: 3 Imported by: 0

Documentation

Overview

buildパッケージはGoのパッケージに関する情報を収集します。

Go Path

Goパスは、Goのソースコードが含まれているディレクトリツリーのリストです。 これは、標準のGoツリーで見つからないインポートを解決するために参照されます。 デフォルトのパスは、GOPATH環境変数の値であり、オペレーティングシステムに適したパスリストとして解釈されます (Unixでは変数はコロンで区切られた文字列であり、 Windowsではセミコロンで区切られた文字列、 Plan 9ではリストです)。

Goパスにリストされている各ディレクトリには、指定された構造が必要です:

src/ディレクトリにはソースコードが格納されます。'src'以下のパスがインポートパスまたは実行可能ファイル名を決定します。

pkg/ディレクトリにはインストールされたパッケージオブジェクトが格納されます。 Goツリーと同様に、各ターゲットオペレーティングシステムと アーキテクチャのペアに対して、pkgのサブディレクトリがあります (pkg/GOOS_GOARCH)。

DIRがGoパスにリストされているディレクトリである場合、DIR/src/foo/barにソースがあるパッケージは「foo/bar」としてインポートされ、 「DIR/pkg/GOOS_GOARCH/foo/bar.a」(またはgccgoの場合は「DIR/pkg/gccgo/foo/libbar.a」)にコンパイルされた形式でインストールされます。

bin/ディレクトリにはコンパイルされたコマンドが格納されます。 各コマンドは、ソースディレクトリを使用して命名されますが、 パス全体ではなく最終要素のみを使用します。つまり、 DIR/src/foo/quuxのソースであるコマンドはDIR/bin/quuxにインストールされます。DIR/bin/foo/quuxではなく、foo/が取り除かれます。 そのため、PATHにDIR/binを追加することで、インストールされたコマンドにアクセスできます。

以下にディレクトリレイアウトの例を示します:

GOPATH=/home/user/gocode

/home/user/gocode/

src/
    foo/
        bar/               (パッケージ bar の Goコード)
            x.go
        quux/              (メインパッケージの Goコード)
            y.go
bin/
    quux                   (インストールされたコマンド)
pkg/
    linux_amd64/
        foo/
            bar.a          (インストールされたパッケージオブジェクト)

ビルド制約

ビルド制約、またはビルドタグとも呼ばれるものは、 パッケージに含めるべきファイルの条件です。ビルド制約は、次の行コメントによって与えられます。

//go:build

ビルド制約は、ファイル名の一部にもなることがあります (例えば、source_windows.go は、対象の オペレーティングシステムがwindowsの場合のみ含まれます)。

詳細は 'go help buildconstraint' (https://golang.org/cmd/go/#hdr-Build_constraints) を参照してください。

バイナリのみのパッケージ

Go 1.12 およびそれ以前では、 パッケージをソースコードなしでバイナリ形式で配布することが可能でした。 パッケージには、ビルド制約で除外されないソースファイルと 「//go:binary-only-package」というコメントが含まれていました。ビルド制約と同様に、このコメントはファイルの先頭に配置され、空行と他の行コメントだけが前にあること、コメントの後には空行があることで、パッケージのドキュメンテーションと区別されます。 ビルド制約とは異なり、このコメントは非テストのGoソースファイルでのみ認識されます。

バイナリのみのパッケージの最小のソースコードは以下のようになります:

//go:binary-only-package

package mypkg

ソースコードには追加のGoコードが含まれる可能性があります。このコードはコンパイルされないが、godocなどのツールによって処理され、エンドユーザのドキュメンテーションとして役立つかもしれません。

"go build" およびその他のコマンドはバイナリオンリーパッケージをサポートしていません。 ImportImportDir は、これらのコメントを含むパッケージのBinaryOnlyフラグを設定し、ツールやエラーメッセージで利用することができます。

Index

Constants

This section is empty.

Variables

View Source
var ToolDir = getToolDir()

ToolDirはビルドツールを含むディレクトリです。

Functions

func ArchChar

func ArchChar(goarch string) (string, error)

ArchCharは"?"とエラーを返します。 Goの以前のバージョンでは、返された文字列はコンパイラとリンカのツール名、デフォルトのオブジェクトファイルの接尾辞、 およびデフォルトのリンカの出力名に使用されました。Go 1.5以降、これらの文字列はアーキテクチャによって異なりません。 それらの文字列は、compile、link、.o、およびa.outです。

func IsLocalImport

func IsLocalImport(path string) bool

IsLocalImportは、インポートパスがローカルなインポートパス("."、".."、"./foo"、または"../foo"など)であるかどうかを報告します。

Types

type Context

type Context struct {
	GOARCH string
	GOOS   string
	GOROOT string
	GOPATH string

	// Dirは呼び出し元の作業ディレクトリです。空の文字列の場合、実行中のプロセスのカレントディレクトリが使用されます。モジュールモードでは、これはメインモジュールを特定するために使用されます。
	//
	// Dirが空でない場合、ImportとImportDirに渡されるディレクトリは絶対である必要があります。
	Dir string

	CgoEnabled  bool
	UseAllFiles bool
	Compiler    string

	// build、tool、およびrelease タグは、go:build 行の処理時に満たされていると考慮されるビルド制約を指定します。
	// 新しいコンテキストを作成するクライアントは、BuildTags をカスタマイズすることができます。デフォルトは空ですが、ToolTags や ReleaseTags をカスタマイズすることは通常エラーです。
	// ToolTags は、現在の Go ツールチェインの構成に適したビルドタグをデフォルトで持ちます。
	// ReleaseTags は、現在のリリースが互換性のある Go のリリースの一覧をデフォルトで持ちます。
	// BuildTags は、デフォルトのビルドコンテキストでは設定されません。
	// BuildTags、ToolTags、ReleaseTags に加えて、ビルド制約は GOARCH と GOOS の値を満たしたタグとして考慮されます。
	// ReleaseTags の最後の要素は現在のリリースと見なされます。
	BuildTags   []string
	ToolTags    []string
	ReleaseTags []string

	// InstallSuffixは、インストールディレクトリの名前に使用する接尾辞を指定します。
	// デフォルトでは空ですが、カスタムビルドでは出力を分離する必要がある場合にInstallSuffixを設定できます。
	// たとえば、レースディテクタを使用する場合、goコマンドはInstallSuffix = "race"を使用するため、
	// Linux/386システムでは、通常の「linux_386」の代わりに「linux_386_race」という名前のディレクトリにパッケージが書き込まれます。
	InstallSuffix string

	// JoinPathはパスフラグメントのシーケンスを1つのパスに結合します。
	// JoinPathがnilの場合、Importはfilepath.Joinを使用します。
	JoinPath func(elem ...string) string

	// SplitPathList はパスリストを個々のパスのスライスに分割します。
	// SplitPathList が nil の場合、Import は filepath.SplitList を使用します。
	SplitPathList func(list string) []string

	// IsAbsPathは、パスが絶対パスかどうかを報告します。
	// IsAbsPathがnilの場合、Importはfilepath.IsAbsを使用します。
	IsAbsPath func(path string) bool

	// IsDirはパスがディレクトリかどうかを報告します。
	// IsDirがnilの場合、Importはos.Statを呼び出し、結果のIsDirメソッドを使用します。
	IsDir func(path string) bool

	// HasSubdirは、dirがrootの下位ディレクトリであるかどうかを報告します。
	// 複数のレベル下位かもしれません。dirが存在するかどうかを確認しようとはしません。
	// もしそうであれば、HasSubdirはrelをスラッシュで区切られたパスとして設定し、
	// rootに結合してdirと同等のパスを生成することができます。
	// HasSubdirがnilの場合、Importはfilepath.EvalSymlinksを基に実装されたものを使用します。
	HasSubdir func(root, dir string) (rel string, ok bool)

	// ReadDirはディレクトリの内容を表すfs.FileInfoのスライスを名前でソートして返します。
	// ReadDirがnilの場合、Importはos.ReadDirを使用します。
	ReadDir func(dir string) ([]fs.FileInfo, error)

	// OpenFileは読み取り用にファイル(ディレクトリではありません)を開きます。
	// OpenFileがnilの場合、Importはos.Openを使用します。
	OpenFile func(path string) (io.ReadCloser, error)
}

Contextは、ビルドのサポートコンテキストを指定します。

var Default Context = defaultContext()

Defaultはビルド用のデフォルトのContextです。 もし設定している場合は、GOARCH、GOOS、GOROOT、およびGOPATHの環境変数を使用します。 設定されていない場合は、コンパイルされたコードのGOARCH、GOOS、およびGOROOTが使用されます。

func (*Context) Import

func (ctxt *Context) Import(path string, srcDir string, mode ImportMode) (*Package, error)

Importはimportパスによって指定されたGoパッケージについての詳細を返します。 srcDirディレクトリを基準として、ローカルなimportパスを解釈します。 もしパッケージが標準のimportパスを使用してインポート可能なローカルなパッケージの場合、返されるパッケージにはp.ImportPathがそのパスに設定されます。

パッケージを含むディレクトリでは、.go、.c、.h、および.sファイルはパッケージの一部と見なされますが、以下のものは除外されます:

  • パッケージドキュメント内の.goファイル
  • _または.で始まるファイル(おそらくエディタの一時ファイル)
  • コンテキストで満たされないビルド制約を持つファイル

エラーが発生した場合、Importは非nilのエラーと部分的な情報を含む非nilの*Package を返します。

func (*Context) ImportDir

func (ctxt *Context) ImportDir(dir string, mode ImportMode) (*Package, error)

ImportDirは、名前付きディレクトリで見つかったGoパッケージを処理する Import のようなものです。

func (*Context) MatchFile added in v1.2.0

func (ctxt *Context) MatchFile(dir, name string) (match bool, err error)

MatchFileは、指定されたディレクトリ内の指定された名前のファイルがコンテキストに一致し、そのディレクトリで ImportDir によって作成される Package に含まれるかどうかを報告します。

MatchFileは、ファイルの名前を考慮し、ctxt.OpenFileを使用してファイルの内容の一部または全部を読み取ることがあります。

func (*Context) SrcDirs

func (ctxt *Context) SrcDirs() []string

SrcDirsはパッケージソースルートディレクトリのリストを返します。 現在のGoルートとGoパスから引っ張りますが、存在しないディレクトリは省略します。

type Directive added in v1.21.0

type Directive struct {
	Text string
	Pos  token.Position
}

Directiveは、ソースファイル内で見つかるGoのディレクティブコメント(//go:zzz...)です。

type ImportMode

type ImportMode uint

ImportModeはImportメソッドの動作を制御します。

const (

	// FindOnlyが設定されている場合、Importはパッケージのソースが含まれるディレクトリを見つけた後に停止します。ディレクトリ内のファイルは読み込まれません。
	FindOnly ImportMode = 1 << iota

	// AllowBinaryが設定されている場合、対応するソースコードなしでコンパイル済みのパッケージオブジェクトでImportを満たすことができます。
	//
	// 廃止予定:
	// コンパイルのみのパッケージを作成するサポートされる方法は、ファイルの先頭に//go:binary-only-packageコメントを含むソースコードを書くことです。このようなパッケージは、このフラグの設定に関係なく認識されます(ソースコードを持っているので)し、戻り値のパッケージにBinaryOnlyフラグがtrueで設定されます。
	AllowBinary

	// ImportCommentが設定されている場合、パッケージ文のimportコメントを解析します。
	// もし理解できないコメントが見つかるか、複数のソースファイルで矛盾するコメントが見つかった場合、エラーが返されます。
	// 詳細はgolang.org/s/go14customimportを参照してください。
	ImportComment

	// デフォルトでは、Importは指定されたソースディレクトリ内のベンダーディレクトリを検索します。
	// GOROOTとGOPATHのルートを検索する前に適用されるベンダーディレクトリを検索します。
	// もしImportがベンダーディレクトリを見つけてパッケージを返す場合、返されるImportPathは完全なパスです。
	// "vendor"までのパス要素を含み、"vendor"自体を含むパッケージのパスです。
	// 例えば、Import("y", "x/subdir", 0)が"x/vendor/y"を見つけた場合、返されるパッケージのImportPathは"x/vendor/y"です。
	// 単純に"y"ではありません。
	// 詳細については、golang.org/s/go15vendorを参照してください。
	//
	// IgnoreVendorを設定すると、ベンダーディレクトリは無視されます。
	//
	// パッケージのImportPathとは異なり、返されるパッケージのImports、TestImports、およびXTestImportsは常にソースファイルからの正確なインポートパスです。
	// Importはこれらのパスを解決したり確認したりする試みはしません。
	IgnoreVendor
)

type MultiplePackageError added in v1.4.0

type MultiplePackageError struct {
	Dir      string
	Packages []string
	Files    []string
}

func (*MultiplePackageError) Error added in v1.4.0

func (e *MultiplePackageError) Error() string

type NoGoError

type NoGoError struct {
	Dir string
}

NoGoErrorは、ビルド可能なGoソースファイルが含まれていないディレクトリを説明するために Import で使用されるエラーです。(テストファイル、ビルドタグによって非表示にされたファイルなどは含まれる可能性があります。)

func (*NoGoError) Error

func (e *NoGoError) Error() string

type Package

type Package struct {
	Dir           string
	Name          string
	ImportComment string
	Doc           string
	ImportPath    string
	Root          string
	SrcRoot       string
	PkgRoot       string
	PkgTargetRoot string
	BinDir        string
	Goroot        bool
	PkgObj        string
	AllTags       []string
	ConflictDir   string
	BinaryOnly    bool

	// ソースファイル
	GoFiles           []string
	CgoFiles          []string
	IgnoredGoFiles    []string
	InvalidGoFiles    []string
	IgnoredOtherFiles []string
	CFiles            []string
	CXXFiles          []string
	MFiles            []string
	HFiles            []string
	FFiles            []string
	SFiles            []string
	SwigFiles         []string
	SwigCXXFiles      []string
	SysoFiles         []string

	// Cgoの指令
	CgoCFLAGS    []string
	CgoCPPFLAGS  []string
	CgoCXXFLAGS  []string
	CgoFFLAGS    []string
	CgoLDFLAGS   []string
	CgoPkgConfig []string

	// テスト情報
	TestGoFiles  []string
	XTestGoFiles []string

	// ソースファイル内で見つかったGoディレクティブコメント(//go:zzz...)。
	Directives      []Directive
	TestDirectives  []Directive
	XTestDirectives []Directive

	// 依存関係情報
	Imports        []string
	ImportPos      map[string][]token.Position
	TestImports    []string
	TestImportPos  map[string][]token.Position
	XTestImports   []string
	XTestImportPos map[string][]token.Position

	// //go:embed はGoのソースファイル内で見つかるパターンです。
	// 例えば、ソースファイルに次のように記述されている場合、
	//	//go:embed a* b.c
	// このリストはそれぞれの文字列を別々のエントリとして含んでいます。
	// (//go:embedについての詳細はパッケージembedを参照してください。)
	EmbedPatterns        []string
	EmbedPatternPos      map[string][]token.Position
	TestEmbedPatterns    []string
	TestEmbedPatternPos  map[string][]token.Position
	XTestEmbedPatterns   []string
	XTestEmbedPatternPos map[string][]token.Position
}

パッケージは、ディレクトリにあるGoパッケージを説明します。

func Import

func Import(path, srcDir string, mode ImportMode) (*Package, error)

Import は Default.Import の略記法です。

func ImportDir

func ImportDir(dir string, mode ImportMode) (*Package, error)

ImportDir は Default.ImportDir の省略形です。

func (*Package) IsCommand

func (p *Package) IsCommand() bool

IsCommandは、パッケージがインストールされるコマンド(単なるライブラリではない)として 考えられるかどうかを報告します。 "main"という名前のパッケージはコマンドとして扱われます。

Directories

Path Synopsis
Package constraintはビルド制約行の解析と評価を実装しています。
Package constraintはビルド制約行の解析と評価を実装しています。

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL