Systems
通过 Max-SMT 实现灵活且最优的依赖管理
Author
Venue
IEEE/ACM 国际软件工程会议 (ICSE),2023
Abstract
NPM 等包管理器已成为软件开发不可或缺的工具。NPM 仓库托管着超过 200 万个包,每周下载量超过 430 亿次。遗憾的是,NPM 的依赖项求解器存在若干缺陷。1) NPM 采用贪婪策略,往往无法安装依赖项的最新版本; 2) NPM 的算法会导致依赖重复和代码臃肿,这对需要最小化代码大小的 Web 应用程序尤其不利;3) NPM 的漏洞修复算法同样具有贪婪性,甚至可能引入新的漏洞;4) NPM 导致依赖重复的能力会破坏有状态框架,且需要大量工作来绕过这一问题。 尽管现有工具试图解决这些问题,但它们要么稳定性差,要么依赖于对依赖树的事后修改,要么无法保证最优性,要么缺乏可组合性。我们提出 Pacsolve,这是一个用于依赖解决的统一框架和实现,支持自定义约束和优化目标。我们利用 Pacsolve 构建了 Maxnpm——一个可直接替代 NPM 的完整解决方案,它使开发者在安装依赖项时能够结合多种目标。 我们通过 NPM 生态系统中大量包样本对 Maxnpm 进行了评估,结果表明它能够:1) 在 33% 的案例中比 NPM 的审计工具减少更多依赖项中的漏洞;2) 在 14% 的案例中选择比 NPM 更新版本的依赖项;3) 在 21% 的案例中选择比 NPM 更少的依赖项。我们的所有代码和数据均已开源并可供获取。
