Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

golang modules and local packages

Tags:

module

go

I'm trying to understand how to organize my golang project using go1.11 modules. I tried several options, but none of them worked.

I have some code in the main package under the application folder and a local package that the main package uses.

$GOPATH
+ src
  + application/
    + main/
      + main.go
      + otherFileUnderMainPackage.go
    + aLocalPackage/
      + someCode.go
      + someCode_test.go
      + someMoreCode.go
      + someMoreCode_test.go

Files in the main package, imports ../aLocalPackage. When I compile by go build main/*.go it's working.

Then, I ran go mod init application: V.0.9.9 and got the go.mod file, but the build always fails. I always get error about not finding the local package: build application:V0.9.9/main: cannot find module for path _/.../src/application/aLocalPackage. I also tried to place the local package right under src/, place it under main/ etc. but none of these methods worked for me.

What is the way to use modules and local packages?

Thanks.

like image 436
nahsh Avatar asked Sep 12 '18 13:09

nahsh


People also ask

What is difference between module and package in Golang?

Using packages, you organize your code into reusable units. A module, on the other hand, is a collection of Go packages, with dependencies and versioning built-in. Modules were first introduced in Go 1.11, but it wasn't until Go 1.16 that the go command builds packages in module-aware mode by default.

What are modules in Golang?

Go modules commonly consist of one project or library and contain a collection of Go packages that are then released together. Go modules solve many problems with GOPATH , the original system, by allowing users to put their project code in their chosen directory and specify versions of dependencies for each module.

What is the difference between Go sum and Go mod?

go mod tidy acts as if all build tags are enabled, so it will consider platform-specific source files and files that require custom build tags, even if those source files wouldn't normally be built. The go. sum file may contain hashes for multiple versions of a module.


2 Answers

Relative import paths are not supported in module mode. You will need to update your import statements to use a full (absolute) import path.

You should also choose a module name other than application. Your module path should generally begin with a URL prefix that you control — either your own domain name, or a unique path such as github.com/$USER/$REPO.

like image 92
bcmills Avatar answered Oct 30 '22 05:10

bcmills


I had some problems working with local packages myself. There are two tricks to make it work:

  1. you run "go build" in the package directory

This compiles the package and places it in the build cache. This link about code organisation in go explains more. You can identify where the cache is using:

>go env GOCACHE
/home/<user>/.cache/go-build
  1. Import using a path relative to the project

I puzzled loads over what the correct import path was and finally discovered that go doc or go list will tell you.

>go doc
package docs // import "tools/src/hello/docs"
>go list
tools/src/hello/docs

For example. I have a hello world API project and was using swaggo to generate documentation which it does in a docs sub-directory. To use it I add an import:

_ "tools/src/hello/docs"

For my case the _ is important as docs is not used directly but we its init() function to be invoked.

Now in hello/main.go I can add "tools/src/hello/docs" and it will import the correct package.

The path is relative to the location of go.mod if you have one. I have tools/ here as I have a go.mod declaring "modules tools".

Modules are a different kettle of fish - see https://github.com/golang/go/wiki/Modules. Recent versions of go (1.11 and later) can create a go.mod file which you may use to fix the version of a module that is used and avoid go's crazy default behaviour of just downloading the latest version of any package you import.

like image 45
Bruce Adams Avatar answered Oct 30 '22 06:10

Bruce Adams