【问题标题】:Organizing a multiple-file Go project with private support files使用私有支持文件组织多文件 Go 项目
【发布时间】:2014-02-12 16:26:56
【问题描述】:

按照answer,我创建了以下项目结构:

.
├── bin
├── pkg
└── src
    └── github.com
        └── GITHUB_USERNAME
            └── PROJECTNAME
                ├── lib
                │   └── model.go
                │   └── ... .go
                ├── LICENSE
                ├── README.md
                └── PROJECTNAME.go
  • PROJECTNAME.go 有包main
  • model.go有包PROJECTNAME

PROJECTNAME.go我正在导入以下内容:

import(
    'github.com/GITHUB_USERNAME/PROJECTNAME/lib/model'
) 

但是当我运行go build 时,我得到以下错误:

 cannot find package "github.com/GITHUB_USERNAME/PROJECTNAME/lib/model" in any of:
    /usr/lib/go/src/pkg/github.com/GITHUB_USERNAME/PROJECTNAME/lib/model (from $GOROOT)
    /home/USERNAME/go/src/github.com/GITHUB_USERNAME/PROJECTNAME/lib/model (from $GOPATH)

如何正确导入包名?还有其他策略吗?

【问题讨论】:

    标签: go


    【解决方案1】:

    包导入路径由目录名定义,而不是文件名。

    正确的导入路径是"github.com/GITHUB_USERNAME/PROJECTNAME/lib",并且该文件夹中的所有go文件必须在顶部有相同的package子句。

    package 子句后面的标识符是什么标识符将被导入到导入它的包中。所以如果是package foo,可以在导入代码中通过foo.Bar访问Bar标识符。

    按照惯例,作者通常使用导入路径的最后一部分作为 package 名称,因此在这种情况下,您应该在 lib 文件夹下的所有 Go 文件的顶部添加 package lib

    【讨论】:

    • 嗨。当您说导入路径完全基于文件夹时,我不确定措辞是否正确。来自文档“Go 的约定是包名是导入路径的最后一个元素”。所以包含的文件夹不一定要匹配包名。
    • 导入路径完全由文件夹定义。这与该文件夹的 go 文件 inside 定义的 package 没有任何关系。正如您所注意到的,导入路径与包名称完全无关。你能更具体地指出我所说的导致混乱的原因吗?
    • 我想我更了解您的主张,但请考虑一下包裹 github.com/golang/glog。文件glog.go 将作为$GOPATH/src/github.com/golang/glog/glog.go 存在并声明package glog。即使 glog 是包,您也可以使用 import "github.com/golang/glog" 而不是 import "github.com/golang/glog/glog" 导入它。如果glog.go 声明了package foo,您仍然可以以相同的方式导入它,但导入的标识符将是foo 而不是glog。这样是不是更清楚了?
    • 是的。我认为这只是措辞。
    【解决方案2】:

    这里有两件事:

    1. 您在导入期间错过了“项目”。使用github.com/GITHUB_USERNAME/PROJECTNAME/lib/model
    2. 次要:将包命名为 github.com/GITHUB_USERNAME/PROJECTNAME/lib/model "PROJECTNAME" 似乎很奇怪。 lib 还是模型呢?

    【讨论】:

    • 感谢您的帮助! 1.对不起,那是我的错。我尝试了很多组合并复制了错误的输出;)我已将其替换为当前输出 2。model 应该是私有文件,不会在其他项目中使用。
    • Go 中没有“私有包”的概念。您所能做的就是在其他地方“不使用”它,但这不能强制执行。
    • 我的意思是引用:if they are not intended to be imported by another project
    【解决方案3】:

    您的主包中的导入语句应为

    import(
        "github.com/GITHUB_USERNAME/PROJECTNAME/lib/PROJECTNAME"
    ) 
    

    您说您的 model.go 使用 PROJECTNAME 作为包。因此,您实际上并未在导入路径中命名文件。最后一个组件应该是包名。这意味着您可以在 lib 目录中拥有许多以 PROJECTNAME 作为包的 go 文件。

    【讨论】:

      猜你喜欢
      • 2012-04-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-12-03
      • 2018-01-30
      • 1970-01-01
      相关资源
      最近更新 更多