web-dev-qa-db-ja.com

同じディレクトリに2つのパッケージがあるのは理にかなっていますか?

ライブラリを提供する(いくつかのfuncsをエクスポートする)プロジェクトがあり、コマンドラインインターフェイスも提供する必要があります(実行可能ファイルが必要です)。

ディレクトリ構造の例:

whatever.io/
    myproject/
        main.go
        myproject.go

Goコンパイラーは、実行を開始するためにpackage mainおよびfunc mainを必要とします。私のライブラリには、package myprojectが必要です。これは、myprojectをインポートしようとする別のプロジェクトをビルドするときにgoツールが言うことです。

main.go:5:2: found packages myproject (myproject.go) and main (main.go) in $GOPATH/src/whatever.io/myproject

だから私はそれを行う方法はないと信じています。

ライブラリまたはCLIを別のパッケージに移動する必要がありますか?

27
xrash

Main.goの同じディレクトリ内の新しいフォルダー内にパッケージを移動するだけです。 $ GOPATHの参照から新しいパッケージをインポートすることを忘れないでください。

例:

user@user:~/p/go/test/so-multipack$ ls -R
.:
a  main.go

./a:
a.go
user@user:~/p/go/test/so-multipack$ cat main.go 
package main

import (
    "../so-multipack/a"
)
func main(){
    a.Hello()
}
user@user:~/p/go/test/so-multipack$ cat a/a.go 
package a
import (
    "fmt"
)
func Hello(){
    fmt.Println("hello from a")
}
user@user:~/p/go/test/so-multipack$ go run main.go 
hello from a
user@user:~/p/go/test/so-multipack$ go build 
user@user:~/p/go/test/so-multipack$ ls
a  main.go  so-multipack
user@user:~/p/go/test/so-multipack$ 

便利なリンク:

go build vs go build file.go

18
Larry Battle

ディレクトリごとに2つのパッケージを持つことはできないため、エラーが発生します。だから、@ Larry Battleがあなたのmyproject.go新しいディレクトリに。

goコードの書き方

Goコードはワークスペース内に保持する必要があります。ワークスペースは、ルートに3つのディレクトリがあるディレクトリ階層です。

srcには、パッケージ(ディレクトリごとに1つのパッケージ)に編成されたGoソースファイルが含まれています、

pkgにはパッケージオブジェクトが含まれ、

binには実行可能なコマンドが含まれています。

16
Akavall

ほとんどの場合、no。ただし、単体テストの例外があります。

作業例:

1つのディレクトリ(mypackage)に2つの異なるパッケージ(mypackagemypackage_test)があります。コンパイラはこれについて文句を言いません。

mypackage folder:

mypackage/
  foo.go
  foo_test.go

mypackage/foo.go:

package mypackage

func Add(a int, b int) int {
    return a + b
}

mypackage/foo_test.go:

package mypackage_test

// Unit tests...

ルール:

  1. 2つのパッケージには次の名前が必要です。

    • NameOfDirectory。
    • NameOfDirectory + _test
  2. _testパッケージ内のファイルの名前は、_test.goで終わる必要があります

found packages "foo" and "bar"の行に沿って紛らわしいコンパイラエラーを受け取っている場合は、おそらくこれらのルールの1つ以上に違反しているでしょう。

2
byxor