go语言,第三方包相对路径导入包引起的问题及解决方案(goquery)

对go语言而言,跟踪init很显然包有且仅有一次被导入的可能。

但是重复引用了goquery包,后编译出现问题

项目涉及相关目录

├── main.go
└── parse
    └── parse.go

parse包和main.go都导入了 goquery包

main.go 通过 import("./parse")导入parse包

go run 和 go build 都提示错误

# command-line-arguments
/usr/lib/golang/pkg/tool/linux_amd64/link: cannot open file /usr/lib/golang/pkg/linux_amd64/github.com/PuerkitoBio/goquery.a: open /usr/lib/golang/pkg/linux_amd64/github.com/PuerkitoBio/goquery.a: no such file or directory

main.go 在不导入 parse时并无错误,说明肯定是parse的锅

查看了gopath pkg 里明明有.a文件 但是为什么寻找到去goroot下寻找.a文件

最后先是找到了解决方案 把parse导入方式切换到绝对路径(这里的绝对路径是相对于gopath或者goroot而言,即包的真实路径去掉gopath/src或者goroot/src)导入即可,后发现编译情况下link参数是空目录

go run -n  main.go 命令仅打印其执行过程中用到的所有命令,而不去真正执行它们。用这个命令跟踪编译过程是十分合适的。

运行结果如下

 1 cd /home/fdf/golang/src/distributed_spider/parse
 2 /usr/lib/golang/pkg/tool/linux_amd64/compile -o $WORK/_/home/fdf/golang/src/distributed_spider/parse.a -trimpath $WORK -goversion go1.9.4 -p _/home/fdf/golang/src/distributed_spider/parse -complete -buildid 310d9ff51b345d53a619be2244f0ac16bed09600 -D _/home/fdf/golang/src/distributed_spider/parse -I $WORK -I /home/fdf/golang/pkg/linux_amd64 -pack ./parse.go
 3
 4 #
 5 # command-line-arguments
 6 #
 7
 8 mkdir -p $WORK/command-line-arguments/_obj/
 9 mkdir -p $WORK/command-line-arguments/_obj/exe/
10 cd /home/fdf/golang/src/distributed_spider
11 /usr/lib/golang/pkg/tool/linux_amd64/compile -o $WORK/command-line-arguments.a -trimpath $WORK -goversion go1.9.4 -p main -complete -buildid 69bf6dce457753ca5df015e4ac3556bd5ca464b1 -dwarf=false -D _/home/fdf/golang/src/distributed_spider -I $WORK -I /home/fdf/golang/pkg/linux_amd64 -pack ./main.go
12 cd .
13 /usr/lib/golang/pkg/tool/linux_amd64/link -o $WORK/command-line-arguments/_obj/exe/main -L $WORK -L "" -s -w -extld=gcc -buildmode=exe -buildid=69bf6dce457753ca5df015e4ac3556bd5ca464b1 $WORK/command-line-arguments.a
14 $WORK/command-line-arguments/_obj/exe/main

相对路径导入情况

 1 #
 2 # distributed_spider/parse
 3 #
 4
 5 mkdir -p $WORK/distributed_spider/parse/_obj/
 6 mkdir -p $WORK/distributed_spider/
 7 cd /home/fdf/golang/src/distributed_spider/parse
 8 /usr/lib/golang/pkg/tool/linux_amd64/compile -o $WORK/distributed_spider/parse.a -trimpath $WORK -goversion go1.9.4 -p distributed_spider/parse -complete -buildid 310d9ff51b345d53a619be2244f0ac16bed09600 -D _/home/fdf/golang/src/distributed_spider/parse -I $WORK -I /home/fdf/golang/pkg/linux_amd64 -pack ./parse.go
 9
10 #
11 # command-line-arguments
12 #
13
14 mkdir -p $WORK/command-line-arguments/_obj/
15 mkdir -p $WORK/command-line-arguments/_obj/exe/
16 cd /home/fdf/golang/src/distributed_spider
17 /usr/lib/golang/pkg/tool/linux_amd64/compile -o $WORK/command-line-arguments.a -trimpath $WORK -goversion go1.9.4 -p main -complete -buildid fbcca07f20e1f56c4f1a586a3c879bde6e112ba5 -dwarf=false -D _/home/fdf/golang/src/distributed_spider -I $WORK -I /home/fdf/golang/pkg/linux_amd64 -pack ./main.go
18 cd .
19 /usr/lib/golang/pkg/tool/linux_amd64/link -o $WORK/command-line-arguments/_obj/exe/main -L $WORK -L /home/fdf/golang/pkg/linux_amd64 -s -w -extld=gcc -buildmode=exe -buildid=fbcca07f20e1f56c4f1a586a3c879bde6e112ba5 $WORK/command-line-arguments.a
20 $WORK/command-line-arguments/_obj/exe/main

绝对路径导入情况

跟踪发现 有差异的情况的确是 在相对路径下 -L的参数缺失了 goopath(相对..情况13行和绝对..情况19行)

导致 link去goroot下寻找

至于为什么会出现这种情况  还没弄明白,感觉真的像编译这边的bug。。。 明明前面编译的过程中都是能寻找到并输入.a文件的

但是导入包的时候尽量写绝对路径。

原文地址:https://www.cnblogs.com/Geek-xiyang/p/10232364.html

时间: 2024-10-09 02:09:05

go语言,第三方包相对路径导入包引起的问题及解决方案(goquery)的相关文章

Golang- import 导入包的语法

一 包的导入语法 在写Go代码的时候经常用到import这个命令用来导入包文件,看到的方式参考如下: import( "fmt" ) 然后在代码里面可以通过如下的方式调用 fmt.Println("hello world") 上面这个fmt是Go语言的标准库,他其实是去GOROOT下去加载该模块,当然Go的import还支持如下两种方式来加载自己写的模块: 相对路径     import   "./model"                 /

[转]Golang- import 导入包的语法

http://blog.csdn.net/zhangzhebjut/article/details/25564457 一 包的导入语法 在写Go代码的时候经常用到import这个命令用来导入包文件,看到的方式参考如下: import(          "fmt"      ) 然后在代码里面可以通过如下的方式调用 fmt.Println("hello world") 上面这个fmt是Go语言的标准库,他其实是去GOROOT下去加载该模块,当然Go的import还支

Golang- import 导入包的语法(转)

Golang- import 导入包的语法 一 包的导入语法 在写Go代码的时候经常用到import这个命令用来导入包文件,看到的方式参考如下: import(         "fmt"     ) 然后在代码里面可以通过如下的方式调用 fmt.Println("hello world") 上面这个fmt是Go语言的标准库,他其实是去GOROOT下去加载该模块,当然Go的import还支持如下两种方式来加载自己写的模块: 相对路径     import   &qu

golang导入包的几个说明:import

导入包: 标准包使用的是给定的短路径,如"fmt"."net/http" 自己的包,需要在工作目录(GOPATH)下指定一个目录,improt 导入包,实际上就是基于工作目录的文件夹目录 导入包的多种方式: 直接根据$GOPATH/src目录导入import "test/lib"(路径其实是$GOPATH/src/test/lib) 别名导入:import alias_name "test/lib" ,这样使用的时候,可以直接

Java语言中几个常用的包

Java采用包结构来组织和管理类和接口文件.本文介绍Java语言类库中几个常用的包,因为这几个包在软件开发与应用中经常需要用到,其中有些包是必要的.若是离开它,还真不能做事情了. 第一个包:java.lang包.     该包提供了Java语言进行程序设计的基础类,它是默认导入的包.该包里面的Runnable接口和Object.Math.String.StringBuffer.System.Thread以及Throwable类需要重点掌握,因为它们应用很广.   第二个包:java.util包.

导入包

包:用来从逻辑上组织模块的,本质就是一个目录(必须带一个_init_.py文件)2.导入方式:import module_nameimport module1_name,import module2_name(几个模块)form module_alex import *(模块所有的代码)不提倡用form module_alex import logger as logger_alex (执行自己代码和模块的代码) logger_alex (模块代码的别名) 3.import本质(路径搜索和搜索路

1. 导入包的问题

1.import导入包的路径 In [4]: import sys In [5]: sys.path Out[5]: ['', '/usr/bin', '/usr/lib/python35.zip', '/usr/lib/python3.5', '/usr/lib/python3.5/plat-x86_64-linux-gnu', '/usr/lib/python3.5/lib-dynload', '/usr/local/lib/python3.5/dist-packages', '/usr/l

AS中jar包和aar包区别及导入导出

发布时间:2018-01-18 来源:网络 上传者:用户 关键字: 导出 导入 区别 包和 aar jar 发表文章 摘要:jar包和aar包区别*.jar:只包含class文件与清单文件,不包含资源文件,如图片等所有res中的文件.*.aar:包含所有资源,class以及res资源文件全部包含如果你只是一个简单的类库那么使用生成的*.jar文件即可;如果你的是一个UI库,包含一些自己写的控件布局文件以及字体等资源文件那么就只能使用*.aar文件.jar包和aar包导出1.新建库步骤:File-

解决python在cmd运行时导入包失败,出现错误信息 "ModuleNotFoundError: No module named ***"

1.下图为我的自动化测试工程结构图 我通过运行run.bat批处理文件,调用cmd控制台运行start_run.py来开始我的自动化测试,但是出现如下错误: 大家可能知道我们的工程在IDE(Pycharm)中运行和我们在cmd中运行的路径是不一样的,在pycharm中运行时, 会默认pycharm的目录+我们的工程所在目录为运行目录,而在cmd中运行时,会以我们的工程目录所在目录来运行 而在import包时,会首先从pythonPATH的环境变量中来查看包,如果没有你的PYTHONPATH中所包