5

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

这个Hash真的有必要吗?如果没有,有什么办法可以禁用它?

4

1 回答 1

0

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

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

为了获得packrat期望在packrat.lock文件中找到的 HASH,必须直接调用该hash()函数。这个函数没有暴露在编译包中,所以访问它的唯一方法是使用packrat源代码。

  1. packrat从 CRAN获取具有正确版本的库源的副本
  2. 将其提取到一个文件夹中(在我的示例中是packrat-0.5.0
  3. 启动 R 会话

以下几行演示了如何为包BH-1.66.0-1( 4cc8883584b955ed01f38f68bc03af6d) 生成哈希:

# 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'))

这应该返回正确的 HASH 4cc8883584b955ed01f38f68bc03af6d

我不知道有任何选项packrat可以让您禁用 HASH 检查。如果您的目标是手动修改packrat.lock文件以更改软件包版本,那么执行此技巧当然是可能的。

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

  1. 这样的包版本更改可能会引发一连串的依赖升级要求
  2. 由于兼容性问题,您的应用中出现错误
于 2020-07-07T19:59:59.150 回答