在大多数Python项目里有一个文件, 所有人都做了,没有人读过, 两年来,我们的人悄悄地对我们撒谎。
如果你曾经想过如何生成一个反映你实际需要的代码, 而不是每个游入你虚拟env的流浪包, 这是我如何最终不再相信那份工作,转而接受的故事。
我们的文件从214套到23套,老实说,更大的解脱是情感上的:我终于可以打开它,相信它告诉我的.
为什么这个窃听了我好几年 每个Python工程师都知道仪式 完成一个功能,运行,承诺,前进。
它的工作原理。
直到它没有。
我们的已经变形了 新的员工打开了公关, 并问到代码审查中最无辜的问题:“为什么这个API服务依赖于, 它没有。
这些工具是几个月前 某个人进入了共享的阴道 从未被移除 毫不在意你输入的密码 它能描绘环境中的所有东西 我们所谓的真相来源是百分之九十的噪音,我一直盯着它看 这么久,我不再看到它。
这种噪音并不是无害的,而正是这种噪音最终促使我采取行动。
Docker building crawed, 因为所有的 214 套件都得到了解析和安装在每个冷建筑上.
我们的弱点扫描仪 在图书馆里对CVES大惊小怪 我们从未进口过 更糟糕的是,没有人知道哪些依赖是真实的, 所以没有人敢删除其中任何一个。
最后一个是静悄悄的杀手 一个不值得信任的档案 (我看过同样的恐惧冻结 遗留测试套房, 所以我立刻认出了味道) 所以我去寻找一个更好的方法 生成这个东西, 我犯罪时没有使用的工具是, 在它的 GitHub README 中,他的一行投注是“根据任何项目的进口来生成 pip 要求.txt 文件” —— 和它所做的完全相反。
公平地说,我不希望 垃圾,因为它不是错的 - 它只是回答一个不同的问题 比我问。
官方的 pip docs 对此很生动地直言不讳:它"报告所安装的东西;它不计算一个锁文件或一个解答结果".
它回答"这里安装的东西",而不是"这个代码需要什么".
在纯正的,单目的虚拟env 这两套是相同的。
在一个真实的,长生不老的环境里,它们会以令人尴尬的速度分道扬镳.
峡谷流正是你所期望的: 如果你的阴道是干净的,专用于一个项目, 这才是真正的正确工具—— 它捕捉了所有东西的准确版本, 这正是你想要的 一个完全可复制的环境。
我们的问题只是我们的VENV变成了垃圾抽屉, 我们一直在使用抽屉的库存工具来描述购物清单。
最终点击的东西采取了相反的方法,一旦我明白了,我感到有点傻,不能早点切换.
它静态地解析您的文件,找到实际的语句,将其映射到PyPI软件包,并且只写这些.
整个顺序如下: 仅是当前目录 - 移动它,读取导入, 并发送一个只包含库 您的代码真正触及。
README 记录了值得知道的旗帜:在别处写作,倾出到 stdout,以及将已有的文件与项目的真实进口进行比较.
这就是整个变化。
生成的文件从214行变为23行 - 同样的23个套件,应用程序一直导入,现在终于成为了文件中唯一的23个.
回报比我想的要快 最终的多克图像大致减半,从1.3GB左右下降到600 MB稍多.
CI的感冒从近三分钟到不到一分钟。
我们的扫描仪对依赖性的发现从31降至6, 而现在这6个中的每一个都是一个我们实际使用的包裹, 这意味着我们实际上可以对它们进行分解。
并第一次,"我能删除这种依赖性?" 成为一个问题 一个答案英寸