Search code examples
gogo-modules

Is that possible to import a local package inside ~/go/src/ from a module?


I am using go module, the file structure is like this:

~/some_path/goapp/go.mod
~/some_path/goapp/go.sum
~/some_path/goapp/main.go

~/go/src/fakedomain.com/fakeuser/foo/foo.go

Inside main.go, I tried to do

import fakedomain.com/fakeuser/foo

But, it doesn't work at all. I tried to add the following to go.mod:

require fakedomain.com/fakeuser/foo 

OR

require fakedomain.com/fakeuser/foo
replace fakedomain.com/fakeuser/foo /home/user/go/src/fakedomain.com/fakeuser/foo

None of them works. How can I achieve this?

Edited

This question is about how to import a local package inside ~/go/src/ from a module which is outside ~/go/src/.

In other words, the module which is outside ~/go/src/ will import a local package inside ~/go/src/. I thought I could import it directly (that is what I did in the old days without module), but I was wrong. It turns out that I have to make the local package inside ~/go/src/ become a module too.


Solution

  • Thank @MartinTournoij, @Peter, @DaveC very much for their help and comments which I have upvoted. After following all the directions, I finally make it work.

    (Btw, I really shouldn't trust VSCode error message too much. Because I normally check errors from VSCode. Thus I didn't try go build before asking this question. I thought they should return the same error, but they are not. go build provides more reasonable error messages than VSCode.)

    There were three problems.

    • Missing version from require in go.mod
    • Missing => from replace in go.mod
    • Missing go.mod for foo package.

    So to make it work:

    File Structure:

    ~/some_path/goapp/go.mod
    ~/some_path/goapp/go.sum
    ~/some_path/goapp/main.go
    
    ~/go/src/fakedomain.com/fakeuser/foo/foo.go
    ~/go/src/fakedomain.com/fakeuser/foo/go.mod
    

    ~/some_path/goapp/go.mod:

    ...
    require fakedomain.com/fakeuser/foo v0.0.0
    replace fakedomain.com/fakeuser/foo => /home/user/go/src/fakedomain.com/fakeuser/foo
    

    main.go:

    package main
    import fakedomain.com/fakeuser/foo
    ...
    

    ~/go/src/fakedomain.com/fakeuser/foo/go.mod:

    module fakedomain.com/fakeuser/foo
    
    go 1.12