我有一个非常简单的 Go 项目设置。在根目录中,我有go.mod文件和main.go一个名为main2. 文件夹里面main2有main2.go文件。
/
|_ go.mod
|_ main.go
|_ main2
|_ main2.go
Run Code Online (Sandbox Code Playgroud)
从根目录我尝试运行 go run 命令
go run main2/main2.go
Run Code Online (Sandbox Code Playgroud)
它会抛出错误:
包命令行参数不是主包
有人可以帮忙吗?
我遇到了go run main.go产生错误的问题:
# command-line-arguments
./main.go:9: undefined: test
Run Code Online (Sandbox Code Playgroud)
但是命令go build && ./goruntest编译并运行程序就好了.
输出是:
嗨来自test()
嗨,来自sameFileTest()
您好,来自pkgtest.Test()
您好,来自pkgtest.Test1()
我有这样的目录设置:
go/src/github.com/username/goruntest/
pkgtest/
pkgtest.go
pkgtest1.go
main.go
test2.go
Run Code Online (Sandbox Code Playgroud)
这是代码.
main.go
package main
import (
"fmt"
"github.com/username/goruntest/pkgtest"
)
func main() {
fmt.Println(test()) // main.go:9
fmt.Println(sameFileTest())
fmt.Println(pkgtest.Test())
fmt.Println(pkgtest.Test1())
}
func sameFileTest() string {
return "Hi from sameFileTest()"
}
Run Code Online (Sandbox Code Playgroud)
gotest1.go
package main
func test() string {
return "Hi from test()"
}
Run Code Online (Sandbox Code Playgroud)
pkgtest/pkgtest.go
package pkgtest
func Test() string {
return "Hi from pkgtest.Test()"
} …Run Code Online (Sandbox Code Playgroud) 有没有办法go build通过库调用从另一个 Go 程序中以编程方式调用 Go 工具(如 ),并获得与命令行调用的文本输出相比更结构化的输出?
我想列出在最终可执行文件(而不是其他依赖项)中编译的模块(及其版本)。
我可以这样做:
$ go build -o a.out
$ go version -m a.out
Run Code Online (Sandbox Code Playgroud)
但是我怎样才能做到这一点go list(它有一个方便的 JSON 输出)?
我试过这个:
$ go list -m -f '{{define "M"}}{{.Path}}@{{.Version}}{{end}}{{if not .Main}}{{if .Replace}}{{template "M" .Replace}}{{else}}{{template "M" .}}{{end}}{{end}}' all
Run Code Online (Sandbox Code Playgroud)
但它列出了许多传递依赖项,这些依赖项仅在测试套件中使用。我不知道如何过滤掉这些依赖项。
这是一个查看问题的示例项目(可在 Go Playground 上找到):
main.go:
$ go build -o a.out
$ go version -m a.out
Run Code Online (Sandbox Code Playgroud)
main_test.go:
$ go list -m -f '{{define "M"}}{{.Path}}@{{.Version}}{{end}}{{if not .Main}}{{if .Replace}}{{template "M" .Replace}}{{else}}{{template "M" .}}{{end}}{{end}}' all
Run Code Online (Sandbox Code Playgroud)
go.mod:
module play.ground
go 1.15
require github.com/google/go-cmp v0.5.2
Run Code Online (Sandbox Code Playgroud)
$ …Run Code Online (Sandbox Code Playgroud) 我使用 go/analysis 创建自己的静态分析工具。我仍然不知道如何从ast.Ident中找到def信息。
这是我的测试数据
package randomcheck
func xxx() {
}
func demo() {
xxx()
}
Run Code Online (Sandbox Code Playgroud)
还有我自己的分析仪
import (
"fmt"
"go/ast"
"golang.org/x/tools/go/analysis"
"golang.org/x/tools/go/analysis/passes/inspect"
)
var name string // -name flag
var Analyzer = &analysis.Analyzer{
Name: "fft",
Requires: []*analysis.Analyzer{inspect.Analyzer},
Run: run,
}
//pass.Fset.Position(name.Pos())
func run(pass *analysis.Pass) (interface{}, error) {
for _, f := range pass.Files {
ast.Inspect(f, func(node ast.Node) bool {
name,ok := node.(*ast.Ident)
if !ok {
return true
}
if name == nil {
return true
}
if pass.TypesInfo.Defs[name] != nil …Run Code Online (Sandbox Code Playgroud) 我正在尝试dep在我的项目中实施。这一切都很好,但是它还添加了一个供应商目录。现在,我需要更新工具以忽略此目录,否则我的供应商软件包将被修改,或者得到警告的误报。我目前正在使用以下工具:
这些工具也用于CI。我确实想继续使用goimports进行自动格式化,但是我愿意开始使用gometalinter。我不是真的在寻找使用grep的解决方案并找到魔术。
如何使这些工具被忽略vendor/?