【问题标题】:What's the hash in packrat.lock for?packrat.lock 中的哈希值是什么?
【发布时间】:2018-08-23 08:55:21
【问题描述】:

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

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

【问题讨论】:

    标签: r git hash package-managers packrat


    【解决方案1】:

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

    该算法生成一个 md5sum,它基于包 tarball 中包含的 DESCRIPTION 文件,但还涉及其他逻辑,请参阅 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-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'))
    

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2013-07-27
      • 1970-01-01
      • 2011-12-27
      • 2013-03-24
      • 2013-08-26
      • 1970-01-01
      • 1970-01-01
      • 2012-12-19
      • 2015-01-02
      相关资源
      最近更新 更多