複数のファイルで構成されるGoプログラムをコンパイルする方法は?


88

3つのファイルで構成される小さなプログラムがあり、すべて同じパッケージ(main)に属していますが、「go build main.go」を実行すると、ビルドが成功しません。1つのファイル(main.go)のみの場合、すべてが正常に機能しました。コードを分離するために少し労力を費やしたので、コンパイラーはmain.goから取り出されてこれらの2つの他のファイル(main.goと同じディレクトリーにある)に入れられたものを見つけることができないようです。 。これにより、「未定義の「タイプ」」エラーが発生します。

複数のファイルで構成されるこのプログラムをコンパイルする方法は?

回答:


85

新しい方法(推奨):

この答えを見てください

古い方法:

myprogというプログラムを作成しているとします。

このようなディレクトリにすべてのファイルを置きます

myproject/go/src/myprog/xxx.go

次にmyproject/goGOPATHに追加します

そして走る

go install myprog

この方法で、必要に応じてmyproject / go / srcに他のパッケージやプログラムを追加できます。

リファレンス:http : //golang.org/doc/code.html

(このドキュメントは、初心者には常に見逃されており、最初はよく理解されていません。GoチームIMOの最大の注意を引くはずです)


5
/ go /を削除してmyproject / srcを実行しないのはなぜですか?
Alexander Mills

また、「go install myprog」がプロジェクトソースを$ GOPATHの場所に何らかの方法で書き込むと思いますか?そうですか?もしそうなら、その説明も答えの一部として持つとよいでしょう
Alexander Mills

1
@AlexanderMills小さなプロジェクトだけが1つのテクノロジーだけを使用しています。
DenysSéguret2017年

2
@DenysSéguret私はそれに同意するかわかりませんが、とにかくこれは単純なプロジェクトのためであり、行く部分を落とすことができます-人々は行くことが必要であり、そうではないことを想定するかもしれません。あなたは私に、どちらがより簡単か、行くかどうかを教えてください。:)
Alexander Mills

1
このフォルダ構造がなぜなのかまだわかりませんか?
Madeo

67

main.goたとえばからにコードを分離するときはmore.go、単にそのファイルをgo build/ go run/ go installにも渡します。

したがって、以前に実行した場合

go build main.go

あなたは今単に

go build main.go more.go

詳細情報として:

go build --help

状態:

引数が.goファイルのリストである場合、buildはそれらを単一のパッケージを指定するソースファイルのリストとして扱います。


ことに注意してくださいgo buildgo installは異なりgo run期待する最初の二つの状態という点で、パッケージ名、後者を期待をしながら、引数としてのファイルを行きます。ただし、最初の2つはgo installと同様にgoファイルも受け入れます。

疑問に思っている場合:ビルドはbuildパッケージ/ファイルのみinstallで、GOPATHにオブジェクトファイルとバイナリファイルを生成しrun、プログラムをコンパイルして実行します。


6
ますます多くのファイルを追加し続けたくない場合は、正規表現を次のように使用します。go run * .go
NateW

わかりました、Goは常に1つの実行可能ファイルだけを書き出しますか?(Javaのように)実行可能ファイルを分離したままにしないのですか?
Alexander Mills

@AlexanderMillsはWindowsのため、nixを使用すると思います。または少なくともmingw。
Sergey Gorlanov 2017年

ええ、私はMacOSのを使用していたが、多分それはアップfuckinのですBashのバージョン3ですが、私はbashの4にアップグレードする必要があります
アレクサンダー・ミルズ

29

実行することもできます

go build

プロジェクトフォルダーmyproject / go / src / myprog

次に、単に入力することができます

./myprog

アプリを実行する


3
出力は実行可能オブジェクトではなくgoオブジェクトです。
user2284570 2017

user2284570 @ただ追加しchmod +x、それを実行するために、そのファイルのパーミッションを
dalmate

13

Go 1.11以降、GOPATHは推奨されなくなりました。新しい方法はGoモジュールを使用することです。

次のプログラムを作成しているとしsimpleます。

  1. ディレクトリを作成します。

    mkdir simple
    cd simple
  2. 新しいモジュールを作成します。

    go mod init github.com/username/simple
    # Here, the module name is: github.com/username/simple.
    # You're free to choose any module name.
    # It doesn't matter as long as it's unique.
    # It's better to be a URL: so it can be go-gettable.
  3. すべてのファイルをそのディレクトリに置きます。

  4. 最後に、実行します:

    go run .
  5. または、ビルドして実行可能プログラムを作成することもできます。

    go build .
    
    # then:
    ./simple     # if you're on xnix
    
    # or, just:
    simple       # if you're on Windows

詳細については、あなたが読んでも、これを

Goには、1.11以降、ここで提案されているバージョン対応モジュールのサポートが含まれています。最初のプロトタイプvgoは2018年2月に発表されました。2018年7月、バージョン管理されたモジュールがメインのGoリポジトリに配置されました。Go 1.14では、モジュールサポートは本番環境での使用の準備ができていると見なされ、すべてのユーザーが他の依存関係管理システムからモジュールに移行することをお勧めします。



5

プロジェクトの構造によって異なります。しかし、最も簡単なのは:

go build ./... -o ./myproject

次にを実行し./myprojectます。

プロジェクトの構造が次のようになっているとします

- hello
|- main.go

次に、プロジェクトディレクトリに移動して実行します

go build -o ./myproject

次に./myprojectシェルで実行します。

または

# most easiest; builds and run simultaneously
go run main.go

メインファイルが次のようなサブディレクトリにネストされているとします。 cmd

- hello
|- cmd
 |- main.go

それからあなたは走ります

go run cmd/main.go

3

うん!これは非常に単純明快であり、そこでパッケージ戦略が作用します。私の知識には3つの方法があります。フォルダー構造:

GOPATH / src / github.com/ abc / myproject / adapter / main.go pkg1 pkg2警告:アダプターにはパッケージのメインのみとsunディレクトリを含めることができます

  1. 「アダプター」フォルダーに移動します。実行:
    go build main.go
  1. 「アダプター」フォルダーに移動します。実行:
    go build main.go
  1. GOPATH / srcに移動して、パッケージのメインへの相対パスを認識します。ここでは「myproject / adapter」です。実行:
    go build myproject/adapter

exeファイルは、現在のディレクトリに作成されます。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.