packrat.lock中的哈希值是用来做什么的?

5

我正在使用packrat为我的R项目设置git工作流。每次我使用packrat::snapshot()来快照我的工作区时,文件packrat.lock会随着新的包/版本等内容而改变,但它还会更改每个包的Hash行,在检查文件差异以查看从一个提交到另一个提交有哪些变化时,这有点麻烦。

这个Hash真的有必要吗?如果不是,有没有办法禁用它?

1个回答

0

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

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

为了获取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中是否有任何选项可以禁用哈希检查。如果您的目标是手动修改packrat.lock文件以更改软件包版本,则可以通过执行此技巧来实现。

这可能有助于克服一些较小的依赖关系问题。但是,存在两个危险:

  1. 这样的软件包版本更改可能会引起依赖关系升级要求的级联
  2. 由于兼容性问题,您的应用程序出现错误

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接