web-dev-qa-db-ja.com

Golang:現在のディレクトリ内のすべての.goファイルをコマンドラインから実行する(マルチファイルパッケージ)

私はGoの初心者です。私はこの言語が非常に好きですが、プログラムのサイズが大きくなるため、ファイルの分割を開始する必要があることにすぐに気付きました。

go run main.go(main.goが私のmain()関数を持つファイルであった場合)

うまくいかず、プログラムを機能させる方法がわからなかったため、しばらくの間障壁にぶつかりました。

いくつかのクイック検索は、私に答えを導きます

go run main.go other.go ..

ここで、私のpackage mainで構成され、プログラミングを実行できます。しかし、これは毎回やるのが非常に面倒でイライラします。

私のような他の人が再びこの障壁にぶつかることを防ぐために、私は次の自己回答の質問を書きます。

44
dk123

ネイトフィンチ 注:

Go runは、実際には非常に小さなプログラムでのみ使用されることを意図しており、通常は1つのファイルのみが必要です。

UNIXでも、go run *.goはしばしば正しくありません。単体テストがあるプロジェクト(およびすべてのプロジェクトに単体テストが必要です)では、次のエラーが発生します。

go run: cannot run *_test.go files (something_test.go)

ビルド制限も無視するため、_windows.goファイルはUnixでコンパイルされます(またはコンパイルが試行されます)。

議論のビットgo runは、残りのgoコマンドと同様に機能し、そのためのオープンCLがあります( 5164 )。現在、Go 1.4で検討中です。それまでの間、すべてのプラットフォームで推奨されるソリューションは次のとおりです。

go build && ./<executable>
64
Rob Napier

nix関連システム

ほとんどの場合、go run *.goで十分です。

これによりエラーが発生する場合は、以下の方法に進みます。

Windowsシステム(およびgo run *.goが機能しないその他の場合)

トークンの展開はWindowsのコマンドラインでは機能しないため、上記は機能せず、エラーが表示されます。 go run *.goは、現在のコンパイラの制限により、OSで動作しない場合もあります。

これらの場合、使用

go build && foo.exe

ここで、foo.exeは、生成される.exeファイルの名前です。おそらく実行可能ファイルの名前がわからない場合は、まず

go buildおよび生成された.exeファイルの名前を確認します。その後、ファイル名を含むメソッドを使用します。

これら2つのメソッドは、現在のディレクトリ内のすべての.goファイルを最小限の手間で構築して実行します。

22
dk123

すべてを実行できます.goファイル、テストを除く、このbash構造を使用:

go run $(ls -1 *.go | grep -v _test.go)
18
Ruben S

これを行う最良の方法は、次のように実行することです。

go run !(*_test).go

エラーを回避するために必要なテストファイルをすべてスキップします。

他の提案:

go build && ./<executable>

少し迷惑です。 gitによってマークされないように、常に実行可能ファイルを削除する必要があります。もちろんgitignoreに入れることもできますが、私は怠け者であり、これは余分なステップです。

17
r.sendecky

最後に、次を使用できます。

go run .

おかげで: https://github.com/golang/go/issues/22726#issuecomment-345841019

9
Macilias

あなたの質問の権利を理解している場合、他のコードをライブラリとしてインポートする必要があります。

ちょっとした例

./ testing/main.go:

package main

import "fmt"
import L "testing/lib"

func main() {
    fmt.Println("Hello from main()")
    L.Somefunc()
}

./ testing/lib/somelib.go:

package lib

import "fmt"

func Somefunc() {
    fmt.Println("Hello from Somefunc()")
    return
}

打ち上げへ - go run main.go

5
Noisee

これを使うだけ

go run *.go 

テストファイルがないと仮定して動作します

2
Vinay Mahamuni

私の解決策は次のとおりです。

go run $(find . -name "*.go" -and -not -name "*_test.go" -maxdepth 1)

コマンドラインアプリを簡単に実行できるようにエイリアスで使用します

alias gorun='go run $(find . -name "*.go" -and -not -name "*_test.go" -maxdepth 1)'

$ gorun param1 param2
2

Windowsでは、通常、すべてのプロジェクトディレクトリに少しtest.batを追加するだけです。

go build
.\{project_name}.exe
go clean

十分に機能します。もちろん、{project_name}を実行可能ファイルの名前に置き換えます。そして、実行可能ファイルが終了すると、バッチスクリプトはクリーンアップに進みます。

1

ウィンドウの場合、次のように機能します。cmdを開き、フォルダーが存在するパスに移動します。次に、次のコマンドを入力してEnterを押します。

go build

この後、1つの実行可能ファイルが作成されます。次に、コマンドプロンプトで実行可能ファイルを呼び出します。実行可能ファイル名がProject.exeの場合、次を入力してEnterキーを押します。

Project.exe
0
M. Paul

go run と組み合わせ go generate解決策は次のとおりです。

//go:generate sh -c "go run path/*.go"
0
Rémi Rousselet