V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
sadfQED2
V2EX  ›  程序员

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

  •  
  •   sadfQED2 · 2022-06-26 08:55:27 +08:00 via Android · 2201 次点击
    这是一个创建于 667 天前的主题,其中的信息可能已经有所发展或是发生改变。
    一个 mvc 结构的 go 语言项目,正常情况下应该是 controller 层调用 service ,service 调用 model



    但是,总有一些屌毛,可能由于紧急情况,可能是懒,在偶尔周末加班等没人 CR 的时候,controller 层调其他 controller 里面的方法,controller 也在调 model 方法。偶尔还他妈 model 调 contrller 代码。刚开始可能就一两处这样写,但是后续的人改这种代码,也只能接着这样写。最终项目崩塌,成为真正的屎山。



    很多年前,我在另外一家公司写 php 的时候,我记得当时项目是对代码引用做了限制,如果写出上面这样乱引用代码,提交的时候直接被拒。想请问一下 go 语言里面能否加这种配置呢?在哪加?知道的麻烦给个关键词吧
    22 条回复    2022-06-27 14:41:04 +08:00
    wenerme
        1
    wenerme  
       2022-06-26 09:11:04 +08:00
    如果是限制外部 .golangci.yml 配置 ban

    ```
    linters-settings:
    depguard:
    list-type: blacklist # 限制列表
    packages:
    - golang.org/x/net/context
    ```


    但是你说的这个属于代码规范层面了,不是限制问题,你限制了,他也能绕开,所以是规范,规范是靠人维护和遵守的,规则只能保证部分。
    napsterwu
        2
    napsterwu  
       2022-06-26 09:41:58 +08:00 via iPhone
    你以前那个应该是在 git hook 里写了一些检测脚本吧
    joesonw
        3
    joesonw  
       2022-06-26 09:47:49 +08:00 via iPhone
    这种引用的检测自己实现一个 lint 非常简单,ast 的知识都不需要了解。可以写一段代码手动扫描,或者实现一个 golangci-lint 的 custom linter (这个比较麻烦,算编译成 go plugin ,go 版本和系统要完全一致才可以,意味着最好是用的时候编译)
    issakchill
        4
    issakchill  
       2022-06-26 09:56:56 +08:00
    感觉拉个会 叼一下人 会方便点
    sadfQED2
        5
    sadfQED2  
    OP
       2022-06-26 10:35:20 +08:00 via Android
    @napsterwu 是的,但是我不知道怎么实现的
    sadfQED2
        6
    sadfQED2  
    OP
       2022-06-26 10:37:04 +08:00 via Android
    @issakchill 有编程规范,但是项目里面有部分是外包,隔三差五换人。隔三差五拉个会说这种事挺累的
    Trim21
        7
    Trim21  
       2022-06-26 10:46:13 +08:00 via Android
    可以设置 golangci-lint ,用 depguard 写一个非常复杂的配置。

    或者写个 go 的脚本在 ci 里面跑一下,用 go 标准库的 go 语言 parser ,不算错误处理三行就能列出一个文件所有的 import 。然后直接 has prefix 就行

    https://pkg.go.dev/go/parser#ParseFile
    Trim21
        8
    Trim21  
       2022-06-26 10:47:37 +08:00 via Android
    Trim21
        9
    Trim21  
       2022-06-26 10:51:16 +08:00 via Android
    不过如果是比较复杂的情况,比如想要阻止的“controller 调 controller”是一个结构体调用其他方法的话,实现起来就比较麻烦了
    hubqin
        10
    hubqin  
       2022-06-26 11:15:38 +08:00
    了解下 go 的 internal 目录,不想被其他目录之外引用,就放在这个目录
    fgwmlhdkkkw
        11
    fgwmlhdkkkw  
       2022-06-26 11:33:46 +08:00
    你整个依赖注入,让用的人方便不久好了吗?
    fgwmlhdkkkw
        12
    fgwmlhdkkkw  
       2022-06-26 11:34:09 +08:00
    @fgwmlhdkkkw #11 久 =》 就
    singerll
        13
    singerll  
       2022-06-26 11:34:49 +08:00 via Android
    让领导跟外包公司谈好,推的人出现这种情况扣钱。
    CoderGeek
        14
    CoderGeek  
       2022-06-26 14:00:35 +08:00
    想问下 对 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 有什么问题吗就是弊端 望指教
    sadfQED2
        15
    sadfQED2  
    OP
       2022-06-26 15:23:36 +08:00 via Android
    @CoderGeek controller 互调最终结果就是代码逻辑混乱,代码完全不可读
    sadfQED2
        16
    sadfQED2  
    OP
       2022-06-26 15:25:17 +08:00 via Android
    @singerll 大家都打工的,扣别人钱感觉不太合适了。以前公司遇见过这种限制,所以想加个限制,直接从根源上解决问题
    codeMore
        17
    codeMore  
       2022-06-26 16:53:24 +08:00
    同 10 楼,可以用 go 的 internal 目录去限制,语言自带的
    BeautifulSoap
        18
    BeautifulSoap  
       2022-06-26 16:59:04 +08:00 via Android
    你要知道,调用什么层 = 引用了这个层的包

    所以直接写个脚本,用正则检测各个层的目录下有没有引入不想引入的层包不就好了?
    如果是 github 的话这种功能我一般都是直接写到 github actions 里的,不让提 pr
    realpg
        19
    realpg  
       2022-06-26 17:59:12 +08:00
    @sadfQED2 #5
    PHP 时代我们也做过
    直接检查包名,M 、C 是固定目录的,框架规定,然后允许引用的包进行判断
    但是这么管不了不 import ,直接写全路径的,这种可以结合代码 review 罚钱解决
    zjj19950716
        20
    zjj19950716  
       2022-06-27 13:56:09 +08:00
    controller 也在调 model 方法。偶尔还他妈 model 调 contrller 代码。
    不会循环应用吗?
    zjj19950716
        21
    zjj19950716  
       2022-06-27 13:56:23 +08:00
    @zjj19950716 循环引用
    eudore
        22
    eudore  
       2022-06-27 14:41:04 +08:00
    go list pkg 可以读取引入的包
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   3180 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 30ms · UTC 14:25 · PVG 22:25 · LAX 07:25 · JFK 10:25
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.