注意:这个问题涉及到这一块,但两年是围棋历史很长一段时间.
在开发过程中组织Go项目的标准方法是什么?
我的项目是一个单独的包mypack,所以我想我把所有.go文件放在一个mypack目录中.
但是,我想在开发过程中测试它,所以我至少需要一个声明main包的文件,这样我才能做到go run trypack.go
我该如何组织这个?go install mypack每次我想尝试时都需要做吗?
我已经习惯GOPATH但是对于这个当前的问题,我面临的并没有帮助.我希望能够创建特定于项目的包:
myproject/
??? binary1.go
??? binary2.go
??? package1.go
??? package2.go
Run Code Online (Sandbox Code Playgroud)
我试过多种方法,但我如何才能package1.go在工作binary1.go或binary2.go等等?
例如; 我希望能够import "package1",然后能够运行go build binary1.go,一切正常,没有错误被抛出,无法找到包GOROOT或GOPATH.我需要这种功能的原因是大型项目; 我不想引用多个其他包或将它们保存在一个大文件中.
我很难将本地go文件导入另一个go文件.
我的项目结构如下所示
-samplego
--pkg
--src
---github.com
----xxxx
-----a.go
-----b.go
--bin
Run Code Online (Sandbox Code Playgroud)
我想在b.go里面输入a.go. 我试过以下,
import "a"
import "github.com/xxxx/a"
Run Code Online (Sandbox Code Playgroud)
这些都没有奏效.我明白我必须干涉GOPATH,但我无法做到.目前我的GOPATH指向samplego(/ workspace/samplego).我得到以下错误
cannot find package "a" in any of:
/usr/local/go/src/pkg/a (from $GOROOT)
/workspace/samplego/src/a (from $GOPATH)
Run Code Online (Sandbox Code Playgroud)
另外,当这些源文件导入另一个项目/模块时,GOPATH如何工作?那么当地的进口是一个问题吗?在这种情况下,最佳做法是什么 - 它是否只在模块中有一个go文件(带有相关的测试)?
我正在尝试Go的新模块系统,并且无法访问本地软件包.以下项目位于我的gopath外部桌面上的文件夹中.
我的项目结构如下:
/
- /platform
- platform.go
- main.go
- go.mod
Run Code Online (Sandbox Code Playgroud)
// platform.go
package platform
import "fmt"
func Print() {
fmt.Println("Hi")
}
Run Code Online (Sandbox Code Playgroud)
// main.go
package main
import "platform"
func main() {
platform.Print()
}
Run Code Online (Sandbox Code Playgroud)
go build main.go 告诉我
cannot find module for path platform
Run Code Online (Sandbox Code Playgroud) 不是来自C /编译语言背景,我发现很难掌握使用Go的包机制来创建模块化代码.
在Python中,要导入模块并访问它的函数等等,这是一个简单的例子
import foo
Run Code Online (Sandbox Code Playgroud)
其中foo.py是要在同一目录中导入的模块的名称.否则,您可以__init__.py在子文件夹中添加一个空格并通过它访问模块
from subfolder import foo
Run Code Online (Sandbox Code Playgroud)
然后,您可以通过模块名称简单地引用它们来访问函数,例如y = foo.bar(y).这使得将逻辑代码片段彼此分离变得容易.
但是,在Go中,您可以在源文件本身中指定包名称,例如
package foo
Run Code Online (Sandbox Code Playgroud)
在'foo'模块的顶部,然后您可以通过该模块导入
import (
"foo"
)
Run Code Online (Sandbox Code Playgroud)
然后通过它来引用它,即y := foo.Bar(x).但是我无法理解的是这在实践中是如何运作的.golang.org上的相关文档似乎很简洁,并且针对使用makefile和编译器的更多(任何)经验的人.
有人可以清楚地解释你是如何在Go中模块化你的代码,正确的项目结构,以及编译过程如何工作?
我在文件系统上(不在中$GOPATH)有一个go包,名为bitbucket.org/me/awesome。
~/awesome> tree
.
??? main.go
??? go.mod
??? go.sum
??? subpackageA
? ??? main.go
Run Code Online (Sandbox Code Playgroud)
我的go.mod样子是:
module bitbucket.org/me/awesome
require (
... # lots of external dependencies
)
replace bitbucket.org/me/awesome => ./
Run Code Online (Sandbox Code Playgroud)
在main.go顶层目录中,我调用一个子包,如下所示:
import "bitbucket.org/me/awesome/subpackageA"
Run Code Online (Sandbox Code Playgroud)
这一切似乎都很正常。go get作品。但是,当我将整个存储库克隆到其他位置(例如在Docker映像中)并go get首次运行时,出现如下错误:
package bitbucket.org/me/awesome/subpackageA: https://api.bitbucket.org/2.0/repositories/me/awesome?fields=scm: 403 Forbidden,
这意味着它没有使用软件包的本地文件系统版本,即使我通过文件中的replace指令告诉了它go.mod。
我究竟做错了什么?如何确保从文件系统使用子包,而不是尝试从Internet提取子包?
在多模块存储库中,模块名称(通过 go.modmodule指令设置)是否应该遵循包命名约定?
例如 module github.com/org-name/repo-name/path/to/module-dir
我明白,无论模块的名称如何,模块中的包都使用模块名称作为前缀相互引用。但是,从模块外部来看,如果模块名称设置为<host><path-within-repo>模式以外的其他内容,则似乎存在问题。get-ing 包含在模块中的包然后给出关于unrecognized import path.
是否有任何原因以不同的方式命名模块<host><path-within-repo>?
我有一个具有多种主要方法的项目。当运行go build program1/main1.go具有与 不同的依赖项集时program2/main2.go,我的第一个go build似乎更改了我的go.mod文件并删除了它认为不需要的依赖项。然而main2会需要这些依赖。
我试过使用,go build ...但这也创建了一组不同的依赖项。具体来说,似乎所有//indirect依赖项都被删除并导致 program2 失败。
有没有办法运行go build或go run不更新go.mod文件?使用go build -mod=readonly program1/main1.go它告诉我它失败了,因为需要更新依赖项..
我一直在使用Go模块,但我想知道以下目录结构的最佳实践是什么:
project
??? go.mod
??? main.go
??? players
??? go.mod
??? players.go
??? players_test.go
Run Code Online (Sandbox Code Playgroud)
起初我在将players软件包导入到根项目时遇到问题,但是我注意到我可以在根go.mod文件中执行此操作
module github.com/<name>/<project>
require (
github.com/<name>/players v0.0.0
)
replace github.com/<name>/players => ./players
Run Code Online (Sandbox Code Playgroud)
然后,这允许我import "github.com/<name>/players"在main.go文件中执行操作。
现在,此方法可行并从此处采用,但是我不确定这是否是正确的方法,或者该方法是否仅用于在版本控制之外临时更新本地包。
另一个选择,似乎有点过大,是使每个模块都有自己的存储库?
TL; DR; -在同一存储库中包含多个模块并将其导入其他模块/根main.go文件中的最佳实践方法是什么?
我有一个名为“tatata”的 Go 模块。它仅在我的机器上开发,因此它不包含模块名称中任何 URL 的任何路径。
如果main我的模块中只有一个包,它可以正常工作。但是,如果我在模块中创建两个包,就会遇到一些问题。
这是树:
./|
|- go.mod
|-src
|- main
| | - main.go
|
|- api
| - api.go
Run Code Online (Sandbox Code Playgroud)
文件内容:
go.mod
module tatata
go 1.13
Run Code Online (Sandbox Code Playgroud)
main.go
package main
import "fmt"
import "tatata/api"
func main() {
fmt.Println("Hello world")
api.Test1()
}
Run Code Online (Sandbox Code Playgroud)
api.go
package api
import "fmt"
func Test1() {
fmt.Println("Testing API")
}
Run Code Online (Sandbox Code Playgroud)
当我尝试构建时,我发出go build ./src/main并收到以下错误:
build tatata/src/main: cannot load tatata/api: malformed module path "tatata/api": missing dot in first path element
现在,如果我尝试放置一个虚拟点,例如将模块重命名为tatata.com我会收到错误,build …