当前位置: 首页 > 科技观察

别再用Requirements.txt管理依赖了

时间:2023-03-17 17:20:25 科技观察

刚开始用requirements.txt的时候是在虚拟环境下,用pipfreeze>requirements.txt把项目中的依赖导出到txt文件,然后上传到GitHub,别人在使用项目的时候可以pipinstall-rrequirements.txt,很方便不是吗?然而,这种管理依赖关系的方式并不完美。比如我的项目依赖了一个Django,但是导出的requirements.txt那么多:pipfreezeasgiref==3.5.0backports.zoneinfo==0.2.1Django==4.0.1sqlparse==0.4.2~/tmp?也就是,你安装依赖A,它恰好有B作为子依赖,而B又依赖于C。有时你使用pip安装一些包只是为了测试目的或为了一个小演示,那么这些依赖也会在点冻结列表。一段时间后,你在requirements.txt中看到的全是A,B,C,D,E,F,G,H,你不知道直接或间接安装了哪些依赖,所以更新甚至删除F现在变成了一个问题,您必须搜索才能知道F是作为子依赖项安装的。您最终会留下陈旧的依赖项并堆积垃圾,或者花费大量时间搜索和删除未使用的所有内容。如何解决这个问题呢?也就是使用pip-tools,具体方法如下:1.安装首先我们创建一个虚拟环境,然后使用pip来安装pip-tools:python3-mvenvvenvsourcevenv/bin/activatepipinstallpip-tools2.创建一个requirements.in文件现在,我们需要创建一个requirements.in文件,并且只包含项目的直接依赖项。每次要更新或包含依赖项时,都必须先修改requirements.in。它和requirements.txt的区别也很明显,就是只包含直接依赖的库,还可以指定版本:3.编译requirements.inpip-compilerequirements.in可以直接生成requirements.txt,但是你会发现这个需求。txt和pipfreeze生成的有很大区别,可以看到通过那个包引入了某个包,依赖关系一目了然:就这样,之前说的问题就不存在了,你有你的需要管理依赖关系的所有信息。4.附加功能此外,pip-tools还提供了其他有用的功能:1.升级包。以Django为例:pip-compile--upgrade-packagedjango这将自动更新你的requirements.txt文件,包括对依赖项的修改。2.同步包为了让virtualenv和当前的requirements.txt文件同步,可以简单的运行以下命令:pip-sync-arequirements.txt这个会先问,当你输入y的时候,会安装在虚拟环境,升级或卸载,最终符合requirements.txt文件中包含的包。有关pip-tools的更多详细信息,请参阅其文档[1]。