github.com/KusionStack/kpm@v0.8.4-0.20240326033734-dc72298a30e5/docs/kcl_mod-zh.md (about) 1 # kcl.mod: KCL 包清单文件 2 3 ## 1. KCL 包清单 4 5 每个模块的 `kcl.mod` 文件都被称为其清单。它采用 TOML 格式编写,包含编译模块所需的元数据。 6 7 目前 `kcl.mod` 中支持如下内容: 8 9 - 包元数据: 10 - [package](#package) - 定义一个包。 11 - [name](#package) — 包的名称。 12 - [version](#package) — 包的版本。 13 - [edition](#package) — KCL 编译器版本。 14 - 依赖表: 15 - [dependencies](#dependencies) - 包库依赖项。 16 - 编译器设置: 17 - [profile](#entries) - 编译器设置。 18 - [entries](#entries) - 编译包的入口点。 19 20 ## 2. package 21 `kcl.mod` 中的第一个部分是 `[package]`。主要包含 `name`, `version` 和 `edition` 三个字段。 22 23 ### 2.1. name 24 `name` 是包的名称,它是一个字符串, 这是一个必要的字段, 注意,包的名称中不可以包含`"."`。 25 26 例如: 一个包名为 my_pkg 的 kcl 程序包。 27 ``` 28 [package] 29 name = "my_pkg" 30 ``` 31 32 ### 2.2. version 33 `version` 是包的版本,它是一个字符串, 这是一个必要的字段。注意,目前 KCL 程序包的版本号仅支持语义化版本号。 34 35 例如: `my_pkg` 程序包的版本号为 `0.1.0`。 36 ``` 37 [package] 38 name = "my_pkg" 39 version = "0.1.0" 40 ``` 41 42 ### 2.3. edition 43 `edition` 是 KCL 编译器版本,它是一个字符串, 这是一个必要的字段。注意,目前 KCL 编译器版本号仅支持语义化版本号。 44 45 例如: `my_pkg` 程序包的版本号为 `0.1.0`, 并且与 0.5.1 的 KCL 编译器兼容。 46 ``` 47 [package] 48 name = "my_pkg" 49 version = "0.1.0" 50 edition = "0.5.0" 51 ``` 52 53 ## 3. dependencies 54 55 你的 kcl 包可以依赖于来自 OCI 仓库、Git 存储库或本地文件系统子目录的其他库。 56 57 ### 3.1. oci dependency 58 59 kpm 默认将包保存在 oci registry 上,默认使用的 oci registry 是 `ghcr.io/kcl-lang`。 60 更多内容关于 oci registry 请参考 [kpm 支持 OCI registry](./docs/kpm_oci-zh.md)。 61 62 你可以按照以下方式指定依赖项: 63 64 ```toml 65 [dependencies] 66 <package name> = <package_version> 67 ``` 68 69 这将会从 oci registry 中拉取名称为 `<package name>` 的包,版本为 `<package_version>`。 70 71 如果您希望拉取 `k8s` 包的 `1.27` 版本: 72 73 ```toml 74 [dependencies] 75 k8s = "1.27" 76 ``` 77 78 ### 3.2. git dependency 79 80 从 Git 存储库指定依赖项: 81 ``` 82 [dependencies] 83 <package name> = { git = "<git repo url>", tag = "<git repo tag>" } 84 ``` 85 86 这将会从 Git 存储库`<git repo url>`中拉取名称为 `<package name>` 的包,`tag` 为 `<git repo tag>`。 87 88 ## 4. entries 89 90 你可以在编译时指定包的入口点。 91 92 `entries` 是 `[profile]` 部分的子部分。entries 是一个字符串数组,包含编译器的入口点。这是一个可选的字段,如果没有指定,则默认为包根目录下的所有 `*.k` 文件。 93 94 ```toml 95 [profile] 96 entries = [ 97 ... 98 ] 99 ``` 100 101 entries 中可以定义绝对路径和相对路径,如果定义的是相对路径,那么就会以当前包的 102 103 `entries` 是 kcl 包根路径的相对路径,`kcl.mod` 文件路径是包的根路径。支持两种文件路径格式,即 `normal paths` 和 `mod relative paths`。 104 105 - normal path:相对于当前包的根路径。 106 - mod relative path:相对于 kcl.mod 中 [dependencies](#dependencies) 部分中的三方包的根路径。 107 108 例如: 109 1. 如果 `kcl.mod` 位于 `/usr/my_pkg/kcl.mod`,则 `kpm run` 将把 `/usr/my_pkg/entry1.k` 和 `/usr/my_pkg/subdir/entry2.k` 作为 `kcl` 编译器的入口点。 110 111 ``` 112 entries = [ 113 "entry1.k", 114 "subdir/entry2.k", 115 ] 116 ``` 117 118 2. 如果 `kcl.mod` 位于 `/usr/my_pkg/kcl.mod`,并且当前 `kcl` 包依赖于 `kcl` 包 `k8s`。你可以使用 `mod relative paths` 将来自包 `k8s` 中的 `kcl` 文件作为 `kcl` 编译器的入口点。 119 120 ``` 121 entries = [ 122 "entry1.k", 123 "subdir/entry2.k", 124 "${k8s:KCL_MOD}/core/api/v1/deployment.k" 125 ] 126 ``` 127 128 `mod relative paths` 必须包含前缀 `${k8s:KCL_MOD}`,其中 `k8s` 是包名,`${k8s:KCL_MOD}` 表示包 k8s 的包根路径。因此,如果 `k8s` 的包根路径是 `/.kcl/kpm/k8s`,则上面的 `entries` 将把 `/usr/my_pkg/entry1.k`、`/usr/my_pkg/subdir/entry2.k` 和 `/.kcl/kpm/k8s/core/api/v1/deployment.k` 作为 `kcl` 编译器的入口点。 129 130 ### 注意 131 你可以使用 `normal path` 指定当前包路径中的编译入口点,使用 `mod relative path` 指定三方包中的入口点。 132 133 因此,使用 `normal path` 制定的文件路径必须来自于同一个包,即从 `normal path` 开始寻找的 `kcl.mod` 路径必须只能找到一个 `kcl.mod` 文件,不然编译器将输出错误。 134 135 例如: 136 137 在路径 `/usr/kcl1` 下 138 ``` 139 /usr/kcl1 140 |--- kcl.mod 141 |--- entry1.k 142 ``` 143 144 在路径 `/usr/kcl2` 下 145 ``` 146 /usr/kcl2 147 |--- kcl.mod 148 |--- entry2.k 149 ``` 150 151 如果你在路径`/usr/kcl1`下使用这样的 kcl.mod 编译: 152 ``` 153 entries = [ 154 "entry1.k", # 对应的 kcl.mod 文件是 /usr/kcl1/kcl.mod 155 "/usr/kcl2/entry2.k", # 对应的 kcl.mod 文件是 /usr/kcl2/kcl.mod 156 ] 157 ``` 158 159 将会得到错误: 160 ``` 161 error[E3M38]: conflict kcl.mod file paths 162 ```