Golang环境配置以及GOPATH与gomod的关系

概述

本文主要涉及:Go 环境配置+为什么要设置GOPATH和GOMod

如果只对上述感兴趣,建议直接看正文。

起因

在看一个Go的框架时,发现同一个命令 go install server在公司没问题,在家里就只能在项目目录下跑,在GOPATH目录下,总报一个can't load package: package hello: cannot find package错误。虽然已经可以在项目下install出来,但是这丁点差别实在是太让人难受。

排查

搜了无数的博客,把各种环境变量GOPATH,GOROOT,GOBIN 设置了一遍,最后还是在两篇官方文档里面找到了答案——自己混用了GOPATH和Go Mod。公司用的是GOPATH,家里用的Go mod

GOPATH设置教程
Go Mod设置教程,需要go版本在1.13以后 (推荐)后文讲为什么

正文

有时间还是强烈建议看一下官方教程。下文只是我个人的总结。不一定对。

golang环境配置

官网 下载安装完事。

几个常用的环境变量

GOPATH: //go 的工作目录
GOROOT://go 的安装目录
GOBIN://go 的bin文件目录
GO111MODULE: //go mod 开关 on为开启go mod

GOPROXY=https://goproxy.cn,direct // https://goproxy.cn,direct 国内代理

因为国内墙的缘故,需要设置代理 go env -w GOPROXY https://goproxy.cn,direct这样在Vscode安装package时就不会失败。

根据个人情况使用GOPATH配置方式 或Go mod模式

GOPATH

GOPATH是早期的设置方式,将工作目录设置GOPATH到全局环境变量。设置教程 目录结构如下图:

bin/
    hello                          # command executable
    outyet                         # command executable
src/
    github.com/golang/example/
        .git/                      # Git repository metadata
	hello/
	    hello.go               # command source
	outyet/
	    main.go                # command source
	    main_test.go           # test source
	stringutil/
	    reverse.go             # package source
	    reverse_test.go        # test source
    golang.org/x/image/
        .git/                      # Git repository metadata
	bmp/
	    reader.go              # package source
	    writer.go              # package source
    ... (many more repositories and packages omitted) ...

也就是说所有的项目都在src下面。不同的项目都在GOPATH/src/下。很显然这种设置方法是不太方便的,因为不同项目引用的package到放到了一起,这用git管理起来很麻烦,比如A项目引用了a,b两个package,B项目引用了c,d两个package,那么如果我在A中修改了package的内容,我提交A项目时想要带着package时就很麻烦。

其次是GOPATH需要设置全局环境变量,很多新手在对这些不熟悉的时候,很容易出错。项目名也必须不同。否则无法区分。

这也是为什么我在公司里时可以在GOPATH目录下进行go install server正如官方文档里面写的

​ Note that you can run this command from anywhere on your system. The go tool finds the source code by looking for the github.com/user/hello package inside the workspace specified by GOPATH.

为什么可以在anywhere呢,因为你的项目目录其实是被定死了,所以只要你有server这个项目go tool肯定可以找到。

Go mod

go mod 正是为了解决上述问题(并不单单是上述问题,还有依赖引用问题)。在1.13以后开始推行。因为没多长时间,所以现在网络上的教程两种版本的都有,很容易混淆。

go mod可以完全替代GOPATH设置。只需要go env -w GO111MODULE=on开启go mod

bin/
    hello                          # command executable
    outyet                         # command executable
src/
    myproject/server.go

进入到myproject 执行 go mod init myproject

就会创建出一个go.mod文件。在该目录下执行go mod install myproject即可生成bin文件。这样不同的项目就不要放到一起了,只需要一个gomod文件就可以管理包依赖。项目管理也会更加方便。

这也引出了为什么我在GOPATH目录下无法install,因为我在家里使用的是gomod模式。项目的路径并不是唯一的,所以他也不能在anywhere来执行go mod install myproject正如他教程原文写的:

Commands like go install apply within the context of the module containing the current working directory. If the working directory is not within the example.com/user/hello module, go install may fail.

这时你会发现如果你需要经常测试的话,需要经常在Bin和project目录来切换。官方为了解决这个问题。官方的建议是把Bin目录加到环境变量中,这样便可以在一个目录下,install && run。原文:

For convenience, go commands accept paths relative to the working directory, and default to the package in the current working directory if no other path is given. So in our working directory, the following commands are all equivalent:

$ go install example.com/user/hello
$ go install .
$ go install

Next, let’s run the program to ensure it works. For added convenience, we’ll add the install directory to our PATH to make running binaries easy:

# Windows users should consult https://github.com/golang/go/wiki/SettingGOPATH
# for setting %PATH%.
$ export PATH=$PATH:$(dirname $(go list -f '{{.Target}}' .))
$ hello
Hello, world.
$

吐槽

先吐槽自己,自己真的是懒,命名官方文档写的那么清楚,按照官方的教程操作一遍,也就半个小时,就能清楚理解所有。结果自己就懒的把这块研究清楚,就想图一个“快”。

为了图“快”第一次就用的goland,环境这块goland全帮你做了。以至于压根没搞清这些概念也没耽误自己把第一个server撸出来。要不是因为goland的破解过段时间就过期,每次在网上找破解烦的要死,我也不会想着在vscode上重新搭建一下环境。

为了图“快”草草的在国内搜索“Golang VSCode环境配置”,配置完后只是知其然不知其所以然。压根没弄明白go mod,gopath 的区别。这也导致了上文的错误。

欲速则不达,古人诚不我欺。

再吐槽国内的一些博客主,博客要么就不写,要么就稍微认真一点,不说写的多么好,对别人有多大帮助,起码要认真把。发现很多博客就起个名字,内容就一行“转载于XXXXXX”。我明白他本人可能就是想存个出签方便自己下次来找,但这无疑是给网络中丢垃圾,每次进到这种博客,内心都是十万个草泥马在奔腾 。如果只是给自己看,那网易云笔记他不香嘛。既然是分享就是让别人看的啊。又不能靠这点流量和点击换钱。网络环保也是环保啊。


辣椒酱 2020.7.7

更多精彩内容都在我自己的博客

  • 34
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: web.ignoring().antMatchers()是Spring Security中的一种配置方式,用于忽略某些URL的安全性检查。其中,ignoring()方法表示忽略某些URL,而antMatchers()方法则指定了需要忽略的URL的匹配规则。具体来说,antMatchers()方法可以接受一个或多个URL模式,用于匹配需要忽略的URL。例如,antMatchers("/public/**")表示忽略所有以/public/开头的URL。 ### 回答2: 在使用Spring Security框架进行Web应用程序的安全配置时,`.ignoring().antMatchers()`是一种用于忽略特定URL或路径的方法。 `.antMatchers()`是一个用于匹配URL或路径的方法。我们可以使用`.antMatchers()`来指定一组URL或路径的模式,并将其与当前请求的URL进行匹配。如果请求的URL与任何一个`.antMatchers()`指定的模式匹配成功,该URL将被认为是匹配的,并相应地进行安全处理。 `.ignoring()`则用于告诉Spring Security框架在处理匹配上述`.antMatchers()`的URL时忽略相关的安全配置。这意味着,即使请求的URL匹配成功,Spring Security也不会对该URL进行安全验证或拦截。 通常,我们使用`.ignoring().antMatchers()`来配置一些不需要进行安全验证或拦截的URL或路径。这些URL可能是一些静态资源文件,例如CSS、JavaScript或图像文件等,或者是一些公开访问的页面或API。 例如,我们可以使用以下代码来忽略所有静态资源文件的安全验证: ``` @Override public void configure(WebSecurity web) throws Exception { web.ignoring().antMatchers("/css/**", "/js/**", "/images/**"); } ``` 这样,所有以`/css/`、`/js/`或`/images/`开头的URL路径将被忽略安全验证。对于这些URL,Spring Security将允许访问而不进行任何额外的安全处理。 总而言之,`.ignoring().antMatchers()`是一种在Spring Security中用于忽略URL或路径,从而避免进行安全验证和拦截的方法。 ### 回答3: web.ignoring() .antMatchers实际上是Spring Security框架中用于配置忽略某些特定请求路径的方法。在WebSecurityConfigurerAdapter配置类的configure方法中,可以使用这个方法来指定一些URL路径忽略安全控制。 web.ignoring()方法中的.antMatchers()用于指定要忽略的路径,可以使用Ant风格的路径匹配方式来匹配多个URL路径模式。路径模式可以使用通配符*来表示任意字符或者?来表示一个字符。 例如,如果我们想要忽略对所有以/static/开头的URL进行安全控制,可以使用web.ignoring().antMatchers("/static/**")来实现。这样配置后,访问以/static/开头的URL时,将不会触发Spring Security的认证和授权流程。 这个方法常用于配置一些静态资源路径,比如CSS、JS、图片等,或者是一些公开的API接口路径,不需要进行身份验证和权限校验的路径。 需要注意的是,忽略路径的配置应该放在其他需要进行安全控制的配置之前,这样才能确保这些路径被正确地忽略掉。 总之,web.ignoring().antMatchers()的作用是配置Spring Security框架忽略某些特定请求路径,不对其进行安全控制。通过这个方法可以细粒度地控制哪些路径需要安全控制,哪些路径可以被忽略。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值