Skip to content

Commit 12c7a7c

Browse files
committed
change design API doc & interface & simple complete roadmap
1 parent 8dbbcf9 commit 12c7a7c

File tree

1 file changed

+54
-18
lines changed

1 file changed

+54
-18
lines changed

milestone1/design-kuro-mod.md

+54-18
Original file line numberDiff line numberDiff line change
@@ -1,30 +1,66 @@
11
# mod设计文档
2-
`github.com/go-kuro/kuro/mod`
2+
3+
`github.com/go-kuro/kuro/mod`
34

45
## 目标
5-
`kuro build`的过程中,解析go.mod和go.sum文件,获取所有涉及到的包,并加载到内存中
66

7-
## 流程
8-
大致流程如下(这里后面找一个图工具):
9-
Step 1.命令
10-
`kuro build`
7+
`kuro build`的过程中,可以通过解析go.mod和go.sum文件,获取所有涉及到的包的物理文件地址(一般为github.com的包地址),
8+
方便后续按需加载(暂时不确定是手动加载还是自动加载)
119

12-
Step 2.绑架`go build`,在`go build`之前,先使用`go mod`流程把所涉及的相关包更新到最新
10+
## 实现思路
1311

14-
Step 3.根据`go mod`包的逻辑,将go.mod文件中涉及的包,以及go.sum中涉及到的对应包的包版本,下载并倒入到内存
12+
分两种情况:
13+
14+
第一种 自动解析go.mod和go.sum
15+
16+
Step 1.检查go files,更新一波go.mod和go.sum文件,看下是否有包漏加;有需要的话,进行一次write in mod
17+
18+
Step 2.解析go.mod和go.sum文件;其中,go.mod主要需要解析path,比如`golang.org/x/text`,go.sum主要解析version
19+
20+
Step 3.用得到的path和version生成`[]Version`
1521

16-
## TODO
17-
1.抽取`go build`中更新go.mod和go.sum的流程,用以更新这两个文件
18-
2.这里有一个小问题
19-
```
20-
在go build的时候,两个文件中对应的包,应该都已经在内存中了,然后才能很好的参与编译<个人猜想>,否则可能会造成package not find问题
21-
```
22-
3.这里提供目前想到的两种实现方式
23-
```
24-
idea 1.截取go build流程中的go mod流程+倒入内存流程
2522
```
23+
type Version struct {
24+
Path string
25+
Version string `json:",omitempty"`
26+
}
2627
```
27-
idea 2.自己根据go mod再造个轮子
28+
29+
Step 4.使用得到的`[]Version`,load对应的包
30+
31+
## API Documentation
32+
33+
参数说明:
34+
35+
`ParseGoMod(cmd kuro.Command, args []string, version *Version)`
36+
37+
cmd:kuro的命令结构体
38+
39+
args:kuro的命令参数
40+
41+
version:是否指定加载某个包的某个版本,为Version结构体的指针
42+
43+
## 接口
44+
45+
粗略的接口实现如下:
46+
2847
```
48+
import "cmd/go/internal/modload"
2949
50+
func ParseGoMod(cmd kuro.Command, args []string, version *Version) {
51+
// 解析go.mod和go.sum文件得到buildList
52+
var buildList []Version
53+
if version == nil || version == &Version{} {
54+
buildList = modload.LoadBuildList()
55+
} else if version.Path != "" {
56+
buildList = []Version{
57+
{Path:version.Path, Version:version.Version}
58+
}
59+
} else {
60+
throw("...")
61+
}
3062
63+
// 改写modget.runGet函数, 主体流程不变
64+
modget.runGet(cmd, args, buildList)
65+
}
66+
```

0 commit comments

Comments
 (0)