两个环境各装各的

(每道题开头都有同一段:parse_ver 把「1.4.0」变成能比大小的元组,satisfies(版本, 约束) 判一个版本满不满足「>=1.4,<2」这种约束,split_req 把「httpkit>=1.4」切成名字

开始练习 →

共用一个环境会怎样

(每道题开头都有同一段:parse_ver 把「1.4.0」变成能比大小的元组,satisfies(版本, 约束) 判一个版本满不满足「>=1.4,<2」这种约束,split_req 把「httpkit>=1.4」切成名字

开始练习 →

补全:环境里有什么

一个环境就是一个 {包: 版本} 的字典。补全 Env:install(name, ver) 装或覆盖,has(name, spec) 判断装的版本满不满足约束,listing() 交回排好序的「名==版本」串。

开始练习 →

补全:把锁装进环境

(每道题开头都有同一段:parse_ver 把「1.4.0」变成能比大小的元组,satisfies(版本, 约束) 判一个版本满不满足「>=1.4,<2」这种约束,split_req 把「httpkit>=1.4」切成名字

开始练习 →

补全:两个环境是否一致

(每道题开头都有同一段:parse_ver 把「1.4.0」变成能比大小的元组,satisfies(版本, 约束) 判一个版本满不满足「>=1.4,<2」这种约束,split_req 把「httpkit>=1.4」切成名字

开始练习 →

构建工具解决什么

改了一个源文件,重做的只有它下游的 另一支一动不动 Make、CMake、setuptools 这类工具,共同解决的问题是【0】。

开始练习 →

凭什么判断该不该重做

Make 决定「这个目标要不要重新生成」,看的是【0】。

开始练习 →

为什么依赖要写全

贯穿 n05 的构建规则(目标 ← 依赖:命令): dist/app.pyz ← build/app.py, build/lib.py : zipapp build -o dist/app.pyz build/app.py ← src/ap

开始练习 →

改了一个文件,重做哪几步

改了一个源文件,重做的只有它下游的 另一支一动不动 (RULES 里每个目标记着它的依赖和命令;stale(目标) 判它要不要重做:目标不存在、或任何一个依赖比它新、或依赖自己就要重做;plan(目标) 按依赖先、目标后的顺序列出要重做的目

开始练习 →

补全:过期了吗

(RULES 里每个目标记着它的依赖和命令;stale(目标) 判它要不要重做:目标不存在、或任何一个依赖比它新、或依赖自己就要重做;plan(目标) 按依赖先、目标后的顺序列出要重做的目标。) 贯穿 n05 的构建规则(目标 ← 依赖:命

开始练习 →