go 文档:行指令中相对文件名的状态不明确

vmdwslir  于 6个月前  发布在  Go
关注(0)|答案(7)|浏览(44)

我希望能够在//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]
ckocjqey

ckocjqey1#

你在//line指令中所说的就是你得到的。如果你想要foo/bar.go,你需要说foo/bar.go。

2jcobegt

2jcobegt2#

对我来说,这种行为似乎有点不幸。这里没有显示,但 runtime.Caller 似乎期望 //line 有一个绝对路径,这意味着整个绝对路径将显示在错误消息中。此外,这意味着代码生成器输出可能在检出之间有所不同:如果生成的代码被检入,这是不理想的。

mklgxw1f

mklgxw1f3#

对不起,我猜我不明白你的意思。runtime.Caller 应该报告 //line 指令中的内容;这对你来说没有发生吗?而且我不理解代码生成器输出会改变。代码生成器应该生成它想要的 //line 指令。
好的,也许我明白你的意思了。你是说 runtime.Caller 返回的默认文件路径是绝对路径。因此,查看 runtime.Caller 输出(或者等效地,堆栈回溯)的工具期望绝对路径。如果一个 //line 指令有相对路径,不清楚从哪个根目录开始追踪。
所以你请求某种方法,让代码生成器能够通过相对路径生成一个 //line 指令,该指令引用源代码树中的某个文件,然后某个工具将这个相对路径转换为绝对路径。

1l5u6lss

1l5u6lss4#

你的理解是正确的。抱歉我的表述过于简洁。稍作重述,我的观察是:

  • 在没有 //line 指令的情况下:

    • go build 将显示相对于 go build 运行的工作目录的文件路径。
    • runtime.Caller 将返回文件的绝对路径,除非使用了类似 -trimpath 的标志。
    • 当有 //line 指令时,我观察到:
      • go build 将打印与 //line 指令中完全相同的文件名。
      • runtime.Caller 将返回与 //line 指令中完全相同的文件名(我还没有尝试将这与 -trimprefix 结合使用)。
    • 我看不到一种方法可以将文件名放入 //line 指令中,使其与默认情况下的行为相匹配,因为默认行为会打印两个不同的字符串。
      如果你愿意的话,我可以为更改 //line 行为打开一个单独的功能请求。但首先,似乎该行为未指定,所以我想了解是否遗漏了什么或依赖了某种行为。
2w3rbyxf

2w3rbyxf5#

我认为当前的行为已经指定。文档中说:“行指令指定紧跟在注解后面的字符的源位置来自指定的文件、行和列。”我认为您正在寻求一种方法,以便编译器将其更改为绝对路径,而不仅仅是使用“指定的文件”。

n3ipq98p

n3ipq98p6#

我正在请求这个,但是即使在绝对路径的情况下,go build 也会报告指令中指定的完整绝对路径,而不是相对于 go build 调用的目录。go build 对其处理方式不同。

相关问题