我希望能够在//line
指令中指定相对路径,但不清楚是否允许这样做。实验表明,它们似乎不允许这样做。#3335和#24183在试图指定指令中允许的内容方面都有关,但我没有看到这个具体问题被提到。
(对于runtime.Caller
的信息,它似乎期望文件名是绝对路径。)
你做了什么?
$ mkdir foo
$ cat > foo/foo.go
package main
func main() {
asdf
}
$ cat > foo/bar.go
package main
//line baz.go:1234
func quux() {
asdf
}
$ go build ./foo
你期望看到什么?
# foo
foo/baz.go:1235:5: undefined: asdf
foo/foo.go:4:5: undefined: asdf
你看到了什么?
# foo
baz.go:1235: undefined: asdf
foo/foo.go:4:5: undefined: asdf
系统详细信息
go version go1.10.3 linux/amd64
GOARCH="amd64"
GOBIN=""
GOCACHE="/home/light/.cache/go-build"
GOEXE=""
GOHOSTARCH="amd64"
GOHOSTOS="linux"
GOOS="linux"
GOPATH="/home/light"
GORACE=""
GOROOT="[redacted]"
GOTMPDIR=""
GOTOOLDIR="[redacted]"
GCCGO="gccgo"
CC="clang"
CXX="[redacted]"
CGO_ENABLED="1"
CGO_CFLAGS="-g -O2"
CGO_CPPFLAGS=""
CGO_CXXFLAGS="-g -O2"
CGO_FFLAGS="-g -O2"
CGO_LDFLAGS="-g -O2"
PKG_CONFIG="pkg-config"
GOGCCFLAGS="-fPIC -m64 -pthread -fno-caret-diagnostics -Qunused-arguments -fmessage-length=0 -fdebug-prefix-map=/tmp/go-build576788924=/tmp/go-build -gno-record-gcc-switches"
GOROOT/bin/go version: go version go1.10.3 linux/amd64
GOROOT/bin/go tool compile -V: compile version go1.10.3
uname -sr: [redacted]
/lib/x86_64-linux-gnu/libc.so.6: [redacted]
gdb --version: [redcated]
7条答案
按热度按时间ckocjqey1#
你在//line指令中所说的就是你得到的。如果你想要foo/bar.go,你需要说foo/bar.go。
2jcobegt2#
对我来说,这种行为似乎有点不幸。这里没有显示,但
runtime.Caller
似乎期望//line
有一个绝对路径,这意味着整个绝对路径将显示在错误消息中。此外,这意味着代码生成器输出可能在检出之间有所不同:如果生成的代码被检入,这是不理想的。mklgxw1f3#
对不起,我猜我不明白你的意思。
runtime.Caller
应该报告//line
指令中的内容;这对你来说没有发生吗?而且我不理解代码生成器输出会改变。代码生成器应该生成它想要的//line
指令。好的,也许我明白你的意思了。你是说
runtime.Caller
返回的默认文件路径是绝对路径。因此,查看runtime.Caller
输出(或者等效地,堆栈回溯)的工具期望绝对路径。如果一个//line
指令有相对路径,不清楚从哪个根目录开始追踪。所以你请求某种方法,让代码生成器能够通过相对路径生成一个
//line
指令,该指令引用源代码树中的某个文件,然后某个工具将这个相对路径转换为绝对路径。1l5u6lss4#
你的理解是正确的。抱歉我的表述过于简洁。稍作重述,我的观察是:
在没有
//line
指令的情况下:go build
将显示相对于go build
运行的工作目录的文件路径。runtime.Caller
将返回文件的绝对路径,除非使用了类似-trimpath
的标志。//line
指令时,我观察到:go build
将打印与//line
指令中完全相同的文件名。runtime.Caller
将返回与//line
指令中完全相同的文件名(我还没有尝试将这与-trimprefix
结合使用)。//line
指令中,使其与默认情况下的行为相匹配,因为默认行为会打印两个不同的字符串。如果你愿意的话,我可以为更改
//line
行为打开一个单独的功能请求。但首先,似乎该行为未指定,所以我想了解是否遗漏了什么或依赖了某种行为。2w3rbyxf5#
我认为当前的行为已经指定。文档中说:“行指令指定紧跟在注解后面的字符的源位置来自指定的文件、行和列。”我认为您正在寻求一种方法,以便编译器将其更改为绝对路径,而不仅仅是使用“指定的文件”。
n3ipq98p6#
我正在请求这个,但是即使在绝对路径的情况下,
go build
也会报告指令中指定的完整绝对路径,而不是相对于go build
调用的目录。go build
对其处理方式不同。wpx232ag7#
FWIW,golang.org/cl/100235似乎与此歧义有关。