Skip to content

Commit

Permalink
fix: fix CR comments
Browse files Browse the repository at this point in the history
  • Loading branch information
zong-zhe committed Aug 15, 2023
1 parent dc0e8e4 commit 580db96
Show file tree
Hide file tree
Showing 2 changed files with 117 additions and 25 deletions.
104 changes: 85 additions & 19 deletions docs/kcl_mod-zh.md
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
# kcl.mod: KCL 包清单文件

## KCL 包清单
## 1. KCL 包清单

每个模块的 `kcl.mod` 文件都被称为其清单。它采用 TOML 格式编写,包含编译模块所需的元数据。

Expand All @@ -10,51 +10,86 @@
- [package](#package) - 定义一个包。
- [name](#package) — 包的名称。
- [version](#package) — 包的版本。
- [edition](#package)KCLVM 版本
- [edition](#package)KCL 编译器版本
- 依赖表:
- [dependencies](#dependencies) - 包库依赖项。
- 编译器设置:
- [profile](#entries) - 编译器设置。
- [entries](#entries) - 编译包的入口点。

## package
`kcl.mod` 中的第一个部分是 `[package]`
## 2. package
`kcl.mod` 中的第一个部分是 `[package]`主要包含 `name`, `version``edition` 三个字段。

### 2.1. name
`name` 是包的名称,它是一个字符串, 这是一个必要的字段, 注意,包的名称中不可以包含`"."`

例如: 一个包名为 my_pkg 的 kcl 程序包。
```
[package]
name = "my_pkg"
```

### 2.2. version
`version` 是包的版本,它是一个字符串, 这是一个必要的字段。注意,目前 KCL 程序包的版本号仅支持语义化版本号。

例如: `my_pkg` 程序包的版本号为 `0.1.0`
```
[package]
name = "my_pkg"
version = "0.1.0"
```

### 2.3. edition
`edition` 是 KCL 编译器版本,它是一个字符串, 这是一个必要的字段。注意,目前 KCL 编译器版本号仅支持语义化版本号。

例如: `my_pkg` 程序包的版本号为 `0.1.0`, 并且与 0.5.1 的 KCL 编译器兼容。
```
[package]
name = "hello_world" # 包的名称
version = "0.1.0" # 当前版本,遵循 semver 规范
edition = "0.1.1-alpha.1" # KCL 编译器版本
[package]
name = "my_pkg"
version = "0.1.0"
edition = "0.5.0"
```

## dependencies
## 3. dependencies

你的 kcl 包可以依赖于来自 OCI 仓库、Git 存储库或本地文件系统子目录的其他库。

### 3.1. oci dependency

kpm 默认将包保存在 oci registry 上,默认使用的 oci registry 是 `ghcr.io/kcl-lang`
更多内容关于 oci registry 请参考 [kpm 支持 OCI registry](./docs/kpm_oci-zh.md)

你可以按照以下方式指定依赖项:

```toml
[dependencies]
<package name> = <package_version>
```

你可以从 Git 存储库指定依赖项:
```
这将会从 oci registry 中拉取名称为 `<package name>` 的包,版本为 `<package_version>`

如果您希望拉取 `k8s` 包的 `1.27` 版本:

```toml
[dependencies]
<package name> = { git = "<git repo url>", tag = "<git repo tag>" }
k8s = "1.27"
```

你可以从本地文件路径指定依赖项:
### 3.2. git dependency

从 Git 存储库指定依赖项:
```
[dependencies]
<package name> = {path = "<package local path>"}
<package name> = { git = "<git repo url>", tag = "<git repo tag>" }
```

## entries
这将会从 Git 存储库`<git repo url>`中拉取名称为 `<package name>` 的包,`tag``<git repo tag>`

## 4. entries

你可以在编译时指定包的入口点。

`entries``[profile]` 部分的子部分。
`entries``[profile]` 部分的子部分。entries 是一个字符串数组,包含编译器的入口点。这是一个可选的字段,如果没有指定,则默认为包根目录下的所有 `*.k` 文件。

```toml
[profile]
Expand All @@ -63,10 +98,12 @@ entries = [
]
```

entries 中可以定义绝对路径和相对路径,如果定义的是相对路径,那么就会以当前包的

`entries` 是 kcl 包根路径的相对路径,`kcl.mod` 文件路径是包的根路径。支持两种文件路径格式,即 `normal paths``mod relative paths`

- normal path:路径相对于当前包的根路径
- mod relative path:路径相对于可以在 kcl.mod 文件的 [dependencies](#dependencies) 部分中的三方包的根路径。
- normal path:相对于当前包的根路径
- mod relative path:相对于 kcl.mod [dependencies](#dependencies) 部分中的三方包的根路径。

例如:
1. 如果 `kcl.mod` 位于 `/usr/my_pkg/kcl.mod`,则 `kpm run` 将把 `/usr/my_pkg/entry1.k``/usr/my_pkg/subdir/entry2.k` 作为 `kcl` 编译器的入口点。
Expand All @@ -93,4 +130,33 @@ entries = [
### 注意
你可以使用 `normal path` 指定当前包路径中的编译入口点,使用 `mod relative path` 指定三方包中的入口点。

因此,使用 `normal path` 指定来自不同包的入口点时,必须包含在当前包路径中。如果你使用 `normal path` 指定来自不同包的入口点,kcl 编译器将报告错误。
因此,使用 `normal path` 制定的文件路径必须来自于同一个包,即从 `normal path` 开始寻找的 `kcl.mod` 路径必须只能找到一个 `kcl.mod` 文件,不然编译器将输出错误。

例如:

在路径 `/usr/kcl1`
```
/usr/kcl1
|--- kcl.mod
|--- entry1.k
```

在路径 `/usr/kcl2`
```
/usr/kcl2
|--- kcl.mod
|--- entry2.k
```

如果你在路径`/usr/kcl1`下使用这样的 kcl.mod 编译:
```
entries = [
"entry1.k", # 对应的 kcl.mod 文件是 /usr/kcl1/kcl.mod
"/usr/kcl2/entry2.k", # 对应的 kcl.mod 文件是 /usr/kcl2/kcl.mod
]
```

将会得到错误:
```
error[E3M38]: conflict kcl.mod file paths
```
38 changes: 32 additions & 6 deletions docs/kcl_mod.md
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@ In the MVP version, the sections we plan to support are as follows:
- [package](#package) - Defines a package.
- [name](#package) — The name of the package.
- [version](#package) — The version of the package.
- [edition](#package) — The KCLVM edition.
- [edition](#package) — The KCL compiler edition.
- Dependency tables:
- [dependencies](#dependencies) - Package library dependencies.
- Compiler settings:
Expand All @@ -24,11 +24,9 @@ The first section in a `kcl.mod` is [package].
[package]
name = "hello_world" # the name of the package
version = "0.1.0" # the current version, obeying semver
edition = "0.1.1-alpha.1" # the kclvm version
edition = "0.5.0" # the KCL compiler version
```

The only fields required by `kpm` are `name` and `version`. `edition` is an optional field that describes the version of kclvm being used. If not specified, the latest version will be selected by default.

## dependencies

Your kcl package can depend on other libraries from OCI registries, git repositories, or subdirectories on your local file system.
Expand Down Expand Up @@ -96,7 +94,35 @@ entries = [
The `mod relative paths` must contains the preffix `{k8s:KCL_MOD}`, `k8s` is the package name, `{k8s:KCL_MOD}` means the package root path of the package `k8s`. Therefore, if the package root path of `k8s` is `/.kcl/kpm/k8s`, the `entries` show above will take `/usr/my_pkg/entry1.k`, `/usr/my_pkg/subdir/entry2.k` and `/.kcl/kpm/k8s/core/api/v1/deployment.k` as the entry point of the kcl compiler.

### Note
You can use `normal path` to specify the compilation entry point in the current package path, and use `mod relative path` to specify the entry point in a third-party package.

Therefore, the file path specified by `normal path` must come from the same package, that is, the `kcl.mod` path found from the normal path must only find one `kcl.mod` file, otherwise the compiler will output an error.

For example:

In the path `/usr/kcl1`:
```
/usr/kcl1
|--- kcl.mod
|--- entry1.k
```

You can specify the compiling entry points in current package path by `normal path` and the entry points in vendor packages by `mod relative path`.
In the path `/usr/kcl2`:
```
/usr/kcl2
|--- kcl.mod
|--- entry2.k
```

Therefore, the `entries` specified by `normal path` must be included in the current package path. If you use `normal path` to specify the entry points from different packages, the kcl compiler will report an error.
If you compile with this `kcl.mod` in the path `/usr/kcl1`:
```
entries = [
"entry1.k", # The corresponding kcl.mod file is /usr/kcl1/kcl.mod
"/usr/kcl2/entry2.k", # The corresponding kcl.mod file is /usr/kcl2/kcl.mod
]
```

You will get an error:
```
error[E3M38]: conflict kcl.mod file paths
```

0 comments on commit 580db96

Please sign in to comment.