使用GO111MODULE解决go导包难,下包难问题-go如何导包下载包?go包报错如何解决?

2023-05-16

文章目录

  • 快速解决方案
  • GO111MODULE介绍
  • 使用区分
    • 旧版使用
      • 安装库
        • 解决无法下载
    • 新版使用
      • 初始化
        • 老项目初始化
      • 安装库
      • go mod命令介绍
    • 调用库

快速解决方案

  1. 强制开启GO111MODULE
    go env -w GO111MODULE=on
  2. 使用中国代理
    go env -w GOPROXY=https://goproxy.cn,direct
    如果使用了上面两个命令还是无法解决你的问题,或者你想知道为什么要使用这两个命令,强制开启GO111MODULE到底有什么用,看完这篇博客应该就了解了。

GO111MODULE介绍

GO111MODULE开启和关闭对Go的包无论是导入,还是下载使用,都有着非常大的区别,老版本可以说就没有包管理器,无法实现类似npm install或者pip install -r requirements这样的自动导入所有需要的包。并且go项目也被限制在了go的PATH文件夹中,导入也需要写较长的路径,十分不方便。GO111MODULE的出现就是用来解决上述所有的问题。
GO111MODULE出现后

使用区分

确保你的go版本大于1.11go version(最好大于1.13),否则是没有GO111MODULE这个模块的。

  1. 查看当前项目是否启用了新版包管理器:
    看一个Go项目中有没有go.mod文件是区分这个go项目是否使用了新版包管理器的关键!
  2. 查看本地是否启用了新版包管理器
    在命令行输入go env GO111MODULE查看当前状态,其中自动(auto)的规则在go的1.13版本之后是扫描文件夹中是否存在go.mod文件,如果存在则启用,不存在则关闭。

旧版使用

说新版之前,我们先来看看如果纯使用旧版有多麻烦旧版因为不能换源,在国内很容易出现一些问题,先不说GitHub时不时连不上,golang.org是一定连不上的,一旦出现需要从golang.org下载的包必然报错

安装库

旧版命令很少,基本上我们用的也就是安装包时候的命令go get 包下载地址,这里我用logrus日志库在做演示,我输入
go get github.com/sirupsen/logrus

解决无法下载

  1. 无法下载:
    老版本这种命令行下包老容易出现一些奇奇怪怪的问题,比如下面这样的,虽然logrus下载成功了,但是基于logrus包的
    在这里插入图片描述
    首先根据报错我们得知,是golang.org/x/sys/windows下载失败导致的,并且我们尝试运行logrus库的时候也的确提示了缺少这么一个包。

解决办法:

  1. 开启全局代理(当前主流的代理软件比如下面截图中那些,都是基于socket5的他们的全局都是假全局)。使用socket5实现真全局代理是手机上开代理并且热点共享代理,然后在电脑连接手机热点,这样是真正的全局代理了。在这里插入图片描述
  2. 手动下载需要的包放到指定的位置,一般go的包都会开源在GitHub上,所以只需要去下载相应的包即可(go官方git地址: https://github.com/orgs/golang/repositories)
    根据报错提示,我需要的是sys这个包,我只需要拉去https://github.com/golang/sys即可
    我是自己使用git clone克隆下来了,你也可以手动下载放进去,注意吧文件名改成一样的即可。
    在这里插入图片描述
    我这只是安装了一个日志库就如此麻烦,如果是一个较大的项目肯定不止一个日志库,那下载包就会占用我们大量时间!
    不过老版也有一些Glide第三方的包管理工具,不过我如go比较晚,因为有了官方的包管理工具就没用过这些工具了。想要了解的话可以了解一下据说在中国用的比较多的:Glide: https://glidedocs.readthedocs.io/zh/latest/

新版使用

旧版不支持换源是导致他下载非常麻烦的一大因素,在国内我们无论是使用Python的pip,还是nodejs的npm,甚至是很多Linux发行版都会优先换个源在使用。GO111MODULE首先解决了这个不能还原的问题。所以在使用新版包管理器前建议你先进行一下换源。

  1. 七牛 CDN
    go env -w GOPROXY=https://goproxy.cn,direct
  2. 阿里云
    go env -w GOPROXY=https://mirrors.aliyun.com/goproxy/,direct
  3. 官方
    go env -w GOPROXY=https://goproxy.io,direct
    网上比较流行使用的多的是七牛的,三选一即可,可以都试试看在你的网络环境下谁快
    这个换源命令只有在使用新的包管理器时才会生效

初始化

使用新的包管理器之前,我们先要对go项目进行一次初始化,也就是生成go.mod文件,这个文件在之前也说过就是区分是否使用了新版包管理器的关键。
go mod init 项目名 PS:项目名不支持中文,中文会报错

老项目初始化

老项目中如果有:vendor/(第三方包管理工具:Glide)文件夹,将其中的文件(glide.yaml和glide.lock, 也有可以是其他的包管理工具)移动到你需要初始化项目的根目录,在使用go mod init 项目名会自动处理成新模式。
详细用法可以看go官方社区的说明:https://learnku.com/docs/go-blog/migrating-to-go-modules/6477

安装库

这里我将那一个go的代码审计工具gosec: github.com/securego/gosec和go日志来示范logrus: github.com/sirupsen/logrus

新版安装库是有两种命令的,他们负责应对不同的情况,go install这个命令建议安装那些有主文件(main.go),下载下来是作为一个xxx.exe存在于bin目录下的,而go get一般用来下载我们项目中调用某个库时使用的命令。(https://segmentfault.com/a/1190000038541867)

使用go install需要注意,必须要在最后加上@版本号,如果想用最新版直接输入@latest即可

  1. go install github.com/securego/gosec/v2/cmd/gosec@latest
    这个命令会下下载需要的库放在pkg目录中,然后在自动生成可执行文件放在bin目录中,之后我们可以用个命令行直接调用下载的这个包。这个命令并不会对我们的go.mod产生影响。
    在这里插入图片描述

  2. go get -u github.com/sirupsen/logrus
    执行这步后会自动拉去我们所需要的各种库,并且会将这些依赖添加到go.mod文件夹中。
    (PS: 这里的-u作用是如果本地已有相关版本则比对本地版本,如果版本不是最新的则下载最新版本到本地使用,如果没有-u的话并且本地已有吃包了就会直接使用本地的包。)
    但有时候加上u会报错,可以尝试去掉-u,之前就碰到过下载gin的时候官方给的go get -u github.com/gin-gonic/gin使用时就报错,但是不加u就好了,不过你可以尝试加个-v查看具体的下载进度go get -v github.com/gin-gonic/gin
    在这里插入图片描述

  3. go get ./... 这个命令会自动将整个项目需要的所有库安装上,类似于yum install或者pip install -r requirements的作用
    在这里插入图片描述
    项目获取完成后推荐在使用: go mod tidy把不需要的库自动删除并整理一下go.mod文件。

go mod命令介绍

命令说明
download下载依赖包
edit编辑go.mod
graph打印模块依赖图
init在当前目录初始化mod
tidy拉取缺少的模块,移除不用的模块
vendor将依赖复制到vendor下
verify验证依赖是否正确
why解释为什么需要依赖

调用库

和大多数语言一样,都是使用 import导入,但是如果使用的是旧版包的话,需要写的路径就是从go的path路径下的src路径开始写,不过旧版有个好处就是支持中文路径,新版包管理器如果写了带中文的路径就会报错。
我当前文件的路径是go的PATH目录/src/go_test/异常处理与文件读取/文件读写/logs/Logrus_test
其中有个文件内容是:(这里导包和文件名关系不大,啥名字都行)

package Logrus_test

import (
	// 如果导入外部包,还是写原来的老路径就可以了
	log "github.com/sirupsen/logrus"
)

func init() {
	log.WithFields(log.Fields{
		"日志": "内容",
	}).Info("测试日志。")
}

如果我们需要导入自己写的包而不是外部包,如果你没用GO111MODULE,就需要写这个包在src目录下的绝对路径。PS:这里的_是指,只导入不调用。我演示的时候这样写比较方便。

package main
import (
	_ "src/go_test/异常处理与文件读取/文件读写/logs/Logrus_test"
)

func main() {}

而如果使用了GO111MODULE则只需要写相对路径,我这里是在logs目录下初始化的所以只需要写下面这样的路径即可,并且如果使用了这个模式,我们go的项目也不需要放到src目录下了,我们可以放到电脑任意的位置上!

package main

import (
	_ "logs/Logrus_test"
)

func main() {}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用GO111MODULE解决go导包难,下包难问题-go如何导包下载包?go包报错如何解决? 的相关文章

  • 四旋翼无人机飞控系统设计(基础知识篇)

    飞行原理 四旋翼的结构组装有十字模式和X模式之分 xff0c 两者的基本原理一致 xff0c 方向结构不同 xff0c 都是通过四个电机的组合状态进行控制姿态飞行 xff0c 而十字型四旋翼机头是对准其中一个电机的 xff0c X型的四旋翼
  • 大数据组件-Maxwell常用命令(持续更新完善)

    Download Download binary distro https github com zendesk maxwell releases download v1 33 0 maxwell 1 33 0 tar gz Sources
  • 【px4编译】make px4fmu-v3_default upload 不能使用

    今天遇到编译pixhawk2代固件无法upload的问题 xff0c 出现TypeError a bytes like object is required not str xff0c 在1代中是可以make upload的 ninja E
  • 【PX4代码】关于px4代码中timestamp与gps_itow的时间问题

    gps的输出频率为5hz xff0c 由此可见timestamp应该是113248090 1e 6转换为s xff0c 由次可见gps的itow时间应该为271998999 1e 3转换为s 总结 px4中的时间为cpu应该除以10 6 x
  • 【PX4代码】关于ekf2输出频率只有1ohz的问题

    问题 我在使用的是pixhawk 2代 imu的输出频率都在100hz以上 xff0c 使用的gps模块输出频率为5hz xff0c 使用log的local position csv 查看ekf2估计输出的点位信息只有10hz xff0c
  • Keil4中C51的debug调试步骤技巧

    1 选择相应的调试仿真连接器 xff1a 选择 xff1a project gt Options for Target 如下图所示 xff1a 然后在弹出对话框的Debug选项下选择仿真器的型号 xff1a 2 进入调试 xff1a 3 部
  • 怎么操作linux服务器

    Linux 服务器就是采用 Linux 系统的网络服务器 xff0c 同时也有采用 windows 的服务器 xff0c 作用是类似的 而 Linux 并不是一个特定的系统 xff0c 而是使用 Linux 内核的系统 xff0c 现在发行
  • 人工智能如何可以思考?

    近日在给同事讲人工智能的时候 xff0c 提到当数据量不够的时候 xff0c 必要时需要加入人工工程 xff0c 引导计算机 归纳 一些知识 xff0c 毕竟计算机智能比起人类智能 xff0c 最大的缺陷可能在于不懂得 举一反三 换句话说
  • bag文件内topic对应的frame_id查看指令

    启动ROS roscore 运行数据集 span class token comment 数据集小的话 xff0c 建议慢速播放 span rosbag play xxx span class token punctuation span
  • GPS数据类型(ROS)

    文章目录 一 传感器分类二 作用三 系统组成四 位置表示五 数据格式六 ROS中GPS数据格式sensor msgs NavSatFixROS中GPS数据主要包含这四类 xff0c 分别是gps 裸数据ros封装 xff0c 位置 xff0
  • cmake使用教程

    CMakeLists txt文档编写以及packsge xml文档介绍 CMakeLists txt文档一 cmake minimum required命令二 CMake中的编译类型三 cmake编译选项 xff08 与2对应 xff09
  • 四旋翼无人机飞控系统设计(闭环控制系统)

    对于一个简单的飞控程序来说 xff0c 控制器是它最核心的部分 xff0c 这里主要与大家讨论控制系统的基本理论知识 xff08 自控大佬请绕道 xff09 xff0c 包括控制系统概念 闭环控制系统的原理 下篇将侧重包含pid控制算法的具
  • 针对frame_id和child_frame_id的理解

    ros基础必看之各个frame的理解 ROS坐标系统 xff0c 常见的坐标系和其含义 ROS中TF 坐标系转换 原理与使用
  • IMU预积分学习

    IMU预积分学习 一 IMU状态传递方程 一 IMU状态传递方程 几种不同的表达形式 xff1a 1 lio mapping xff1a 参考大佬 xff1a lio mapping 及 VINS Mono代码及理论推导 xff08 2 x
  • Python3 内置模块 - os

    方法名说明os access判断文件权限os chdir改变当前工作目录os chmod file 修改文件权限os execvp 启动一个新进程os execvp 执行外部程序脚本 xff08 Uinx xff09 os fork 获取父
  • AttributeError: module 'tornado.web' has no attribute 'asynchronous'解决方法

    AttributeError module tornado web has no attribute 39 asynchronous 解决方法 今天看tornado异步时发现的错误 xff0c 查了一下 xff0c 原来tornado6以后
  • 【STM32项目】- 人体检测(体温、心率、心跳、跌倒检测)

    STM32人体检测 xff08 体温 心率 心跳 跌倒检测 xff09 43 zigbee 笔者前言 在闲鱼有缘结识的一个哥们 xff0c 帮助做的基于STM32人体检测系统 xff0c 我负责硬件程序开发设计 xff0c 哥们负责客户端服
  • ESP32 之 esp32-cam wifi拍照传图系统1

    文章目录 ESP32 之 esp32 cam wifi拍照传图系统1 效果演示2 材料准备3 原理图接线4 下载代码 ESP32 之 esp32 cam wifi拍照传图系统 1 效果演示 2 材料准备 ESP32 camUSB转TTL按钮
  • ESP32 之 esp32-cam wifi拍照传图系统2

    ESP32 之 esp32 cam wifi拍照传图系统 补充说明 ESP32 CAM总结 一 ESP32初识 ESP32 CAM模组的核心芯片 xff1a ESP32 S 模块是一款超小体积的多功能通用型 802 11b g n WiFi
  • 【PX4 飞控二次开发】第一个程序 打印输出-模拟

    第一个程序 1 编写任务代码 Cmake文件2 编译 1 编写任务代码 Cmake文件 span class token operator span span class token operator span PIX4 span clas

随机推荐