Skip to content

Commit fc8641e

Browse files
committed
update
1 parent 9ea6475 commit fc8641e

File tree

3 files changed

+177
-0
lines changed

3 files changed

+177
-0
lines changed

README.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -46,6 +46,7 @@
4646
* [3.3 开源发布:如何开源自己写的包给别人用?](https://golang.iswbm.com/c03/c03_03.html)
4747
* [3.4 代码规范:Go语言中编码规范](https://golang.iswbm.com/c03/c03_04.html)
4848
* [3.5 编译流程:结合 Makefile 简化编译过程](https://golang.iswbm.com/c03/c03_05.html)
49+
* [3.6 依赖管理:好用的工作区模式](https://golang.iswbm.com/c03/c03_06.html)
4950
- **第四章:并发编程**
5051
* [4.1 学习 Go 函数:理解 Go 里的函数](https://golang.iswbm.com/c04/c04_01.html)
5152
* [4.2 学习 Go 函数:函数类型是什么?](https://golang.iswbm.com/c04/c04_02.html)

source/c03/c03_06.md

Lines changed: 80 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,80 @@
1+
# 3.6 依赖管理:好用的工作区模式
2+
3+
对我来说,Go1.18 最 "实用" 的功能,应该是 Go 工作区模式,本篇来介绍一下
4+
5+
若要使用 workspace mode,请升级到 Go 1.18 版本再体验。
6+
7+
## 1. 诞生背景
8+
9+
在介绍 **工作区模式** (workspace mode)之前,先简单地说一下工作区诞生的背景,只有了解了痛点之后,学习一个新的知识点,才更有动力。
10+
11+
我在 `$GOPATH/src` 目录下创建 github.com/iswbm/demo 及 github.com/iswbm/util 两个空的 go 包
12+
13+
![](https://image.iswbm.com/image-20220322220501276.png)
14+
15+
然后分别使用 go mod init 来初始化
16+
17+
```bash
18+
$ cd github.com/iswbm/demo
19+
$ go mod init github.com/iswbm/demo
20+
21+
$ cd ../util
22+
$ go mod init github.com/iswbm/util
23+
```
24+
25+
并在 demo 中写入 main.go,在 util 写入 util.go ,内容如下
26+
27+
![](https://image.iswbm.com/image-20220322221831959.png)
28+
29+
我们都知道,正常 Go 项目中引用的包,都需要在对应代码托管网站上有该包,才能编译及运行。
30+
31+
但如果 demo 引用 util 项目的包,而 util 本身也还在自己的本地上开发,并没有上传到 github,那么 demo 包在调试过程中肯定是无法找到 util 包的。
32+
33+
在没有工作区的情况下(也即 Go 1.18 之前),可以通过在 go.mod 中使用 replace 来重定向
34+
35+
```
36+
module github.com/iswbm/demo
37+
38+
go 1.17
39+
40+
require github.com/iswbm/util v1.0.0
41+
42+
replace github.com/iswbm/util => ../util
43+
```
44+
45+
修改完 go.mod 后,运行正常输出
46+
47+
![](https://image.iswbm.com/image-20220322222603718.png)
48+
49+
可使用 replace 存在两个问题:
50+
51+
- replace 本身编辑就比较麻烦,我一直是手动编辑的
52+
- 开发完成后,还要记得将 replace 删除,并执行 go mod tidy ,否则别人就无法使用
53+
54+
## 2. 工作区模式
55+
56+
Go 1.18 提供的工作区模式,就可以优雅的解决如上出现的问题。
57+
58+
上面我使用的是 go 1.17 初始化的项目,现在要用 go 1.18 的工作区模式,因此先将 go.mod 里的 go 版本改为 go 1.18,并都所有的依赖全部删除。
59+
60+
![](https://image.iswbm.com/image-20220322223743922.png)
61+
62+
然后退回到 `$GOPATH/src` 目录,执行如下命令创建工作区文件 go.work
63+
64+
```
65+
go18 work init github.com/iswbm/demo github.com/iswbm/util
66+
```
67+
68+
创建的 go.work 文件如下所示
69+
70+
![](https://image.iswbm.com/image-20220322223259439.png)
71+
72+
然后无论我在哪个目录下,只要所在位置的父级目录有 go.work 文件,即处于该工作区内,go 的编译器都会自动引用本地的 util 包
73+
74+
![](https://image.iswbm.com/image-20220322223533042.png)
75+
76+
## 3. 写在最后
77+
78+
有了工作区模式,将使整个开发流程更加流畅,个人认为这可能是 go1.18 最为实用的功能,强烈推荐大家使用起来~
79+
80+
另外 go.work 文件是工作区的标志,该文件不用上传至 github,只用于本地开发测试使用。

source/c03/c03_06.rst

Lines changed: 96 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,96 @@
1+
3.6 依赖管理:好用的工作区模式
2+
==============================
3+
4+
对我来说,Go1.18 最 “实用” 的功能,应该是 Go 工作区模式,本篇来介绍一下
5+
6+
若要使用 workspace mode,请升级到 Go 1.18 版本再体验。
7+
8+
1. 诞生背景
9+
-----------
10+
11+
在介绍 **工作区模式** (workspace
12+
mode)之前,先简单地说一下工作区诞生的背景,只有了解了痛点之后,学习一个新的知识点,才更有动力。
13+
14+
我在 ``$GOPATH/src`` 目录下创建 github.com/iswbm/demo 及
15+
github.com/iswbm/util 两个空的 go 包
16+
17+
.. image:: https://image.iswbm.com/image-20220322220501276.png
18+
19+
然后分别使用 go mod init 来初始化
20+
21+
.. code:: bash
22+
23+
$ cd github.com/iswbm/demo
24+
$ go mod init github.com/iswbm/demo
25+
26+
$ cd ../util
27+
$ go mod init github.com/iswbm/util
28+
29+
并在 demo 中写入 main.go,在 util 写入 util.go ,内容如下
30+
31+
.. image:: https://image.iswbm.com/image-20220322221831959.png
32+
33+
我们都知道,正常 Go
34+
项目中引用的包,都需要在对应代码托管网站上有该包,才能编译及运行。
35+
36+
但如果 demo 引用 util 项目的包,而 util
37+
本身也还在自己的本地上开发,并没有上传到 github,那么 demo
38+
包在调试过程中肯定是无法找到 util 包的。
39+
40+
在没有工作区的情况下(也即 Go 1.18 之前),可以通过在 go.mod 中使用
41+
replace 来重定向
42+
43+
::
44+
45+
module github.com/iswbm/demo
46+
47+
go 1.17
48+
49+
require github.com/iswbm/util v1.0.0
50+
51+
replace github.com/iswbm/util => ../util
52+
53+
修改完 go.mod 后,运行正常输出
54+
55+
.. image:: https://image.iswbm.com/image-20220322222603718.png
56+
57+
可使用 replace 存在两个问题:
58+
59+
- replace 本身编辑就比较麻烦,我一直是手动编辑的
60+
- 开发完成后,还要记得将 replace 删除,并执行 go mod tidy
61+
,否则别人就无法使用
62+
63+
2. 工作区模式
64+
-------------
65+
66+
Go 1.18 提供的工作区模式,就可以优雅的解决如上出现的问题。
67+
68+
上面我使用的是 go 1.17 初始化的项目,现在要用 go 1.18
69+
的工作区模式,因此先将 go.mod 里的 go 版本改为 go
70+
1.18,并都所有的依赖全部删除。
71+
72+
.. image:: https://image.iswbm.com/image-20220322223743922.png
73+
74+
然后退回到 ``$GOPATH/src`` 目录,执行如下命令创建工作区文件 go.work
75+
76+
::
77+
78+
go18 work init github.com/iswbm/demo github.com/iswbm/util
79+
80+
创建的 go.work 文件如下所示
81+
82+
.. image:: https://image.iswbm.com/image-20220322223259439.png
83+
84+
然后无论我在哪个目录下,只要所在位置的父级目录有 go.work
85+
文件,即处于该工作区内,go 的编译器都会自动引用本地的 util 包
86+
87+
.. image:: https://image.iswbm.com/image-20220322223533042.png
88+
89+
3. 写在最后
90+
-----------
91+
92+
有了工作区模式,将使整个开发流程更加流畅,个人认为这可能是 go1.18
93+
最为实用的功能,强烈推荐大家使用起来~
94+
95+
另外 go.work 文件是工作区的标志,该文件不用上传至
96+
github,只用于本地开发测试使用。

0 commit comments

Comments
 (0)