如何限制 go 代码引用模块的目录?

讨论 未结 17 69
sadfQED2
sadfQED2 会员 2022年6月26日 01:28 发表
一个 mvc 结构的 go 语言项目,正常情况下应该是 controller 层调用 service ,service 调用 model <br> <br> <br> <br>但是,总有一些屌毛,可能由于紧急情况,可能是懒,在偶尔周末加班等没人 CR 的时候,controller 层调其他 controller 里面的方法,controller 也在调 model 方法。偶尔还他妈 model 调 contrller 代码。刚开始可能就一两处这样写,但是后续的人改这种代码,也只能接着这样写。最终项目崩塌,成为真正的屎山。 <br> <br> <br> <br>很多年前,我在另外一家公司写 php 的时候,我记得当时项目是对代码引用做了限制,如果写出上面这样乱引用代码,提交的时候直接被拒。想请问一下 go 语言里面能否加这种配置呢?在哪加?知道的麻烦给个关键词吧
收藏(0)  分享
相关标签: 灌水交流
注意:本文归作者所有,未经作者允许,不得转载
17个回复
  • wenerme
    2022年6月26日 01:28
    如果是限制外部 .golangci.yml 配置 ban ``` linters-settings: depguard: list-type: blacklist # 限制列表 packages: - ``` 但是你说的这个属于代码规范层面了,不是限制问题,你限制了,他也能绕开,所以是规范,规范是靠人维护和遵守的,规则只能保证部分。
    0 0
  • napsterwu
    2022年6月26日 01:57
    你以前那个应该是在 git hook 里写了一些检测脚本吧
    0 0
  • joesonw
    2022年6月26日 01:57
    这种引用的检测自己实现一个 lint 非常简单,ast 的知识都不需要了解。可以写一段代码手动扫描,或者实现一个 golangci-lint 的 custom linter (这个比较麻烦,算编译成 go plugin ,go 版本和系统要完全一致才可以,意味着最好是用的时候编译)
    0 0
  • sadfQED2
    2022年6月26日 02:56
    是的,但是我不知道怎么实现的
    0 0
  • sadfQED2
    2022年6月26日 02:56
    有编程规范,但是项目里面有部分是外包,隔三差五换人。隔三差五拉个会说这种事挺累的
    0 0
  • Trim21
    2022年6月26日 02:56
    可以设置 golangci-lint ,用 depguard 写一个非常复杂的配置。 或者写个 go 的脚本在 ci 里面跑一下,用 go 标准库的 go 语言 parser ,不算错误处理三行就能列出一个文件所有的 import 。然后直接 has prefix 就行
    0 0
  • Trim21
    2022年6月26日 02:56
    不过如果是比较复杂的情况,比如想要阻止的“controller 调 controller”是一个结构体调用其他方法的话,实现起来就比较麻烦了
    0 0
  • hubqin
    2022年6月26日 03:27
    了解下 go 的 internal 目录,不想被其他目录之外引用,就放在这个目录
    0 0
  • fgwmlhdkkkw
    2022年6月26日 03:57
    你整个依赖注入,让用的人方便不久好了吗?
    0 0
  • singerll
    2022年6月26日 03:57
    让领导跟外包公司谈好,推的人出现这种情况扣钱。
    0 0
  • CoderGeek
    2022年6月26日 06:28
    想问下 对 go 了解不多 用 grpc 的模式下 1. 前端或移动端向 endpoint 发送请求 2. grpc-gateway 作为 reversed proxy ,首先承接到请求,然后转发到对应的 GRPC endpoint 3. Grpc service 的 handler 接收到请求 1. 做 request validation 2. 把外部的 entity 转为内部 entity 4. Grpc service 的 controller 接收到请求 1. 进行业务逻辑运算,可能会调用 gateway 的部分 function 2. 也可能会调用其他 controller 的 function 5. Grpc handler 拿到 controller 的运算结果 1. 如果出错,返回 error ,被 middleware 接住 error ,进行 log ,然后返回 2. 如果没有出错,获得结果后,调用 mapper ,把 internal entity 转为 external entity 6. grpc-gateway 拿到 handler 的计算结果,返回给 caller 这样的 mvc 结构 controller 层调其他 controller 有什么问题吗就是弊端 望指教
    0 0
  • codeMore
    2022年6月26日 08:56
    同 10 楼,可以用 go 的 internal 目录去限制,语言自带的
    0 0
  • BeautifulSoap
    2022年6月26日 09:29
    你要知道,调用什么层 = 引用了这个层的包 所以直接写个脚本,用正则检测各个层的目录下有没有引入不想引入的层包不就好了? 如果是 github 的话这种功能我一般都是直接写到 github actions 里的,不让提 pr
    0 0
  • realpg
    2022年6月26日 10:29
    #5 PHP 时代我们也做过 直接检查包名,M 、C 是固定目录的,框架规定,然后允许引用的包进行判断 但是这么管不了不 import ,直接写全路径的,这种可以结合代码 review 罚钱解决
    0 0