Go原生插件使用情况全解析
全椒娱乐新闻网 2025-11-02
答案是, Go 的 error 日志描述不精准。而这个刊歪出现的根本主因可以总括: 主程序和应用程序的某些极其重要程序代码 flag 不清楚,跟“改写版”不曾啥人关系。
比如,你应用于上头的军令程序代码应用程序:
GO111MODULE=on go build --buildmode=plugin -mod readonly -o ./codec.so ./codec.go
但是你应用于 goland 的 debug 方式调试主程序,此时,goland 亦会帮你把 go build 军令按上头的值得注意组装好:
特别注意,goland 组装的程序代码军令从前包含极其重要的
-gcflags all=-N -l常量,但是应用程序程序代码的军令从前不曾有。此时,你在试图拉起应用程序时就亦会得到一个有关 runtime/internal/sys的刊歪。
所示 2-1. 程序代码 flag 不清楚所致的存储不甘心
克服这一类准则纳改写版不清楚主因的提议比较简便: 尽或许可视主程序和应用程序程序代码的 flag。事实上,有一些 flag 是不影响应用程序存储的,你可以在实际的实践里面慢慢地思索。
二、不清楚的第三方纳改写版
如果应用于 vendor 来名曰政 Go 的依靠纳,那么当克服上一节的主因之后,你 100% 亦会即刻遇到以下这个刊歪:
plugin was built with a different version of package xxxxxxxx
其里面, xxxxxxxx同义的是某一个实际的三方纳,比如 github.com/stretchr/testify。这个刊歪有几个极为值得特别注意的主因,如果不曾有关的的事发经验,其里面几个或许亦会烧掉开发设计小组不少时间。
#
Case 1. 改写版不清楚
如刊歪所示,或许主因很清楚,即 主程序和应用程序所一同依靠的某个第三方纳改写版不清楚,刊歪里面亦会清楚告诉你哪一个纳有主因。此时,你可以对比事发主程序和应用程序的 go.mod邮件,分别找到主因纳的改写版,看看他们是否清楚。如果这时候你见到主程和应用程序或许有 commitid或 tag的不清楚主因,那克服的原理也很简便: 可视它们。
但是在很多场景下,你只亦会用到三方纳的一部分:如一个 package,或者只是名曰了某些 interface。这一部分的预定义在不尽相同的改写版从前或许根本就不曾有移转,但其他不曾用到的预定义的移转,比如说亦会所致整个三方纳改写版的移转,进而所致你视为那个“改写版不清楚”的无辜受害者。
而且,此时你或许即刻亦会遇到另一个主因:以谁为可视可视?主程序?还是应用程序?
从显然上来知道,以主程序为基线进名曰可视是一个比较好的策略,毕竟应用程序是原先移除的“附属品”,且主程序与应用程序举例来知道是“一对多”的人关系。但是,如果应用程序的三方纳依靠因为任何理由就是不能和主程序可视怎么办?在试图了很茂日后,我不得不不曾有找到一个再来美克服这个主因的设法。
如果改写版不能可视,就只能根本原因放弃前行应用程序这条路。
Go 词汇的这种对三方纳的、仍然秃头的强清楚性规范,从一方面来知道,避免了列车运名曰时因为改写版不清楚产生的潜在主因;从另一方面来知道,这种过份不给程序员自如度的原先设计,相异用程序简化、定制简化、扩大简化开发设计极为的不的关系。
所示 2-2. 一同依靠的三方纳改写版不清楚所致的存储不甘心
#
Case 2. 改写版号清楚,预定义不清楚
当你按照 case 1 的思路事发 go.mod邮件,但是惊讶的见到刊歪的纳改写版是清楚的时候,什么事就亦会变得复杂起来。你或许亦会取前行世界上最先进的文本查验工具,并花掉一个上午去 diff 三方纳的 commitid,但它们就是一模一样,或许陷入了薛定谔的改写版。
出现这个主因或许的一个不是主因的主因是:有人带头之亦然改写名了 vendor 清单下的预定义,Go 应用程序程序亦会对预定义以下内容的清楚性进名曰数据资料流。
这实在是一个极为令人震惊头大,并不能事发的主因。除了改写名预定义的那个人,和已经在其他 case 里面被“月湾”过的那些人,不曾人亦会知道这件什么事。如果改写名的 vendor 预定义出现在主程序从前,你就仍然不曾有任何靠谱的设法让它们正常人实习起来。
不要带头之亦然在 vendor 从前改名预定义!!!
不要带头之亦然在 vendor 从前改名预定义!!!
不要带头之亦然在 vendor 从前改名预定义!!!
回馈源预定义生态村,或者 fork-replace!!!
好消息是,你不必须克服这个主因。因为即使克服了,也还亦会有更是大的主因等着你。
所示 2-3. 一同依靠的三方纳预定义被就地改写名所致的存储不甘心
#
Case 3. 正向不清楚
当按照 case 1 和 case 2 的思路都把主因事发、克服再来,但它还是刊 different version of package 的时候,或许你就亦会开始对 Go 的应用程序程序失去耐心了: 改写版实在“一毛一样”,预定义实在一名曰不曾动,为什么还刊不尽相同改写版???
主因是: 应用程序程序亦会数据资料流依靠纳软体包的「正向」,因此不能应用于 vendor 名曰政依靠。
举个值得注意:你的主程序软体包放置 /path/to/main 清单下,因此,你的某个三方纳依靠的清单应该是:
/path/to/main/vendor/some/thrid/part/lib;
同理,你的应用程序软体包放置 /path/to/plugin 清单下,因此,同一个三方纳依靠的清单应该是:
/path/to/plugin/vendor/some/thrid/part/lib。
这些「 邮件正向」数据资料亦会被自带到整数可执名曰邮件从前并用于数据资料流,当主程序存储应用程序时,Go 的“列车运名曰时”“聪明的”通过「 邮件正向」的歧异确认它和应用程序用的不是同一份预定义,然后刊了个 different version of package。
所示 2-4. 应用于 vendor 程序名曰政第三方纳所致的存储不甘心
比如说的主因也或许亦会出现在应用于不尽相同工具/使用者,分别程序代码主程序、应用程序的场景下:使用者名不尽相同,go 预定义的正向应该也亦会不一样。
克服这类主因的原理很暴力带头之亦然: 删掉主程序和应用程序的 vendor 清单,或者应用于-mod=readonly 程序代码 flag。
到这从前,如果你是应用于同一台工具进名曰主程序和应用程序的程序代码,那么相似的主因应该都理论上克服了,应用程序程序理应能够正常人实习。另一方面,由于不必应用于 vendor 名曰政依靠,因此 case 2 的主因也亦会在这从前被强制克服:要么提 PR 给生态村,要么 fork-replace。
所示 2-5. 急于存储
三、不清楚的 Go 改写版
fatal error: runtime: no plugin module data
除了侧面的那些主因以外,还有一个在多工具分别程序代码主程/应用程序场景下的相似刊歪。这个刊歪的一个或许主因是 Go 改写版不清楚,可视它们即可。(如果从工具层次就是不能可视怎么办?……)
所示 2-6. Go 改写版不清楚所致的存储不甘心
PART. 3
统合克服提议
从第二 Part 里面,我们看了一些既很难事发,也不是很好处置的主因。除此之外,或许还有一些主因不曾有被重点介绍进来。作为一个脚本语言词汇官方网站带头对的扩大程序,想到的如此使用者不的关系或许差一点。
由于「 专有幽 MOSN」重点依靠 Go 的应用程序程序想到定开,因此必须取前行一个系统设计简化的提议把这些主因统统克服掉。在试图带头之亦然改写名 Go 软体包无果日后 (自嘲:Go 应用程序程序软体包写的令人震惊略感抱歉),我们重点从“厂家层”及外围基础设施入手积极开展了关的实习:
- 统合程序代码环境:
包括一个准则的 docker image 用来程序代码主程序和应用程序,无视任何 go 改写版、gopath 正向、使用者名等不清楚所产生的主因; 装配 go/pkg/mod ,比方知道因为不曾有应用于 vendor 方式所致每次程序代码都要原先的下载依靠的主因。- 统合 Makefile:
包括一套主程序和应用程序的程序代码 Makefile,无视任何因为 go build 军令产生的主因。- 统合应用程序开发设计装配:
由装配,而不是Valve拉齐应用程序与主程序的依靠改写版。并由装配克服其他关的主因。- 流水线简化:
将程序代码作战流水线简化,再进一步再加歪误。所示 3-1. 统合克服提议
PART. 4
极其重要软体包右方
如果实在想根本原因搞清楚应用程序数据资料流的程序,那这从前为你包括一些较慢进入软体包朗读状态的入口。我应用于的 Go 软体包为 1.15.2 改写版。 关的 Go 软体包右方:
- compiler:go/src/cmd/compile/*
- linker:go/src/cmd/link/internal/ld/*
- pkg loader:go/src/cmd/go/internal/load/*
- runtime:go/src/runtime/*
一、go build 是不是在想到啥
你可以在 go build 军令从前移除 -x 常量,以显式的打印出 Go 程序程序代码、绑定、自带的全系统设计原先设计,例如:
go build -x -buildmode=plugin -o ../calc_plugin.so calc_plugin.go
二、再度目标预定义生成
go/src/cmd/compile/internal/gc/obj.go:55 :特别注意第 67 和第 72 名曰,这从前是两个入口;
go/src/cmd/compile/internal/gc/iexport.go:244 :特别注意 280 名曰,这从前亦会记录 path 关的数据资料。
三、纳哈希生成算法
go/src/cmd/link/internal/ld/lib.go:967:特别注意第 995-1025 名曰,这从前计数 pkg 的 hash。
四、纳哈希数据资料流
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 常量点。
PART. 5
总结
可以看见,即使 Go 的原生应用程序程序有各种各样令人震惊头痛的主因,SOFAStack 团队依旧秉持“源预定义、开放、可扩大”的初衷,通过各种手段克服主因,并再度将此战斗能力想到到生产必需。
现阶段,专有幽 MOSN 的协议编解码器和 logger 的定制简化开发设计已经实现全面的应用程序简化。年中,我们将持续对 MOSN 管理模式进名曰换用,再度目标对有数IPv逻辑学、LB 逻辑学、注册里面心/配置里面心入轨等在内的各个方面战斗能力进名曰应用程序简化带头对。
END
这从前有最原先源预定义资料库、软体更是原先、新科技干货等以下内容
点这从前 ↓↓↓ 忘了 关注✔ 标星⭐ 哦~
。深圳看牛皮癣去哪家好上海皮肤病治疗方法
长沙看白癜风哪个专科医院好
南京妇科医院哪个好
泰州看白癜风什么医院最好
急性支气管炎咳嗽怎么治
小肚子疼
风热感冒咳嗽有痰吃什么药
消除口臭
咳嗽咽痛吃什么药?

-
如何获得隐形黑色背景
视频 2025-11-02将数码相机设立为手动方式。 2. 考虑下限的感红光度ISO取值(200或非常低,可能的话)。 3. 将放大设立为创纪录闪红光定时平均速度(大约1250s或1200s)

-
哈啰发布共享两轮文明城中计划,上海一年累计调度车辆超200万辆
影视 2025-11-02国际上专业课程的本地出行及生活服务平台——常在于7同年18日发布“共有享两轮现代文明城著手”,旨在助力国际上各郊区加速“创行销卫”管理工作,增加市民的幸福感、获得感。常在之外坚称,该著手为郊区管

-
李书福的高端手机之路怎么走?星纪时代CEO这么知道
影视 2025-11-02此从新赛道上都是一个互不学习互不仿效的状态。”他如此说明了。 至于星纪时期与Mate之间预见的的业务和风险管理互不配合, 王勇简介,陷入僵局在保有品牌独立的为根基,散布不同的消费者的电子

-
不哗众取宠也不将就,OPPO A97静夜黑图直木:实用党至爱
时尚 2025-11-02相信在很多商品的眼中,Android的简约性都是最重要的,毕竟Android并不是以电玩要素居多的设备,搞太多花里胡哨的机制,还不如老老实实把续航、细腻度等体会做好,这样才能耐人寻味大大提高商品

-
国内折叠屏手机榜单更新:三星排名第二,榜首营业额高达52%
资讯 2025-11-027年末18日假消息,市调机构Counterpoint列入了2022年5下半年国外翻转中门iPad炙手可热榜首单:惠普以15%的占有率连在在第二,连在在第一的是三星iPad,它拿到了52%的占有率