好的,所以我在 Go 中有几个项目都共享同一组结构来表示我的数据库模式。因此,为了避免代码不同步,我将所有结构移到了它们自己的“模型”项目中。我的文件夹结构是这样的
GOPATH
- src
- project1
- project2
- models
- pkg
- bin
模型定义了一些方法来从数据库中获取记录,但是由于每个项目都需要控制自己的数据库连接池,所以我将数据库连接作为参数传递给模型方法,所以在模型中我有类似
import (
"github.com/jmoiron/sqlx"
_ "github.com/lib/pq"
)
type User struct {
...
}
type UserList []User
func (u *UserList) FetchAll(db *sqlx.DB) {
...
}
在项目代码中,我有类似的东西
import (
"github.com/jmoiron/sqlx"
_ "github.com/lib/pq"
. "models"
)
func UserListAPI(c *gin.Context) {
var users UserList
db := GetDBConnection()
users.FetchAll(db)
c.JSON(200, users)
}
但是现在,当我尝试构建时,出现错误
不能在给用户的参数中使用 db (type *"project1/vendor/github.com/jmoiron/sqlx".DB) 作为类型 *"models/vendor/github.com/jmoiron/sqlx".DB .FetchAll
有没有办法在不彻底改变我的项目结构的情况下解决这个问题?
我正在使用 dep 来管理我的依赖项。
最佳答案
这是一个使用 src 目录的解决方案:
src 目录。您所有的 Go 代码都应该存放在这里。src 目录中,创建一个 vendor 目录。你所有的第三方包都应该放在这里。 GVT 等依赖管理工具会为您将第三方包直接安装到此文件夹。所以你的项目应该是这样的:
- bin
- pkg
- src
- project1
- project2
- models
- vendor
- github.com
...
要在您的代码中导入第三方包(例如从 github.com),您只需直接使用 github 路径,如 import "github.com/foo/bar"。 Go 编译器将使用您的 GOPATH 来确定 github.com/foo/bar 实际上位于 $GOPATH/src/vendor/github.com/foo/bar。
要导入本地包,只需直接使用您的本地路径,如import "models"。 Go 编译器将使用您的 GOPATH 来确定 models 实际上位于 $GOPATH/src/models。
更新
根据我们下面的对话,您有两个选择:
$GOPATH/src/vendor 的 vendor 文件夹中。我会采用方法 2 来保持事物的清洁和独立。
要实现#2,您可以创建如下结构:
- project1
- bin
- pkg
- src
- vendor
- project2
- bin
- pkg
- src
- vendor
要在 project1 上工作,请将 GOPATH 设置为 project1 的根目录。 project2 和您拥有的任何其他项目也是如此。
我上面说的其他所有内容应该仍然适用,因为这些项目仍然各自遵循相同的结构,但现在我们也满足了为每个项目提供唯一的 vendor 目录的要求。
我知道这不是“无缝”的,因为你必须切换你的 GOPATH,但我几乎不认为这有什么大不了的,因为你只会在蓝色的月亮上做一次,而且需要半个第二。此外,Golang 并不是专门为满足此类项目结构要求而设计的,尽管它足够灵活,可以毫不费力地运行它(您所要做的就是切换 GOPATH)。
您甚至可以通过编写别名来为您更改某些项目的 GOPATH 来进一步自动化。例如,要真正快速地切换到 project1,您可以创建一个运行命令 export GOPATH=/path/to/project1 的别名 project1。
更新 2
以下是我如何构建我的个人项目,它实现了你想要实现的一切:
- bin
- pkg
- src
- vendor
- core
- apps
- foo.com
- api.foo.com
- auth.foo.com
如您所见,在 apps 文件夹中我有多个“项目”(尽管实际上这些只是不同的二进制文件/HTTP 服务器)。
您还会看到我有一个 core 目录。这是我所有共享逻辑所在的地方。 apps 文件夹中的每个项目都可以毫无问题地从 core 导入,因为它们都在同一个 GOPATH 命名空间中。
关于go - 跨多个项目构建具有 vendor 依赖关系的 Go 项目,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51617301/
Rails2.3可以选择随时使用RouteSet#add_configuration_file添加更多路由。是否可以在Rails3项目中做同样的事情? 最佳答案 在config/application.rb中:config.paths.config.routes在Rails3.2(也可能是Rails3.1)中,使用:config.paths["config/routes"] 关于ruby-on-rails-Rails3中的多个路由文件,我们在StackOverflow上找到一个类似的问题
我想安装一个带有一些身份验证的私有(private)Rubygem服务器。我希望能够使用公共(public)Ubuntu服务器托管内部gem。我读到了http://docs.rubygems.org/read/chapter/18.但是那个没有身份验证-如我所见。然后我读到了https://github.com/cwninja/geminabox.但是当我使用基本身份验证(他们在他们的Wiki中有)时,它会提示从我的服务器获取源。所以。如何制作带有身份验证的私有(private)Rubygem服务器?这是不可能的吗?谢谢。编辑:Geminabox问题。我尝试“捆绑”以安装新的gem..
我有多个ActiveRecord子类Item的实例数组,我需要根据最早的事件循环打印。在这种情况下,我需要打印付款和维护日期,如下所示:ItemAmaintenancerequiredin5daysItemBpaymentrequiredin6daysItemApaymentrequiredin7daysItemBmaintenancerequiredin8days我目前有两个查询,用于查找maintenance和payment项目(非排他性查询),并输出如下内容:paymentrequiredin...maintenancerequiredin...有什么方法可以改善上述(丑陋的)代
如何在buildr项目中使用Ruby?我在很多不同的项目中使用过Ruby、JRuby、Java和Clojure。我目前正在使用我的标准Ruby开发一个模拟应用程序,我想尝试使用Clojure后端(我确实喜欢功能代码)以及JRubygui和测试套件。我还可以看到在未来的不同项目中使用Scala作为后端。我想我要为我的项目尝试一下buildr(http://buildr.apache.org/),但我注意到buildr似乎没有设置为在项目中使用JRuby代码本身!这看起来有点傻,因为该工具旨在统一通用的JVM语言并且是在ruby中构建的。除了将输出的jar包含在一个独特的、仅限ruby
我需要从一个View访问多个模型。以前,我的links_controller仅用于提供以不同方式排序的链接资源。现在我想包括一个部分(我假设)显示按分数排序的顶级用户(@users=User.all.sort_by(&:score))我知道我可以将此代码插入每个链接操作并从View访问它,但这似乎不是“ruby方式”,我将需要在不久的将来访问更多模型。这可能会变得很脏,是否有针对这种情况的任何技术?注意事项:我认为我的应用程序正朝着单一格式和动态页面内容的方向发展,本质上是一个典型的网络应用程序。我知道before_filter但考虑到我希望应用程序进入的方向,这似乎很麻烦。最终从任何
我有一个具有一些属性的模型:attr1、attr2和attr3。我需要在不执行回调和验证的情况下更新此属性。我找到了update_column方法,但我想同时更新三个属性。我需要这样的东西:update_columns({attr1:val1,attr2:val2,attr3:val3})代替update_column(attr1,val1)update_column(attr2,val2)update_column(attr3,val3) 最佳答案 您可以使用update_columns(attr1:val1,attr2:val2
我在我的Rails项目中使用Pow和powifygem。现在我尝试升级我的ruby版本(从1.9.3到2.0.0,我使用RVM)当我切换ruby版本、安装所有gem依赖项时,我通过运行railss并访问localhost:3000确保该应用程序正常运行以前,我通过使用pow访问http://my_app.dev来浏览我的应用程序。升级后,由于错误Bundler::RubyVersionMismatch:YourRubyversionis1.9.3,butyourGemfilespecified2.0.0,此url不起作用我尝试过的:重新创建pow应用程序重启pow服务器更新战俘
我已经像这样安装了一个新的Rails项目:$railsnewsite它执行并到达:bundleinstall但是当它似乎尝试安装依赖项时我得到了这个错误Gem::Ext::BuildError:ERROR:Failedtobuildgemnativeextension./System/Library/Frameworks/Ruby.framework/Versions/2.0/usr/bin/rubyextconf.rbcheckingforlibkern/OSAtomic.h...yescreatingMakefilemake"DESTDIR="cleanmake"DESTDIR="
我正在尝试修改当前依赖于定义为activeresource的gem:s.add_dependency"activeresource","~>3.0"为了让gem与Rails4一起工作,我需要扩展依赖关系以与activeresource的版本3或4一起工作。我不想简单地添加以下内容,因为它可能会在以后引起问题:s.add_dependency"activeresource",">=3.0"有没有办法指定可接受版本的列表?~>3.0还是~>4.0? 最佳答案 根据thedocumentation,如果你想要3到4之间的所有版本,你可以这
我收到这个错误:RuntimeError(自动加载常量Apps时检测到循环依赖当我使用多线程时。下面是我的代码。为什么会这样?我尝试多线程的原因是因为我正在编写一个HTML抓取应用程序。对Nokogiri::HTML(open())的调用是一个同步阻塞调用,需要1秒才能返回,我有100,000多个页面要访问,所以我试图运行多个线程来解决这个问题。有更好的方法吗?classToolsController0)app.website=array.join(',')putsapp.websiteelseapp.website="NONE"endapp.saveapps=Apps.order("