如何在golang中正确导入本地包,并使它仍然可以与heroku一起使用?

时间:2018-03-10 22:15:45

标签: go heroku

我在go项目中导入本地包时遇到问题。看来,当我在本地工作时,我必须使用完整路径导入:"" github.com/username/myproject/mypackage"。但是当我推送到heroku时,我得到一个关于无法找到该包的错误。如果我将导入更改为" myproject / mypackage",它适用于heroku,但不再适用于本地。

我在研究过程中看到的两种解决方案似乎是解决方法:

  1. 将我的本地软件包放入vendor/。我的理解是供应商目录适用于第三方库,所以我不应该滥用它。
  2. myproject/移至src/。所有golang资源似乎都强调文件结构非常重要,我应该有一个github.com文件夹。我不清楚为什么文件结构很重要,所以这就是我现在正在使用的解决方案,但我无法帮助,但我认为我做错了。< / LI>

    还有其他人遇到过这个问题吗?为清晰起见,我在下面提供了我的文件结构,.go文件和Godeps.json。

    我的文件结构:

    $GOPATH
    └───bin
    └───pkg
    └───src
        └───github.com
            └───username
                └───myproject
                    │   main.go
                    └───Godeps
                    │   │   Godeps.json
                    └───mypackage
                        │   mypackage.go
    

    mypackage.go

    package mypackage
    
    import (
        "fmt"
    )
    
    func PrintHelloWorld() {
        fmt.Println("Hello, world!")
    }
    

    main.go:

    package main
    
    import (
        "fmt"
        "github.com/username/myproject/mypackage" // import causing problems in heroku
        "log"
        "net/http"
        "log"
    )
    
    func sayHelloWorld(w http.ResponseWriter, r *http.Request) {
        mypackage.PrintHelloWorld()
        fmt.Fprintf(w, "Hello world!")
    }
    
    func main() {
        http.HandleFunc("/", sayHelloWorld)
    
        err := http.ListenAndServe(":9090", nil)
        if err != nil {
            log.Fatal("ListenAndServe: ", err)
        }
    }
    

    Godeps.json:

    {
        "ImportPath": "myproject",
        "GoVersion": "go1.10",
        "GodepVersion": "v80",
        "Deps": []
    }
    

    推送到heroku时出错:

    -----> Go app detected
    -----> Checking Godeps/Godeps.json file.
    -----> Using go1.10
     !!    Installing package '.' (default)
     !!
    -----> Running: go install -v -tags heroku .
    main.go:6:2: cannot find package "github.com/username/myproject/mypackage" in any of:
        /tmp/tmp.xY81RbKUze/.go/src/myproject/vendor/github.com/username/myproject/mypackage (vendor tree)
        /app/tmp/cache/go1.10/go/src/github.com/username/myproject/mypackage (from $GOROOT)
        /tmp/tmp.xY81RbKUze/.go/src/github.com/username/myproject/mypackage (from $GOPATH)
     !     Push rejected, failed to compile Go app.
    

0 个答案:

没有答案