【问题标题】:Type conflicts between projects项目之间的类型冲突
【发布时间】:2017-04-25 13:24:36
【问题描述】:

我想将特定子域使用的代码移动到它自己的项目中,这些代码将由当前所在的主代码库导入。我能够成功地将子域中的代码导入到主项目中,直到我添加Gorilla Mux 代码。例如,这有效:

// imports and non-relevant routes removed for simplicity
r := mux.NewRouter()
// Primary site routes here...
s := r.Host("subdomain-regex-here").Subrouter()
s.HandleFunc("/", people.Index)
http.ListenAndServe("localhost:8080", r)

但是当我将子域移动到它自己的项目并导入它,然后调用从主站点传入 mux.Router 对象的 LoadRoutes() 函数时,我收到一个错误。代码如下:

// Primary Project
r := mux.NewRouter()
// Primary site routes here...

// function located in the subdomain go project, which is imported
func LoadRoutes(host string, r *m.Router) {

    s := r.Host(host).Subrouter()
    s.HandleFunc("/", people.Index)
    s.HandleFunc("/people", people.Index)
    s.HandleFunc("/person/new", people.New)
}

# 命令行参数 ./main.go:25: 不能使用 r (type *"primary_site/vendor/github.com/gorilla/mux".Router) 作为类型 *"subdomain_site/vendor/github.com/gorilla/mux".Router 在参数到 routers.LoadRoutes

看起来我有两个 Gorilla Mux 实例,来自两个不同的项目,它们相互冲突。我只将包从子域站点导入到主站点,而不是相反。只要我在一个项目中拥有这个确切的代码,它就可以完美地工作,但是当我尝试分离项目时,它会中断。

既然我传入了mux.NewRouter()的实例,为什么会发生冲突?

【问题讨论】:

  • 出于这个原因,您的项目中应该只有一个顶级供应商目录
  • 这是两组独立的代码——主站点是一个项目,子域站点是一个包。
  • 如果它们都被导入到同一个程序中,就构建工具而言,它们不是分开的。
  • 只有子域项目被导入到主网站项目中。两个主文件夹都位于我的 gopath 的 src/ 下,在同一级别。

标签: go


【解决方案1】:

您的项目中有 2 个供应商目录。您需要将它们展平到顶层的单个供应商目录中,以便在包之间共享供应商类型。删除 subdomain_site/vendor 并仅使用主包中的供应商目录。

【讨论】:

  • 这是两个独立的项目。 src/proj1 和 src/proj2。他们不是同一个项目。
  • @dingalingchickenwiing 您说您将子域站点导入主站点,这使它们成为同一程序的一部分。随便叫什么,但是同一个项目中的多个vendor目录会导致这样的类型不匹配错误。
  • 我可能使用了错误的术语,因为我是新手,但我试图解释这两个项目在 $GOPATH/src 下的文件夹级别相同。例如,$GOPATH/src/proj1 和 $GOPATH/src/proj2。如果你说的是真的,那么我曾经构建的每个项目实际上都是同一个项目的一部分,并且任何项目之间永远不会有区别。
  • @dingalingchickenwiing,所以您是说您打算编写的所有代码都将被导入同一个主程序?如果是这样,那么是的,您将只有一个项目。也许可以这样想,不要将供应商目录放在“库”中——只将一个放在创建最终二进制文件的包中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-23
  • 2012-01-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多