packrat.lock中的哈希是什么?

时间:2018-03-14 17:36:22

标签: r git hash package-managers packrat

我正在使用packrat为我的R项目设置一个git工作流程。每次我packrat::snapshot()我的工作区,文件packrat.lock都会随着新的包/版本等而改变,但它也会改变每个包的哈希行,这在检查文件差异时看起来有点烦人从一次提交到另一次提交。

这个哈希真的有必要吗?如果没有,有没有办法禁用它?

1 个答案:

答案 0 :(得分:0)

哈希由hash()库中的隐藏packrat函数生成,并且用作包一致性检查。

该算法基于包tarball中包含的md5sum文件生成一个DESCRIPTION,但涉及其他逻辑,请参见packrat/R/cache.R源中的lines #103-#107在Github。

为了获得packrat期望在packrat.lock文件中找到的HASH,必须直接调用hash()函数。此功能在已编译的程序包中不公开,因此访问它的唯一方法是使用packrat源。

  1. 从CRAN获取具有正确版本的packrat库源代码的副本
  2. 将其提取到文件夹中(在我的示例中为packrat-0.5.0
  3. 开始R会话

以下几行代码演示了如何为包BH-1.66.0-14cc8883584b955ed01f38f68bc03af6d)生成哈希:

# md5sum() function is neeeded
library(tools)

# relevant source code files are loaded
source('packrat-0.5.0/R/utils.R') # readDcf() function
source('packrat-0.5.0/R/cache.R') # packrat's hash() function

# execute the hash() function on the DESCRIPTION file in the package
print(hash('/usr/local/lib/R/site-library/BH/DESCRIPTION'))

这应该返回4cc8883584b955ed01f38f68bc03af6d的正确哈希值。

我不知道packrat中的任何允许您禁用HASH检查的选项。如果您的目标是手动修改packrat.lock文件以更改软件包版本,则可以通过执行此技巧来实现。

这可以帮助克服一些较小的依赖问题。但是,有两个危险:

  1. 这样的软件包版本更改可能会启动一系列的依赖关系升级要求
  2. 由于兼容性问题,错误出现在您的应用中