索引
概述
clice index 预先为项目构建持久化符号索引,让编辑器会话热启动,而不是在你工作时才在后台建立索引。它用 worker 池运行与服务器相同的索引流程,两者共用 cache_dir 下的索引,每个构建配置各一份。
用法:clice index [--workspace <dir>] [--configuration <tag>] [--jobs <n>] [--json]
一个项目的索引同一时刻只由一个进程写入。编辑器会话打开着该项目时,这一角色由它的服务器担任,因此 clice index 会请服务器执行这轮扫描并等待结果,而不是自己启动一个 worker 池;摘要中会说明这一点。若锁被无法请求的进程持有(另一个 clice index、另一个 clice 构建的服务器),命令最多等它五秒;届时锁仍未释放,命令就会失败并列出持有者——等该进程结束后再重新运行即可。十秒内没有响应的服务器也是如此。
索引过程可中断续跑:用 Ctrl-C 或 SIGTERM(timeout 和 CI 任务时限发送的信号)中断会保存当前进度,下次执行时从中断处继续;只有再按一次 Ctrl-C 才会不保存并立即退出。每五分钟也会保存一次进度,因此崩溃最多损失五分钟的工作。运行期间,无论日志级别如何,每十秒都会向 stderr 输出一行进度;最终在 stdout 输出的摘要会统计已建立索引的翻译单元数、生成的文件分片数和符号数,列出本次运行中每个编译出错的翻译单元及其第一条错误(它的索引保留已解析的部分)、所有索引失败的翻译单元,并在这些之外单独列出即使单独运行也放不进内存的每个翻译单元,附上其 worker 达到的内存占用,还会给出会话日志目录。--json 则改为以单个 JSON 对象输出同一份报告,并附上每个有错翻译单元的全部错误。通过运行中的服务器执行时,摘要及其 JSON 只列出失败的翻译单元,放不进内存的也算在其中。若生成摘要时发现索引数据库已损坏,摘要会以此说明代替各项计数,并丢弃该数据库,以便下次运行时重建索引。索引完整时退出码为 0;部分翻译单元失败或放不进内存、部分索引无法持久化,或者发现数据库已损坏时为 1;无法建立任何索引(没有项目、没有编译数据库或没有翻译单元、索引数据库无法加载、worker 进程无法启动),或者参数无法解析时为 2;中断时为 130。
查看索引
同一条命令的下列操作只读取已持久化的索引,不会改动它。每个操作都输出纯文本行,便于在终端查看或交给 grep 处理;即使编辑器会话正打开着索引,也能正常工作。
clice index stats [--limit <n>]输出索引所含内容的统计信息:翻译单元和文件分片、分片各列及各类存储记录的字节占用明细、符号按引用文件数和名称长度的分布、文件分片按变体数的分布,以及最大的分片。--variants会为每个文件分片追加一行以制表符分隔的记录,给出其变体数,便于比较两次运行的结果。clice index symbol <locator>输出索引中关于定位符所指符号的记录:种类、名称和标志,拼出限定名的父级链,定义它们的文件(若无则为声明它们的文件),以及每个符号在各文件中的定义、声明和引用数量。按名称查找时,会指明完整拼出该名称(Box<int>、ns::Box<int>)且clice query能找到的所有符号;按 id 查找时,即使没有任何文件声明该符号也能指明它,例如命令行上定义的宏。clice index file <path>输出文件的分片:构建它所依据内容的大小和哈希值、每个变体及贡献该变体的翻译单元、按种类统计的关系数量,以及身份只存在于该文件中的文件局部符号。clice index unit <path>输出翻译单元的清单:建立索引的时间、它为每个文件贡献的变体,以及它的包含树。
成功输出时退出码为 0;索引中没有相应的符号、文件或翻译单元时为 1;参数无法解析或无法打开任何索引时为 2。
示例
构建索引
每次运行都会为构建中的所有翻译单元建立索引,规则排除在外的翻译单元除外。
构建索引
为构建中的每个翻译单元建立索引,让编辑器会话热启动
将翻译单元排除在索引之外
设置了 background_index = false 的规则会将匹配的翻译单元排除在外;打开时它们仍会编译
编译数据库列出的每个文件都是一个翻译单元,头文件也不例外:构建中列出的头文件(有些生成器会这样做)会单独编译并建立索引,独立于包含它的源文件。一条匹配 **/*.h 且设置了 background_index = false 的规则可以把这些头文件排除在外。
无法通过编译的翻译单元
建立索引时会列出每个编译出错的翻译单元,并附上它的第一条错误
这类翻译单元照样会建立索引:它的索引保留已解析的部分。
在服务器运行时
编辑器的服务器持有索引时,clice index 会把索引工作交给它。
通过运行中的服务器
编辑器的 clice 服务器运行期间,clice index 和 --fresh 会请该服务器建立索引,而不是在它之外另行建立索引
