• 请不要在回答技术问题时复制粘贴 AI 生成的内容
sadfQED2
V2EX  ›  程序员

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

  •  
  •   sadfQED2 · Jun 26, 2022 via Android · 3025 views
    This topic created in 1424 days ago, the information mentioned may be changed or developed.
    一个 mvc 结构的 go 语言项目,正常情况下应该是 controller 层调用 service ,service 调用 model



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



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

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


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

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

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

    所以直接写个脚本,用正则检测各个层的目录下有没有引入不想引入的层包不就好了?
    如果是 github 的话这种功能我一般都是直接写到 github actions 里的,不让提 pr
    realpg
        19
    realpg  
    PRO
       Jun 26, 2022
    @sadfQED2 #5
    PHP 时代我们也做过
    直接检查包名,M 、C 是固定目录的,框架规定,然后允许引用的包进行判断
    但是这么管不了不 import ,直接写全路径的,这种可以结合代码 review 罚钱解决
    zjj19950716
        20
    zjj19950716  
       Jun 27, 2022
    controller 也在调 model 方法。偶尔还他妈 model 调 contrller 代码。
    不会循环应用吗?
    zjj19950716
        21
    zjj19950716  
       Jun 27, 2022
    @zjj19950716 循环引用
    eudore
        22
    eudore  
       Jun 27, 2022
    go list pkg 可以读取引入的包
    About   ·   Help   ·   Advertise   ·   Blog   ·   API   ·   FAQ   ·   Solana   ·   1197 Online   Highest 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 83ms · UTC 23:25 · PVG 07:25 · LAX 16:25 · JFK 19:25
    ♥ Do have faith in what you're doing.