zoukankan      html  css  js  c++  java
  • go1.13 mod 实践和常见问题

    实践建议

    0,go mod 要求所有依赖的 import path 的path 以域名开头,如果现有项目转1.13的go mod 模式,且不是以域名开头则需要修改。
     eg: code.be.mingbai.com/tools/any_test_del_free
    
    1, 既然已经更新到1.13了,建议直接设置GO111MODULE="on" ,即开启go mod 模式。因为这也是以后的主流,path会慢慢的消失。
    go env -w GO111MODULE=on
    
    2,给go mod 设置代理, 并添加私有域名
    go env -w GOPROXY=http://goproxy.cn,direct
    
    go env -w GOPRIVATE=*.mingbai.com
    
    私有域名的配置会让go mod 不走代理,而是用版本控制工具(git)的方式去拉去依赖。解决拉内网或者本地代码的问题。
    
    3,新建项目,或者是已有项目转为go mod 模式的 init 建议

    go mod init 域名/组名/项目名

    eg: code.be.mingbai.com/tools/any_test_del_free

    4,sdk 发布v2、v3 等版本,使其可用于1.13模式的依赖
    参看 常见问题 第4条。
    

    常见问题

    1,报错: XXXX found,but does not contain package XXXX
    如果不止一处报错,可以检查下 go mod init ‘name’ , 的name 是否为 域名/组名/项目名(比如code.be.mingbai.com/tools/soa) 的严格模式。如果不是可以改为这种模式再试一下。
    
    如果仅一两处报错,还有可能是所引用的包有问题,建议检查包的目录结构。
    
    如果是已有项目升级到go1.13,还有可能是新依赖包的的版本大范围不对。从现有的依赖文件里(比如glide.lock)导入依赖版本可以解决。
    
    2, 报错: malformed module path "XXXX": missing dot in first path element
    go1.13  mod 要求import 后面的path 第一个元素,符合域名规范,比如code.be.mingbai.com/tools/soa
    
    即使是本项目下的其他包
    
    如果无法使用域名,可以考虑使用replace,但不建议这样做。
    
    eg: replace  code.be.mingbai.com/tools/soa  =>  ../../tools/soa
    
    3,报错: require XXXX: version "v3.2.1" invalid: module contains a go.mod file, so major version must be compatible: should be v0 or v1, not v3
    其他包,go1.13,对import有严格的语义要求,导入依赖包的V2或再v2之后的版本,需要在‘import path’ 的path 包好 ‘/v2’ 等字样。
    

    更改import path 后 ,go get 并指定版本如果仍然会报错,执行go mod tidy 会自动更新。(报错原因,有待进一步确认)

    如果所依赖的包,没有提供这种依赖方式,可以指定依赖master的最新commit。
    
    eg: go get  code.be.mingbai.com/tools/soa@master
    
        @分支名,或者commitId等
    
    4,sdk项目维护方发版,使 sdk 的v2、v3 版本 可用于go1.13 mod 模式的显式依赖

    注意: 不使用以下两种发版方式,也可以依赖到v1 以上版本,不过需要通过分支名或者commitId 去引入依赖

    eg: go get code.be.mingbai.com/tools/any_test_del_free@c92ca0db
    
         go get code.be.mingbai.com/tools/any_test_del_free@master
    

    显式的两种方式

    1,可以直接打标签,发布包新版本和其它包管理工具基本一致,不过打标签之前需要在 go.mod 中写入相应的版本号:
    $ go mod edit --module=code.be.mingbai.com/tools/any_test_del_free/v2
     
    $ cat go.mod
    module code.be.mingbai.com/tools/any_test_del_free/v2
     
    go 1.13
     
    .......
     
     
     
     
    # 此时使用方的依赖引入:
    import (
       "code.be.mingbai.com/tools/any_test_del_free/v2/xlog" # 这一行
       sw "code.be.mingbai.com/tools/any_test_del_free/xsensitive_words"
    )
    

    官方推荐将上述过程在一个新分支来避免混淆,那么类如上述例子可以创建一个 v2 分支,但这个不是强制要求的。

    2,还有一种方式发布新版本,那就是在主线版本种加入 v2 文件夹,相应的也需要内置 go.mod 这个文件。
    $ mkdri v3
    $ .....coding......
    $ go mod intit code.be.mingbai.com/tools/any_test_del_free/xsensitive_words/v3
    $ go mod tidy
    $cat go.mod
     
     
    

    module code.be.mingbai.com/tools/any_test_del_free/xsensitive_words/v3

    go 1.13
    ......

     
     
     
     
    $ .......commit, push and so no....
    $ tree projectPath.
    ├── linked_sensor.go
    ├── README.md
    ├── sensitive_words.go
    ├── sensitive_words_test.go
    ├── sensor.go
    └── v3
        ├── go.mod
        ├── linked_sensor.go
        ├── README.md
        ├── sensitive_words.go
        ├── sensitive_words_test.go
        └── sensor.go
     
     
    # 此时使用方的依赖引入:
    import (
       "code.be.mingbai.com/tools/any_test_del_free/v2/xlog"
       sw "code.be.mingbai.com/tools/any_test_del_free/xsensitive_words/v3" # 这一行
    )
    
    ```
  • 相关阅读:
    事件处理器(eventhandler,或称为事件处理程序)onload
    HTML语言中img标签的alt属性和title属性的作用于区别
    nexus 开机自启动
    idea 上传jar包到nexus
    Spark standalone HA
    spark 性能优化指南
    spark 体验点滴- executor 数量 和task 并行数
    spark 体验点滴-client 与 cluster 部署
    aop concepts
    部署jar到linux ,开机自启动
  • 原文地址:https://www.cnblogs.com/mingbai/p/go13moduleuser.html
Copyright © 2011-2022 走看看