Does it make sense to have two packages in the same directory?

Viewed 60538

I have a project that provides a library (exports some funcs) and also must provide a command-line interface (there must be an executable file).

Example of directory structure:

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

The go compiler needs the package main and func main to start execution. My library needs the package myproject where I put stuff on it. This is what the go tool says when I am building another project that tries to import myproject:

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

So I believe there is no way to do it.

Should I move the library or the CLI to another package?

4 Answers

In most cases, no. However, there is an exception for unit tests.

Working Example:

Here are 2 different packages (mypackage and mypackage_test) in 1 directory (mypackage). The compiler will not complain about this.

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...

Rules:

  1. The 2 packages must have the following names:

    • NameOfDirectory.
    • NameOfDirectory + _test.
  2. The names of the files in the _test package must end with _test.go

If you're receiving a confusing compiler error along the lines of found packages "foo" and "bar", you've probably broken one or more of these rules.

You can't have two golang files in one directory with two packages. So you need to move main.go out of myproject.

the directory structure before move

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

After move

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

And you need to change your main.go's import path. If the module name is aaa

Before

import "aaa"

Need change to this

import "aaa/myproject"
Related