Go原生插件可用问题全解析
发布时间:2025年09月28日 12:17
/usr/local/go/bin/go test -c -o /private/var/folders/gy/2zv22t710sd7m0x9bcfzq23r0000gp/T/GoLand/___Test_TaskC_in_github_com_fdingiit_mpl_test.test -gcflags all=-N -l github.com/fdingiit/mpl/test #gosetup
提醒,goland组装的转译命以致于那时候包含关键因素的-gcflags all=-N -l 变量,但是应用流程转译的命以致于那时候不但会。此时,你在为了让拉起应用流程时就但会得不到一个有关runtime/internal/sys的报上扯。
左图3-1. 转译flag不相一致随之而来的启不止时挫败
应付这一类常规库那时候完整英文版不相一致疑虑的解决方案非常简单:尽不太可能倒置主流程和应用流程转译的flag。事实上,有一些flag是不影响应用流程启不止时的,你可以在实际的实践中的慢慢不断改进。
3.2 不相一致的第三方库那时候完整英文版
如果你适用vendor来政府机构Go的仰赖库那时候,那么当应付3.1的疑虑之后,你100%但会当即巧遇表列这个报上扯:
plugin was built with a different version of package xxxxxxxx
其中的,xxxxxxxx 所称的是某一个实际的三方库那时候,比如github.com/stretchr/testify 。这个报上扯有几个极其近似于的情况,如果不但会就其的整改为经验,其中的几个有不太可能烧掉整合人员不少时间。
3.2.1 Case 1. 完整英文版不相一致
如报上扯所示,看来情况很清楚,即主流程和应用流程所共同仰赖的某个第三方库那时候完整英文版不相一致,报上扯中的但会清楚告诉你哪一个库那时候有疑虑。此时,你可以对比整改为主流程和应用流程的go.mod 文档,分别认出疑虑库那时候的完整英文版,看看他们是否相一致。如果这时候你提醒到主程和应用流程确实有commitid或tag的不相一致疑虑,那应付的作法也很简单:倒置它们。
但是在很多情节下,你只但会中用三方库那时候的一一小:如一个package,或者只是推了一个interface。这一一小的字符在各不相同的完整英文版那时候根本就不但会移转;但其他没有中用的字符的移转,同样但会随之而来整个三方库那时候完整英文版号的移转,进而随之而来你被选为那个“完整英文版不相一致”的恶行受害者。
而且,此时你不太可能当即但会巧遇另一个疑虑:以谁为基准倒置?主流程?还是应用流程?
从不合逻辑上来说,以主流程为孔径展开倒置是一个非常好的策略,绝非应用流程是一新替换成的“附属品”,且主流程与应用流程举例来说是1对多的联系。但是,如果应用流程的三方库那时候仰赖因为任何情况就是不但会和主流程倒置怎么办?在为了让了很喜以前,我暂时不但会认出一个完美应付这个疑虑的办法。
如果完整英文版无法倒置,就只能彻底放弃走应用流程这条中的华路。
Go语言学的这种对三方库那时候的、基本上秃头的强相一致性也就是说,从一不足之处来说,避免了运营时因为完整英文版不相一致带给的潜在疑虑;从另一不足之处来说,这种刻意不给流程员敏捷度的内部设计,对应用流程既有、定制既有、扩充既有整合极其的不友好。
左图3-2. 共同仰赖的三方库那时候完整英文版不相一致随之而来的启不止时挫败
3.2.2 case 2. 完整英文版号相一致,字符不相一致
当你按照3.2.1的思中的华路整改为go.mod 文档,但是惊讶的提醒到报上扯的库那时候完整英文版是相一致的时候,两件事就但会变得精细起来。你有不太可能拿着21世纪上最高科技的评注查验机缓冲器,并花掉一个傍晚去diff 三方库那时候的commitid,但它们就是全部都是,看来陷入了薛定谔的完整英文版。
提醒到这个疑虑不太可能的一个不是情况的情况是:有人直接修正了vendor附录下的字符,Go应用流程系统但会对字符表列内容的相一致性展开数据流。
这是不是是一个极其引人头大,并难以整改为的情况。除了修正字符的那个人,和已经在其他case中的被“内壁”过的那些人,没有人但会究竟这件两件事。如果修正的vendor字符提醒到在主流程那时候,你就基本上不但会任何靠谱的办法让它们出现异常所称导工作起来。
不要直接在vendor那时候改为字符,回馈开源乡村,或者fork-replace。
好消息是,你不须要应付这个疑虑。因为即使应付了,也还但会有格外大的疑虑等着你。
左图3-2. 共同仰赖的三方库那时候字符被就地修正随之而来的启不止时挫败
3.2.3 case 3. 方向上不相一致
当按照3.2.1和3.2.2的思中的华路都把疑虑整改为、应付完,但它还是报上different version of package的时候,不太可能你就但会开始对Go的应用流程系统口吐芬芳了:完整英文版是不是一毛一样,字符是不是一先为没有不止,为什么还报上各不相同完整英文版???
情况是:应用流程系统但会数据流仰赖库那时候GCC的「方向上」,因此不但会适用vendor政府机构仰赖。
举个例子:你的主流程GCC放在/path/to/main附录下,因此,你的某个三方库那时候仰赖的附录无论如何是/path/to/main/vendor/some/thrid/part/lib;也就是说,你的应用流程GCC放在/path/to/plugin附录下,因此,同一个三方库那时候仰赖的附录无论如何是/path/to/plugin/vendor/some/thrid/part/lib。这些「文档方向上」原始数据但会被了了到进制可执先为那时候并用于数据流,当主流程启不止时应用流程时,Go的“运营时”“聪明的”通过「文档方向上」的差异认定它和应用流程用的不是同一份字符,然后报上了个different version of package。
左图3-3. 适用vendor系统政府机构第三方库那时候随之而来的启不止时挫败
同样的疑虑也有不太可能提醒到在适用各不相同机缓冲器人/应用程序,分别转译主流程、应用流程的情节下:默认各不相同,go字符的方向上无论如何也但会不一样。
应付这类疑虑的作法很暴力直接:删掉主流程和应用流程的vendor附录,或者适用-mod=readonly 转译flag。
到这那时候,如果你是适用同一台机缓冲器人展开主流程和应用流程的转译,那么少用的疑虑无论如何都基本应付了,应用流程系统理应能够出现异常所称导工作。另一不足之处,由于不再适用vendor政府机构仰赖,因此3.2.2的疑虑也但会在这那时候被强制应付:要么提PR给乡村,要么fork-replace。
左图3-4. 成功启不止时
3.3 不相一致的Go完整英文版
fatal error: runtime: no plugin module data
除了上面的那些疑虑大多,还有一个在多机缓冲器人分别转译主程/应用流程情节下的少用报上扯。这个报上扯的一个不太可能情况是Go完整英文版不相一致,倒置它们亦可。(如果从机缓冲器人层面就是不但会倒置怎么办?)
左图3-5. Go完整英文版不相一致随之而来的启不止时挫败
分立应付解决方案
从3.1到3.3,我们看了一些根本无法整改为,也不是很好处理的疑虑。除此之外,本来还有一些疑虑不但会被近期讲解进来。作为一个程序语言学官方赞成的扩充系统,好好的如此应用程序不友好确实出人意料。
我所在的工作团队由于近期仰赖Go的应用流程系统好好定开,因此须要拿着一个系统既有的解决方案把这些疑虑索性应付掉。在为了让直接修正GoGCC无果以前(吐槽:Go应用流程系统GCC写就的引人略感惋惜),我近期从表列几个不足之处以此开展了就其所称导工作:
分立转译自然环境: 备有一个常规的docker image用来转译主流程和应用流程,规避任何go完整英文版、gopath方向上、默认等不相一致所带给的疑虑 预制go/pkg/mod,大大降低因为不但会适用vendor模式随之而来每次转译都要重一新iTunes仰赖的疑虑 分立Makefile: 备有一套主流程和应用流程的转译Makefile,规避任何因为go build命以致于带给的疑虑 分立应用流程整合所称导工作台: 由所称导工作台,而不是整合者拉伊应用流程与主流程的仰赖完整英文版。并由所称导工作台应付其他就其疑虑 ACI既有: 将转译处理过程aci既有,进一步避免提醒到扯误左图4-1. 分立应付解决方案
至此,关于Go应用流程的少用疑虑及应付作法讲解就暂告副标题了,希望对你有所鼓励。
Bonus
如果是不是想彻底搞清楚应用流程数据流的系统,那这那时候为你备有一些快速带入GCC阅念过状态的入口。我适用的GoGCC为1.15.2完整英文版。
就其GoGCC位置:
compiler go/src/cmd/compile/* linker go/src/cmd/link/internal/ld/* package loader go/src/cmd/go/internal/load/* runtime go/src/runtime/*5.1 go build到底在好好啥
你可以在go build 命以致于那时候替换成-x 变量,以显式的扫描出Go流程转译、重定向、了了的全处理过程,例如:
go build -x -buildmode=plugin -o ../calc_plugin.so calc_plugin.go
5.2 尽不太可能字符生成
go/src/cmd/compile/internal/gc/obj.go:55 :提醒第67和第72先为,这那时候是两个入口
go/src/cmd/compile/internal/gc/iexport.go:244 :提醒280先为,这那时候但会纪录path就其原始数据
5.3 库那时候数据流生成搜索算法
go/src/cmd/link/internal/ld/lib.go:967 :提醒第995~1025先为,这那时候数值pkg的hash
5.4 库那时候数据流数据流
go/src/runtime/symtab.go:392 :关键因素原始数据结构
go/src/runtime/plugin.go:52 :重定向期hash与运营时hash值数据流点
go/src/cmd/link/internal/ld/symtab.go:621 :重定向期hash赋值点
go/src/cmd/link/internal/ld/symtab.go:521 :运营时hash赋值点
整合者CNET交第五期——变量数值ServerlessCNET发给以致于
整合者CNET交上一新啦,第五期CNET变量数值Serverless江湖发给以致于来袭,全一新玩法,权益升级,实用性千元高级英文版其产品乘风者付费普通英文版专享。群雄雄霸夺好礼,Beats耳机、机械QWERTY、千元天猫连锁店戈等好礼等你来拿,面世你的CNET被选为江湖一新“实是”。
点击这那时候,查看详情。
文中重定向:
本文为阿那时候云原创表列内容,未经意味着不得刊出。
。哈尔滨妇科检查哪些项目海露玻璃酸钠滴眼液治眼睛疼吗
山东癫痫医院哪最好
北京妇科专科医院哪个好
石家庄男科医院哪里好
小儿厌食
科学补钙
白癫风
牛皮癣医院
五一病例增加,感染新冠后为什么要第一时间吃抗病毒药物?医生的解答来了。
上一篇: 预盈变预亏!百亿央企突然“变脸”
- 这才是男孩子应该玩的!放学回家玩这个释放情绪,锻炼专注力!居家运动儿童运动抖in宝贝计划散打萌娃
- 名记嘲讽穆帅:自己烂,别总怪裁判!费耶诺德副手和穆帅玩心理战
- 孩子注意力不集中,应该多玩平衡板,训练感统提升协调性,越玩越专注。感统训练 居家运动 幼儿教育 家庭教育 直播
- 巅峰小卡和甜瓜1V1谁更超强?麦迪:这很简单 甜瓜
- 冬天想社会活动社会活动,跑步太累了,就可以试试这个网球训练器,大人孩子都可以玩,一个人就能打网球啦网球网球训练器
- 维特斯足球队成立130周年晒球员照片,张玉宁在列
- 每体:阿斯皮利奎塔开始与埃弗顿商谈离队,他将和新老板会谈
- 2022年全国水翼2012年夏天&风筝板冠军赛收官
- 里程碑!世界第一获千胜,卫冕决赛冲六冠王!2号种子惨被淘汰
- 马卡报:利物浦本赛季足总杯一共收入1000万镑
- 心虚了?哈登自愿放弃顶薪!麦迪说出原因,布克透露压缩方式
- 王霜领衔!中国女足公布最新集训名单,将在崇明岛备战东亚杯
- 德容女友密友互动,运动员出身成网红,身家500万,大秀腰腹力量
- 火箭记者发推,四新秀确认参加夏季杯赛,内线小将已回到休城
